accuracy > 100米时基本不可信,尤其>1000米大概率是ip定位;需结合enablehighaccuracy、https、系统设置判断精度;wgs-84坐标须转换为gcj-02或bd-09才能用于国内地图。

accuracy > 100 米时基本不可信,尤其 > 1000 米大概率是 IP 定位
HTML5 的 navigator.geolocation.getCurrentPosition() 返回的 position.coords.accuracy 是判断结果是否可用的唯一硬指标。它不是“误差范围”,而是设备声称的“95% 置信半径”(单位:米)。实测中:accuracy ≤ 20 基本可认定为 GPS 直出;20 多为 GPS+Wi-Fi 辅助定位,城市室外勉强可用;一旦 <code>accuracy > 100,尤其反复出现 accuracy === 1000 或更高,基本可断定浏览器退化到了纯 IP 定位——此时坐标可能偏移几公里,完全不能用于地图标记或地理围栏。
常见错误现象包括:用户在户外打开页面,却定位到隔壁城市;同一设备、同一位置,Chrome 返回 35 米,UC 浏览器返回 1280 米;HTTPS 页面正常,HTTP 页面始终返回 1000+ 精度。
- 务必在 success 回调里加精度判断,而不是无条件渲染
- 国产安卓浏览器(如 QQ、UC)常直接返回缓存坐标或伪造
accuracy,无法信任 - 非 HTTPS 环境下,Chrome 和 Safari 会强制降级为粗略定位(即使设备开了高精度)
enableHighAccuracy: true 不是万能开关,但不开它几乎注定不准
enableHighAccuracy: true 是向系统申请使用 GPS 模块的明确信号,但它不保证成功——系统是否响应、硬件是否支持、省电策略是否拦截,都由底层控制。iOS 在后台或低电量模式下会自动忽略该参数;部分 Android 厂商定制 ROM(如 MIUI、EMUI)默认关闭 GPS 权限,即使你传了 true,实际仍只用基站+WIFI。
使用场景很明确:只要你的业务依赖真实地理位置(比如签到、附近商家、轨迹记录),就必须设为 true;若只是粗略判断“用户在国内还是海外”,可设为 false 节省电量和等待时间。
立即学习“前端免费学习笔记(深入)”;
- 开启后首次定位耗时明显增加(常需 5–15 秒),需配合 loading 提示
- Android 设备需同时在系统设置中打开「位置信息」→「高精确度模式」(GPS+Wi-Fi+移动网络)
- iOS 用户需在「设置 → 隐私与安全性 → 定位服务」中,将你的网站设为「始终允许」而非「仅在使用期间」
getCurrentPosition() 和 watchPosition() 的 timeout / maximumAge 组合决定体验底线
timeout 和 maximumAge 不是可有可无的配置项,它们直接决定用户是否看到“白屏卡顿”或“旧坐标闪现”。例如:timeout: 5000 + maximumAge: 0 表示“宁可失败也不用缓存”,适合强实时场景;而 timeout: 10000 + maximumAge: 60000 则允许复用 1 分钟内已有的高精度结果,大幅降低重复定位开销。
性能影响显著:连续调用 getCurrentPosition() 却不设 maximumAge,每次都会触发全新定位流程,耗电快、延迟高;反之,若 maximumAge 设得过大(如 300000),用户走到新地点后仍显示旧坐标,体验更差。
- 车载/步行类应用建议用
watchPosition()+ 中位数滤波,而非多次getCurrentPosition() -
maximumAge对 accuracy 无提升作用,它只影响“是否复用”,不改变原始精度 - 某些浏览器(如 Firefox)对
maximumAge支持不稳定,建议搭配时间戳position.timestamp做二次校验
WGS-84 坐标直接喂给百度/高德地图?偏差几百米就是这么来的
HTML5 返回的经纬度永远是 WGS-84 坐标系,这是全球通用标准。但国内主流地图 SDK(百度、高德、腾讯)默认使用 GCJ-02(火星坐标系)或 BD-09(百度加密坐标系)。如果你把原生 position.coords.latitude 和 position.coords.longitude 直接传给 AMap.Marker 或 BMap.Point,地图上标记点就会整体偏移 200–500 米——这不是定位不准,是坐标系错配。
解决方法只有两个:要么调用地图 SDK 自带的坐标转换接口(如高德的 AMap.convertFrom()),要么在服务端做批量纠偏(推荐)。前端 JS 转换库(如 gcoord)虽可用,但存在精度损失和维护风险。
- 百度地图必须用
BD-09,WGS-84 → BD-09 需经两次转换(WGS-84 → GCJ-02 → BD-09) - 高德和腾讯地图接受 WGS-84,但需显式声明
coordType: 'gps'参数,否则默认按 GCJ-02 解析 - Google Maps 可直接使用 WGS-84,无需转换
真正麻烦的从来不是“怎么拿到坐标”,而是“拿到之后怎么确认它真有用”。精度值、协议环境、坐标系、浏览器实现差异——四个变量两两组合,就能产生十几种失效路径。别迷信 enableHighAccuracy: true,也别跳过 accuracy 判断,更别忘了 WGS-84 和 GCJ-02 之间那道看不见的墙。











