关于GPS坐标系和地图定位偏差
关于目前(2019)电子设备和电子地图定位的探索,希望可以回答如下几个问题:
1. 获取GPS位置后,为什么在地图上定位不准?
答:中国地图采用的坐标系和GPS坐标不是同一个坐标系,所以采用GPS坐标在地图上定位不准。
2. 国外GPS位置和国内GPS位置有差别吗?
答:GPS是美国的导航系统,全球通用,手机内置的芯片都是GPS芯片,没有差别。不同的地方是地图有着不同的GPS坐标系。
3. WGS84,GCJ-02, BD09坐标系如何理解?
答:借用百度的说明如下:
WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:又称火星坐标系,是由中国国家测绘局制定的地理坐标系统,是由WGS84加密后得到的坐标系。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
链接:http://lbsyun.baidu.com/index.php?title=coordinate
4. 软件开发如何应对?
坐标系是在一个系统中的参考坐标系,所以在同一个系统内不存在问题。例如,如果需要获取某一个地图上的位置,通过地图SDK就可以获得地图坐标系的位置,不存在问题。(例如,你一直都是用百度地图,定位也是通过地图定位,那么没有任何问题)如果希望在不同的坐标系上使用,必须经过转换。最好的办法是,统一采用同一个地图,不切换坐标系。例如做国内系统,用百度地图,高德地图都可以。如果做国际项目,那么最好建议采用Google地图,国外地图数据最完整,其次是百度。
Google国内外访问地址,key需要在google账号中申请(目前需要梯子)
国内:https://ditu.google.cn/maps/api/js?key=
国外:https://maps.google.com/maps/api/js?key=
关于坐标系转换,参考百度文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans
以下是相关论证过程和分析
缘起,首先来看一个问题,一个朋友在柬埔寨通过GPS软件获得一个GPS位置,发现和实际位置不准的问题,赶快查询了一下,“果然不准确”。
网上各种方法,代码,工具,理论等等……看来这个问题还很普遍嘛,可是随着我的深入查找资料和验证,发现不对!下面我们听我慢慢细说。
- 地图和GPS定位坐标系
先说定位坐标系,目前国际上通用的坐标系是WGS84,参考:https://en.wikipedia.org/wiki/World_Geodetic_System,也是通过GPS获取的经纬度信息是一致的,只是表示方法的存在区别:度分秒表示,还是十进制数表示。所以通过手机获取的地理位置信息,都是GPS位置信息。目前北斗卫星定位在大众手机没有用上,就算用上,估计也是不同的坐标系。
再来看看电子地图,为什么会存在火星坐标系呢?经过查找资料,没有找到明确的关于GCJ-02国家发布的资料,只找到我国测绘法:
国家测绘局2002年发布的《中华人民共和国测绘法》,要求使用统一的国家测绘坐标系,参看链接:http://www.gov.cn/ziliao/flfg/2005-08/05/content_20947.htm
上文表达的意思是,国内采用统一的坐标系统,而且和国际坐标系统不一致。而GCJ-02标准和这一致。
关于坐标系查询,可以通过http://www.gpsspg.com/maps.htm网站查询。同时我可以发现这个网站可以通过国界线区分坐标系的换算,而网上不少代码均是通过经纬度范围简单的判断是否在中国境内,对于中国周边国家会存在问题,估计有问题。不过该网站的谷歌地图坐标有问题,估计是老版本的地图,而且也打不开google地图。
上图为中国云南边境
上图为中国与缅甸交界的地方。
Google地图(国际版)GPS坐标定位工具:
https://www.gps-coordinates.net
该工具可以在google地图(国际版本)上根据GPS定位,而且下发写着坐标系是WGS48。经过实际对比发现Google地图,对于中国境内采用的依然是GCJ-20坐标系。
为了验证Google地图在国内的位置依然是GCJ-20坐标系,我采用下面的方法得出的结论(有兴趣的朋友继续阅读)。
如何判断GPS坐标是WGS-48,还是GCJ-20坐标体系呢?
我发现,通过iPhone的指南针的经纬度,如果直接换算为Google地图的坐标进行设置时发现,和实际位置不相符(国内),通过Android 三款软件进行数据采集发现有相同位置不同软件具有两种经纬度信息:
GPS定位导航采用的GCJ-02坐标
GPS定位工具箱采用的也是GCJ-02坐标
GPS实时海拔采用的是WGS-84,和iPhone指南针相同的数据。
注意:表面上看,并不能确认软件采用的具体坐标系(无法通过数值区分),而是通过比较得出的结论。
我写作位置的GPS位置数据分别如下:
序号 | 采集设备/程序 | 纬度 | 经度 | 纬度 | 经度 |
---|---|---|---|---|---|
1 | iPhone/指南针 | 北纬28°15’18’’ | 东经113°4’27’’ | 28.255 | 113.0741666667 |
2 | iPhone/GPS讯号 | 28.255055 | 113.074167 | ||
3 | 坚果手机/GPS实时海拔 | 北纬28°15’18’’ | 东经113°4’26’’ | 28.255 | 113.0738888889 |
4 | 坚果手机/GPS定位导航 | 28.251874 | 113.079874 | ||
5 | 坚果手机/GPS定位工具箱 | 28.251877 | 113.079878 |
如果把上述地址在https://www.gps-coordinates.net网页上输入,发现可以准确定位的是上表的4,5!是不是1,2,3。上面工具的网站声称采用WGS-48坐标系,而且Google Map英文文档也是采用WGS-48坐标系,那么是否可以推论4, 5就是WGS-48坐标系呢?
经过我的论证,他们恰恰不是WGS-48,而是GCJ-02!
为了论证这个设备的数值到底是哪种坐标系,煞费苦心。
后来发现百度地图的文档上说明,百度采用BD09LL坐标系,而且具有WGS-48,GCJ-02坐标转换接口,所以我对上述采集的数据通过以上两个转换方法对位置进行转换,得到百度的坐标系,然后在百度的坐标定位工具(http://api.map.baidu.com/lbsapi/getpoint/index.html)中定位,确认实际是否位置一致。
经过测试发现如下结论:
序号 | 经度 | 纬度 | WGS48->BD09经度 | WGS48->BD09纬度 | GCJ02->BD09经度 | GCJ02->BD09纬度 | 位置一致坐标类型 |
---|---|---|---|---|---|---|---|
1 | 28.255 | 113.0741666667 | 113.08658610 | 28.25765828 | 113.08069003 | 28.26092783 | WGS48 |
2 | 28.255055 | 113.074167 | 113.08658632 | 28.25771306 | 113.08069031 | 28.26098281 | WGS48 |
3 | 28.255 | 113.0738888889 | 113.08630670 | 28.25766231 | 113.08041105 | 28.26093265 | WGS48 |
4 | 28.251874 | 113.079874 | 113.09232310 | 28.25445936 | 113.08642390 | 28.25770832 | GCJ02 |
5 | 28.251877 | 113.079878 | 113.09232718 | 28.25446229 | 113.08642791 | 28.257711260 | GCJ02 |
- iPhone指南针软件,得到的都是WGS48坐标数据
- Android软件获得坐标就存在两种类型坐标系
如果要想获得国内坐标系是否是WGS48,还是GCJ02,通过如下方法即可: - 获得经纬度(用任何可用的工具)
- 如果需要换算,可以利用工具(http://www.gzhatu.com/du2dfm.html)
- 通过百度API转换,也可以通过工具查看(http://www.gpsspg.com/maps.htm)
curl "http://api.map.baidu.com/geoconv/v1/?coords=113.0741666667,28.255&from=1&to=5&ak=hfyzyfi3dAG8dRE3GBTmiqrvpt6ZEr5j"
curl "http://api.map.baidu.com/geoconv/v1/?coords=113.0741666667,28.255&from=3&to=5&ak=hfyzyfi3dAG8dRE3GBTmiqrvpt6ZEr5j"
注意:http://www.gpsspg.com/maps.htm网站的Google地图已经失效(2019.7)。
关于坐标系的图示理解:
上图解释了,通过相同坐标系就不会有问题。