开发者 | WGS84、GCJ-02、BD-09都是什么鬼?

前言

  • 开发地图应用服务时,一定会接触到各种坐标系,而保证坐标系的正确与合理是一切数据分析的前提。
  • 这篇文章就梳理了一些常见的地理坐标系,希望能帮上忙。

1、地理坐标系与投影坐标系

总的来说,坐标系可以分为两大类:地理坐标系(Geographic Coordinate System, GCS)和投影坐标系(Projected Coordinate System, PCS),地理坐标系进行地图投影后就变成了投影坐标系。例如我们常见的世界地图,使用的就是一种 墨卡托投影。

开发者 | WGS84、GCJ-02、BD-09都是什么鬼?_第1张图片
墨卡托投影下的世界地图

其中地理坐标系又可分为 参心坐标系 和 地心坐标系,常见的参心坐标系北京54、西安80,常见的地心坐标系有WGS84、GCJ-02、BD-09、GCS2000,这篇文章的侧重点是地心坐标系,其他内容不再赘述,有兴趣可以参考相关文章:

  • GIS基础教程之坐标系 —— 天涯印象
  • 干货分享|破解ArcGIS坐标系之惑: 从基本概念到常用操作 —— 李郎平
开发者 | WGS84、GCJ-02、BD-09都是什么鬼?_第2张图片
坐标系分类

2、地心坐标系

2.1 WGS84(World Geodetic System 1984)

WGS84是为 GPS 全球定位系统建立的坐标系统,是世界上第一个统一的地心坐标系,因此也被称为大地坐标系原始坐标系。一般通过GPS记录仪记录下来的经纬度,就是基于WGS84坐标系的数据。

2.2 GCJ-02(国家测量局02号标准)

GCJ-02 是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统,是在WGS84经纬度的基础上执行加密算法而成。因为GPS得到的经纬度直接在 GCJ-02 坐标系下会定位到错误的地点,有种到了火星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系

国测局规定,国内出版的各种地图系统(包括电子形式),必须至少采用 GCJ-02 对地理位置进行首次加密的坐标系,高德和Google在国内都是使用 GCJ-02 坐标系,而百度使用的是在 GCJ-02 基础上再一次加密的 BD-09 坐标系。

举个例子,北京天安门中心的GPS经纬度是39°54'26.2"N,116°23'28.4"E,转化为度的单位就是39.907270, 116.391213(提示:小数部分 = 分 / 60 + 秒 / 3600),我们在谷歌地图(或高德地图)里定位到这个经纬度看看:

开发者 | WGS84、GCJ-02、BD-09都是什么鬼?_第3张图片
谷歌地图定位到天安门 GPS 坐标

可以明显观察到偏移,现在我们将 GPS 坐标转换为 GCJ-02 坐标:116.397454,39.908671,再定位一次:

开发者 | WGS84、GCJ-02、BD-09都是什么鬼?_第4张图片
谷歌地图定位到天安门的 GCJ-02坐标

需要注意的是,如果切换到谷歌地图的卫星地图模式,它使用的是WGS84坐标系哦,此时使用天门门的 GPS 坐标可以定位到正确位置,如下所示:

谷歌卫星地图定位到天安门的 GPS 坐标

主流地图在各个地区使用的坐标系(数据出处:百度、高德)

地图 大陆/港/澳 台湾省 海外
高德 GCJ-02 WGS84 WGS84
Google GCJ-02 WGS84 WGS84
百度 BD-09 / GCJ-02 BD-09 / GCJ-02 WGS84

3、坐标系转换

国测局规定:互联网地图在国内必须至少使用 GCJ02 进行首次加密,不允许直接使用 WGS84 坐标下的地理数据,同时任何坐标系均不可转换为 WGS84 坐标。因此不存在将 GCJ-02 坐标转换为 WGS84 坐标的官方转换方法。

3.1 转换为高德坐标

  • Web服务API
  • Android SDK
  • IOS SDK
  • JS API

3.2 转换为百度坐标

  • Web服务API
  • Android SDK
  • IOS SDK
  • JS API

3.3 非官方转换方法

因为 高德和百度 SDK 没有提供从 GCJ-02 坐标转换为 WGS84 的方法,或者你不希望集成 SDK 来转换坐标系,可以参考这篇文章。


相关资源

  • 高德开放平台、 百度地图开放平台、谷歌地图开放平台
  • 高德坐标拾取、百度坐标拾取、谷歌坐标拾取、在线坐标转换
  • 国家基础地理信息中心、中测网

推荐阅读

  • 开发者 | 几个提高远程办公效率的小建议
  • 开发者 | 那些令人“奔溃”的 UI 验收
  • Dart | 彻底理解Dart中的库与访问可见性
  • Android | 代码压缩、优化与混淆 — ProGuard与R8
  • Android | 自定义属性
  • Android | InputManagerService 与输入事件采集
  • 工具集 | Android Studio — 使用 Live Template 输入模板代码
  • 自媒体 | 使用LaTeX编写数学公式

2020 永远不要放弃希望,祝愿大家都能够平安健康!武汉加油!

你可能感兴趣的:(开发者 | WGS84、GCJ-02、BD-09都是什么鬼?)