🌟 一、Geolocation API是什么?
Geolocation API是现代浏览器提供的一套标准接口,它允许Web应用在获得用户明确许可后访问设备的地理位置信息。这个API的设计哲学是隐私优先------浏览器会主动向用户请求位置权限,用户有权随时拒绝或撤销授权。
简单来说,Geolocation API就是浏览器提供的一个"问路"工具。它能让你的网页向用户的设备(比如手机、电脑)礼貌地询问:"嘿,你现在在哪儿?" 设备会通过GPS、Wi-Fi信号或者移动网络基站,计算出用户的大致位置,然后告诉你一个经纬度坐标。
💡 核心要点 :Geolocation API只能在安全上下文 (Secure Context)中工作,即HTTPS协议 或
http://localhost。在生产环境中,HTTP协议将导致API静默失效。
📦 二、Geolocation API的基础使用
2.1 检测浏览器兼容性
在调用任何API之前,首先检查浏览器是否支持Geolocation功能:
javascript
javascript
// 检测浏览器是否支持Geolocation API
if ("geolocation" in navigator) {
console.log("✅ 浏览器支持地理定位功能");
// 这里可以放心地使用定位功能
} else {
console.log("❌ 您的浏览器不支持地理定位功能");
alert("为了获得更好的服务,请升级到最新版本的Chrome、Firefox或Edge浏览器,或手动选择您的位置。");
}
这个检查是必须的。虽然现在绝大多数现代浏览器(Chrome、Firefox、Safari、Edge)都支持得很好,但保不齐有用户还在用着老古董。
2.2 getCurrentPosition:获取单次位置
getCurrentPosition() 是获取用户当前位置的核心方法,它接收三个参数:
javascript
javascript
navigator.geolocation.getCurrentPosition(
(position) => {
// 成功时的回调函数
console.log("获取位置成功");
},
(error) => {
// 失败时的回调函数
console.error("获取位置失败", error);
},
{
// 可选配置参数
enableHighAccuracy: true, // 是否启用高精度模式
timeout: 10000, // 超时时间(毫秒)
maximumAge: 60000 // 位置缓存有效期(毫秒)
}
);
2.3 获取经纬度数据
在成功回调中,真正的坐标数据藏在 position.coords 对象中,这是初学者最常踩的坑:
javascript
javascript
navigator.geolocation.getCurrentPosition(
(position) => {
// ✅ 正确写法:position.coords.latitude/longitude
const latitude = position.coords.latitude; // 纬度
const longitude = position.coords.longitude; // 经度
const accuracy = position.coords.accuracy; // 精度(米)
console.log(`当前位置:经度${longitude},纬度${latitude},精度${accuracy}米`);
},
(error) => {
// ❌ 错误写法:position.latitude 会返回 undefined
console.error("定位失败", error);
}
);
position.coords 对象除了经纬度之外,还包含丰富的信息:
-
accuracy:精度(米) -
altitude:海拔高度(如果可用) -
altitudeAccuracy:海拔精度 -
heading:移动方向(度) -
speed:移动速度(米/秒) -
timestamp:位置获取的时间戳
🔄 三、watchPosition:实时追踪位置变化
如果你需要实时追踪用户的位置变化(如导航、运动轨迹记录),请使用 watchPosition() 方法:
javascript
javascript
let watchId = null;
function startLocationTracking() {
// 开始监听位置变化
watchId = navigator.geolocation.watchPosition(
(position) => {
const { latitude, longitude, accuracy } = position.coords;
console.log(`位置更新:(${longitude}, ${latitude}),精度:${accuracy}米`);
// 在这里更新地图标记或记录轨迹
updateMapMarker(latitude, longitude);
},
(error) => {
console.error("位置监听出错", error);
},
{
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0 // 不使用缓存,始终获取新位置
}
);
}
function stopLocationTracking() {
if (watchId !== null) {
// 停止监听,释放资源
navigator.geolocation.clearWatch(watchId);
watchId = null;
console.log("已停止位置追踪");
}
}
⚠️ 注意事项:
-
watchPosition()返回一个整数ID,不能 使用await -
GPS信号漂移可能导致回调每秒触发多次,需要做节流处理
-
务必在不需要时调用
clearWatch()清除监听,否则可能导致内存泄漏和后台耗电
⚙️ 四、位置配置选项详解
| 参数 | 作用 | 推荐值 | 说明 |
|---|---|---|---|
enableHighAccuracy |
是否启用高精度GPS | 业务需要精确位置时设为 true |
开启GPS会增加功耗和延迟,但能大幅提升精度 |
timeout |
定位超时时间(毫秒) | 10000 |
避免因等待GPS信号而无限卡死 |
maximumAge |
位置缓存有效期(毫秒) | 60000 |
复用1分钟内的高精度结果,降低重复定位开销 |
配置选择策略
javascript
javascript
// 场景1:外卖/打车场景------需要精确位置
const preciseOptions = {
enableHighAccuracy: true, // 必须用GPS
timeout: 15000,
maximumAge: 0 // 不用缓存
};
// 场景2:天气预报场景------粗略位置即可
const roughOptions = {
enableHighAccuracy: false, // 只用Wi-Fi/基站定位
timeout: 5000,
maximumAge: 300000 // 5分钟内复用位置
};
// 场景3:实时导航场景------持续精确追踪
const trackingOptions = {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0 // 始终获取最新位置
};