跳到主要内容

地图标系

· 阅读需 3 分钟
Quany
软件工程师

在地图开发中,坐标系是核心概念。不同地图服务使用不同标准,混用会导致位置偏移。

一、主流坐标系统

1. WGS84(国际标准)

  • 全称:World Geodetic System 1984
  • 特点:GPS 设备获取的原始坐标,国际通用
  • 使用方:Google Maps(境外)、OpenStreetMap、Apple Maps
  • 格式{lat: 39.9042, lng: 116.4074}

2. GCJ-02(火星坐标系)

  • 别名:国测局坐标系
  • 特点:中国官方加密坐标,WGS84 基础上经非线性偏移
  • 使用方:高德地图、腾讯地图、Google Maps(境内)
  • 来源:中国法律规定所有地图必须加密

3. BD-09(百度坐标系)

  • 特点:在 GCJ-02 基础上再次加密
  • 使用方:百度地图
  • 偏移:与 WGS84 偏差可达 500 米

二、坐标系转换公式

JavaScript 实现

// WGS84 → GCJ-02
function wgs84ToGcj02(lng, lat) {
// 复杂非线性转换,实际项目中建议使用成熟库
const pi = 3.141592653589793;
const a = 6378245.0;
const ee = 0.00669342162296594323;
// ... 具体算法实现
}

// GCJ-02 → BD-09
function gcj02ToBd09(lng, lat) {
const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * Math.PI);
const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * Math.PI);
return {
lng: z * Math.cos(theta) + 0.0065,
lat: z * Math.sin(theta) + 0.006
};
}

推荐库

  • coord-convertnpm install coord-convert
  • gcoordnpm install gcoord(支持多种坐标系)
import { wgs84togcj02, gcj02tobd09 } from 'coord-convert';

const [gcjLng, gcjLat] = wgs84togcj02(116.4074, 39.9042);
const [bdLng, bdLat] = gcj02tobd09(gcjLng, gcjLat);

三、开发实践

1. Google Maps 使用场景

// 直接使用 WGS84 坐标
const position = { lat: 39.9042, lng: 116.4074 }; // 正确

// 如果数据来自高德/腾讯,需先转换
import { gcj02towgs84 } from 'coord-convert';
const wgsPosition = gcj02towgs84(gcjLng, gcjLat);

2. 国内地图服务

// 高德地图 API:使用 GCJ-02
const position = [116.4074, 39.9042]; // 直接传入GCJ-02

// 百度地图 API:使用 BD-09
const point = new BMap.Point(116.404, 39.915); // BD-09坐标

3. 常见错误

// ❌ 错误:将 GCJ-02 坐标用于 Google Maps
// 结果:位置偏移几百米
<Map center={{lat: 39.9042, lng: 116.4074}} /> // 如果这是GCJ-02坐标就会错

// ✅ 正确:确保是 WGS84
const wgs84Coordinate = convertFromGcj02ToWgs84(gcjCoordinate);

四、坐标系检测

如何判断数据坐标系?

function detectCoordinateSystem(lng, lat) {
// 在中国境内
if (lng > 73 && lng < 135 && lat > 18 && lat < 54) {
// 如果与真实位置偏差 < 10m,很可能是 WGS84
// 如果偏差 100-500m,可能是 GCJ-02
// 如果偏差 > 500m,可能是 BD-09
}
}

五、总结

地图服务使用坐标系是否需要转换
Google Maps(全球)WGS84直接适配
Google Maps(中国)GCJ-02需 WGS84→GCJ-02
高德/腾讯地图GCJ-02需 WGS84→GCJ-02
百度地图BD-09需 WGS84→GCJ-02→BD-09
OpenStreetMapWGS84直接适配

核心建议:保存数据时使用 WGS84,使用时根据目标平台动态转换。

微信公众号

微信公众号