跳到主要内容

获取当前地理位置

使用 getCurrentPosition 方法可以取得用户当前的地理位置信息。

void getCurrentPosition(onSuccess, onError, options);
  • 第 1 个参数为获取当前地理位置信息成功时所执行的回调函数
  • 第 2 个参数为获取当前地理位置信息失败时所执行的回调函数
  • 第 3 个参数为一些可选属性的列表
  • 其中 ,第 2 、 3 个参数为可选属性

当浏览器成功获取到用户的位置信息时, getCurrentPosition 的第一个函数类型的参数将被调用,将对应的 position 对象传入到调用的函数中,这个对象中包含了浏览器返回的具体数据,这非常重要。

其中, position 对象包含了用户的地理位置信息,该对象的 coords 子对象包含了用户所在的纬度和经度信息,通过 position.coords.latitude 可以访问纬度信息, position.coords.longitude 可访问经度信息,用户的位置信息越精确,这两个数字后面的小数点越长。此外,在 Firefox 中, position 对象下还附带有另一个 address 对象,这个对象包含这个经纬度下的国家名,城市名甚至街道名 。

第 1 个参数

getCurrentPosition 方法中的第 1 个参数为获取当前地理位置信息成功时所执行的回调函数。

navigator.geolocation.getCurrentPosition(function (position) {
//获取成功时的处理
});

在获取地理位置信息成功时执行的回调函数中,用到了一个参数 position ,它代表一个 position 对象,我们将在后面小节中对这个对象进行具体介绍。

第 2 个参数

getCurrentPosition 方法中的第 2 个参数为获取当前地理位置信息失败时所执行的回调函数。如果获取地理位置信息失败,可以通过该回调函数把错误信息提示给用户。当在浏览器中打开使用了 Geolocation API 来获得用户当前位置信息的页面时,浏览器会询问用户是否共享位置信息。如果在该画面中拒绝共享的话,也会发生错误。

该回调函数使用一个 error 对象作为参数,该对象具有以下两个属性。

code 属性

code 属性包含 3 个值,简单说明如下:

  • 当属性值为 1 时,表示用户拒绝了位置服务
  • 当属性值为 2 时,表示获取不到位置信息
  • 当属性值为 3 时,表示获取信息超时错误

message 属性

getCurrentPosition 方法中使用第二个参数捕获错误信息的具体使用方法如下所示。

navigator.geolocation.getCurrentPosition(
function (position) {
var cords = position.coords;
showMap(coords.latitude, coords.longitude, coords.accuracy);
},
//捕获错误信息
function (error) {
var errorTypes = {
1: `位置服务被拒绝`,
2: `获取不到位置信息`,
3: `获取信息超时`,
};
alert(errorTypes[error.code] + ':, 不能确定当前地理位置 ');
},
);

第 3 个参数

getCurrentPosition 方法中的第三个参数可以省略,它是一些可选属性的列表,这些可选属性说明如下。

  • enableHighAccuracy 是否要求高精度的地理位置信息,这个参数在很多设备上设置了都不起作用,因为在设备上使用时需要结合设备电量、具体地理情况来综合考虑。因此,多数情况下把该属性设为默认,由设备自身来调整。
  • timeout 对地理位置信息的获取操作做一个超时限制(单位为毫秒 ) 。如果在该时间内未获取到地理位置信息,则返回错误。
  • maximumAge 对地理位置信息进行缓存的有效时间的单位为毫秒。例如, maximumAge : 120000 ( 1 分钟是 60000 毫秒),如果 10 点整的时候获取过一次地理位置信息, 10:01 的时候,再次调用 navigator.geolocation.getCurrentPosition 重新获取地理位置信息,则返回的依然是 10:00 时间的数据(因为设置的缓冲数据为 2 分钟)。超过这个时间,缓存将会被遗弃,并尝试获取新的定位。如果指定为 0 , 则无条件重新获取新的地理位置。
navigator.geolocation.getCurrentPosition(
function (position) {
// 获取地理定位信息成功时
},
function (error) {
// 获取地理位置失败
},
{
maximumAge: 60 * 1000 * 2, // 缓存时间 timeout: 5000
// 超时设置
},
);

监视位置信息

使用 watchPosition 方法可以持续获取用户的当前地理位置信息,它会定期地自动获取。

int watchCurrentPosition ( onSuccess , onError , options )

该方法参数的说明和使用与 getCurrentPosition 方法相同。调用该方法后会返回一个数字,这个数字的用法与 JavaScript 脚本中 setInterval 方法的返回值用法类似,可以被 clearWatch 方法使用,以停止对当前地理位置信息的监视。

停止获取位置信息

用 clearWatch 方法可以停止对当前用户的地理位置信息的监视。具体用法如下所示。

void clearWatch(watchId);

参数 watchId 为调用 watchCurrentPosition 方法监视地理位置信息时的返回参数。

隐私保护

HTML5 Geolocation 规范提供了一套保护用户隐私的机制。除非得到用户明确许可,否则不可获取位置信息。具体设置步骤如下:

  • 用户从浏览器中打开位置感知应用程序
  • 应用程序 Web 页面加载,然后通过 Geolocation 函数调用请求位置坐标。浏览器拦截这一请求,然后请求用户授权
  • 如果用户同意,浏览器从其宿主设备中检索坐标信息,如 IP 地址、 Wi-Fi 或 GPS 坐标,这是浏览器的内部功能
  • 浏览器将坐标发送给受信任的外部定位服务,它返回一个详细位置信息,并将该位置信息发回给 HTML5 Geolocation 应用程序

提示,应用程序不能直接访问设备,它只能请求浏览器来代表它访问设备。

访问使用 HTML5 Geolocation API 的页面时,会触发隐私保护机制。如果仅仅是添加 HTML5 Geolocation 代码,而不被任何方法调用,则不会触发隐私保护机制。只要所添加的 HTML5 Geolocation 代码被执行,浏览器就会提示用户应用程序要共享位置。执行 HTML5 Geolocation 的方式很多,例如,可以调用 navigator.geolocation.getCurrentPosition 方法等。

除了询问用户是否允许共享其位置之外, Firefox 等一些浏览器还可以让用户选择记住该网站的位置服务权限,以便下次访问的时候不再弹出提示框,类似于在浏览器中记住某些网站的密码。