个人工作经验分享

高德地图底图坐标转换

2026-09-14 · 技术笔记

背景

国内地图服务由于政策原因,使用了不同的坐标系。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。

申请与配置

  1. 访问高德开放平台(lbs.amap.com)注册账号
  2. 创建应用,选择"Web 服务"类型
  3. 获取 KEY,配置到项目中

KEY 的安全处理

⚠️ API KEY 不应硬编码在前端代码中,否则会被他人盗用。 常见的做法:

请求示例(KEY 已脱敏)

GET https://restapi.amap.com/v3/geocode/regeo
    ?key=YOUR_AMAP_KEY
    &location=120.6545,31.2860
    &extensions=all

返回结果包含省市区、街道、POI 等信息,可以拼接成人类可读的地址。

注意事项

参考资料