高德地图底图坐标转换
背景
国内地图服务由于政策原因,使用了不同的坐标系。GPS 设备采集的是 WGS84, 而高德、腾讯地图使用 GCJ02(火星坐标),百度地图使用 BD09。 在做车辆监控系统时,需要把设备的 WGS84 坐标转换为对应底图的坐标系。
坐标系基础
| 坐标系 | 用途 | 特点 |
|---|---|---|
| WGS84 | GPS 原始坐标 | 国际标准 |
| GCJ02 | 高德、腾讯地图 | 中国国测局加密 |
| BD09 | 百度地图 | 在 GCJ02 上再次加密 |
转换原理
WGS84 到 GCJ02 使用公开的加密算法(国测局标准),核心是偏移量的计算。 GCJ02 到 BD09 则是在此基础上再做一次偏移。
// WGS84 → GCJ02 核心参数
const PI = 3.1415926535897932384626;
const A = 6378245.0; // 长半轴
const EE = 0.00669342162296594323; // 偏心率平方
function wgs84ToGcj02(lng, lat) {
// 判断是否在中国境外
if (outOfChina(lng, lat)) return { lng, lat };
let dLat = transformLat(lng - 105.0, lat - 35.0);
let dLng = transformLon(lng - 105.0, lat - 35.0);
const radLat = lat / 180.0 * PI;
let magic = Math.sin(radLat);
magic = 1 - EE * magic * magic;
const sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI);
dLng = (dLng * 180.0) / (A / sqrtMagic * Math.cos(radLat) * PI);
return {
lng: lng + dLng,
lat: lat + dLat
};
}
逆地理编码实践
在展示车辆位置时,除了坐标本身,还需要显示地址。这时通常会调用 地图服务商的逆地理编码 API。以高德为例,需要申请 KEY。
申请与配置
- 访问高德开放平台(lbs.amap.com)注册账号
- 创建应用,选择"Web 服务"类型
- 获取 KEY,配置到项目中
KEY 的安全处理
⚠️ API KEY 不应硬编码在前端代码中,否则会被他人盗用。 常见的做法:
- 通过后端代理调用,前端只访问自己的后端接口
- 使用环境变量 / 配置文件存储,不提交到代码仓库
- 在平台上设置 IP 白名单或域名白名单
- 定期轮换 KEY
请求示例(KEY 已脱敏)
GET https://restapi.amap.com/v3/geocode/regeo
?key=YOUR_AMAP_KEY
&location=120.6545,31.2860
&extensions=all
返回结果包含省市区、街道、POI 等信息,可以拼接成人类可读的地址。
注意事项
- 不同地图服务商的坐标系不同,转换时需明确源和目标
- 逆地理编码 API 有配额限制,建议加缓存
- KEY 务必保密,避免因盗用导致的账单问题
- 批量转换坐标时,注意请求频率,避免触发限流