GIS 坐标系避坑指南:WGS84、GCJ02、BD09 到底怎么选?

本文最后更新于:2026年2月12日 凌晨

GIS 坐标系避坑指南

做过地图开发的同学肯定都被“坐标偏移”坑过。明明经纬度是对的,放到地图上一看,位置直接漂移了几百米甚至上公里。这不是代码写错了,而是因为国内地图有自己的一套“玩法”。

1. 为什么会有偏移?

简单来说,就是国家为了安全,要求国内所有地图必须经过一层“加密”处理。这种加密是非线性的,所以你不能简单加减一个数来修正。

目前国内主要有三套坐标系:

WGS84(地球坐标)

  • 来源:GPS 设备的原始坐标、国际标准。
  • 场景:谷歌地图国际版、OpenStreetMap。
  • 注意:在国内直接用这套坐标,位置肯定会偏。

GCJ-02(火星坐标)

  • 来源:国家测绘局制定的标准。
  • 场景:高德、腾讯、谷歌中国地图。
  • 外号:因为位置偏得莫名其妙,开发者戏称它为“火星坐标”。

BD-09(百度坐标)

  • 场景:只有百度地图在用。
  • 注意:它是在火星坐标的基础上又加密了一层,偏移最大。

2. 它们之间偏了多少?

以北京天安门为例,三套坐标系的肉眼感官差异:

  • WGS84:标准点。
  • GCJ-02:偏离约 500 米。
  • BD-09:偏离约 1000 米。

如果你把 GPS 采集的 WGS84 坐标直接扔到百度地图上,你会发现自己可能在隔壁街。

3. 实战:怎么进行转换?

在开发中,最推荐的方案是使用开源库 coordtransform

安装

1
npm install coordtransform

常用转换代码

1
2
3
4
5
6
7
8
9
10
const coordtransform = require('coordtransform');

// GPS 转 高德/腾讯 (WGS84 -> GCJ02)
const gcj02 = coordtransform.wgs84togcj02(116.397, 39.909);

// 高德/腾讯 转 百度 (GCJ02 -> BD09)
const bd09 = coordtransform.gcj02tobd09(116.404, 39.915);

// 百度 转 高德/腾讯 (BD09 -> GCJ02)
const back = coordtransform.bd09togcj02(116.410, 39.921);

4. 几个重要的避坑建议

  1. 统一存储格式:数据库里建议统一存 WGS84。它是最原始的数据,转换到任何平台都方便。
  2. 看准底图:底图是用谁家的,数据就得转成谁家的坐标系。高德配 GCJ02,百度配 BD09,别混着用。
  3. 不要手动纠偏:加密算法很复杂,别想着用 lat + 0.001 这种方式解决,不同地区的偏移量是不一样的。
  4. 定位 SDK 注意:iOS 原生定位给的是 WGS84,但如果你用高德定位 SDK,它可能直接给你 GCJ02。一定要看文档!

GIS 坐标系避坑指南:WGS84、GCJ02、BD09 到底怎么选?
http://bestkele.com/2022/03/18/concept/gis/
作者
kele
发布于
2022年3月18日
许可协议