对国内地图坐标系统的一些观察

陪她去流浪 桃子 阅读次数:61

为什么有此观察

本网站支持为每篇文章设置定位,就像微信朋友圈一样,主要是为了记录发表文章时的位置(默认不对外显示)。定位包含一个经纬度和一个对应的解析名,经纬度来自照片的 EXIF 信息(或来自浏览器)。

ChatGPT 斩钉截铁地告诉我说 EXIF1 中的 GPS 字段一定是存储的原始 GPS 坐标,直接来源于 GPS 硬件,没有经过任何修正。但是当我用代码直接打开此坐标时2,发现位置存在偏移。多次测试发现,偏移距离在 100~1000 米范围内。

GCJ-02 坐标

了解到中国对大陆境内的坐标做了转换,出于没人知道的“安全”以及“保密”、“合规”考虑。原始的 GPS 坐标使用的是 WGS-843(世界大地测量系统,World Geodetic System,1984 年);而中国大陆使用的是 GCJ-024(国测局 2002 年),俗称火星坐标系。

我纳闷的点在于:

  1. GCJ-02 几乎是通过纯算法5从 WGS-84 转换来的,不是一套新的测量系统。理论上可以相互转换,只是隐藏了转换算法。而且偏移就方圆几百米,意义很大吗?
  2. 所有的 GPS 芯片(便宜到几块钱)(含手机相机相片)报告的地理位置都是原始准确的 GPS 坐标,“保密”/“安全”了个啥?对着你的建筑拍一张发过去都能得到精确位置。
  3. 从卫星上还是能看到所有建筑啊,转换坐标又不能移动建筑。

另:转换 GCJ-02 到 WGS-84 是违法行为。

常用地图软件对坐标的支持情况

苹果地图、百度地图、高德地图默认均使用 GCJ-02 坐标。如果直接把 EXIF 中的坐标(WGS-84)用于显示,会偏移几百米。需要把 WGS-84 转换成 GCJ-02 再传参方可正确显示。

谷歌地图的“卫星”显示模式下,使用的是 WGS-84 坐标,能直接显示 EXIF 中的坐标。而在“地形”显示模式下,使用的竟然也是 GCJ-02 模式,如果尝试直接显示 EXIF 坐标会出现前面几种地图一样的定位错误,也会偏移几百米,比较奇怪。在切换显示模式的时候就能明显看出不对应。

测试用的链接

  • 高德:https://uri.amap.com/marker?position=${lon},${lat}
  • 百度:https://map.baidu.com/?latlng=${lat},${lon}
  • 谷歌:https://www.google.com/maps?q=${lat},${lon}
  • 苹果:maps://?q=${lat},${lon}

其中:${lat} 是纬度,${lon} 是经度。

对数值坐标的刻意隐藏

在中国大陆想要获取纯数值的坐标(即经纬度,而非地名)不是一件容易的事。至少,在手机端和网页端,几乎没有任何地方允许方便地找到。

我以前一直用百度的“坐标拾取系统(https://api.map.baidu.com/lbsapi/getpoint/index.html)”来做这件事。而最近,这个以前不用登录的免费功能也因为监管要求,被废掉了:

温馨提示:坐标拾取器因受监管合规要求,游客和未认证开发者仅可显示经纬度小数点后2位,如需更精确的信息,需要您完成 实名注册认证。

高德地图的界面上几乎没有任何地方可以复制坐标值,但是从浏览器开发者工具的网络请求那里看到一些请求直接包含了坐标:

https://amap.com/service/regeo?longitude=113.86573&latitude=22.557394

相关阅读


  1. exiftool -json -n -GPSLongitude -GPSLatitude IMG_2396.HEIC ^

  2. taoblog/theme/blog/statics/script.js · movsb/taoblog ^

  3. 世界大地测量系统 - 维基百科,自由的百科全书 ^

  4. 中华人民共和国地理数据限制 - 维基百科,自由的百科全书 ^

  5. 没有官方公开的,有测绘资质的厂家应该有。民间有流传的。 ^