坐标系基础
为什么会有这么多坐标系
在中国做地图相关的开发,绕不开坐标系的问题。同一个位置, 在不同地图上显示会出现几百米的偏差,原因就在于它们使用了不同的坐标系。
三种坐标系对比
| 名称 | 全称 | 应用 | 加密 |
|---|---|---|---|
| WGS84 | World Geodetic System 1984 | GPS、国际标准 | 无 |
| GCJ02 | 国测局坐标系 | 高德、腾讯、Google 中国 | 一次加密 |
| BD09 | 百度坐标系 | 百度地图 | 二次加密 |
偏差有多大
在中国大陆范围内,WGS84 和 GCJ02 之间的偏差大约在 50~500 米之间, 具体大小与地理位置有关。GCJ02 和 BD09 之间的偏差大约 100~700 米。
这个偏差在市区可能只是一两条街的距离,在野外则可能完全偏出道路。 所以做地图应用时,坐标系转换是必须要处理的问题。
常见转换路径
- GPS 设备 → WGS84
- 高德/腾讯地图底图 → GCJ02
- 百度地图底图 → BD09
- Google 地图(国际版) → WGS84
- Google 地图(中国版) → GCJ02
工程实践建议
1. 明确数据源
首先要搞清楚输入数据是什么坐标系。国内很多 GPS 设备默认输出 WGS84, 但也有一些设备已经内置了偏移。数据源搞错了,后面转换都是白搭。
2. 尽量在后端转换
前端转换虽然可行,但有性能和安全上的问题:
- 前端转换需要把算法暴露给用户
- 调用第三方 API 会暴露 KEY
- 批量转换时前端压力大
推荐做法:后端统一存储 WGS84,展示时按底图类型转换一次。
3. 缓存转换结果
对于固定点位(如围栏、站点),转换结果可以缓存,避免重复计算。
4. 注意境外坐标
GCJ02 加密算法只对中国境内坐标有效。中国境外的坐标不需要转换,
直接使用原坐标即可。判断逻辑一般是经纬度是否在
73°E~135°E, 3°N~54°N 范围内。
开源工具
coordtransform- JavaScript 库,支持 WGS84/GCJ02/BD09 互转gcoord- 另一个 JS 库,API 更友好eviltransform- 多语言实现(Python、Go、JS 等)