Android开发中,偶然发现,用百度地图分享出来的经纬度信息,再次用高德地图、腾讯地图打开,会出现几百米甚至几公里的偏移。
借用网络相关评论 分享出来的明明是山,换个地图打开变成海了
。
一、现象
打开百度地图
:在地图上选择一个地点,查看其经纬度坐标。
这里以我的老东家 网易北京研发中心
为例。
打开百度地图坐标拾取系统
,搜索框输入 网易北京研发中心
,获取经纬度坐标为:116.282314,40.049229
。
打开高德地图
,高德地图逆地理编码系统。
将百度地图坐标拾取的经纬度信息
填入高德地图逆地理编码系统
中,如下图所示,可以看到定位地址大约出现了一公里的偏移
。
打开腾讯地图
,腾讯位置服务系统。
将百度地图坐标拾取的经纬度信息
填入腾讯位置服务系统
中,如下图所示,可以看到定位地址同样出现了大约一公里的偏移,但腾讯地图、高德地图最终的定位位置保持一致
。
高德地图坐标拾取器
https://lbs.amap.com/demo/javascript-api/example/geocoder/regeocoding
百度地图坐标拾取器
http://api.map.baidu.com/lbsapi/getpoint/index.html
腾讯地图坐标拾取器
https://lbs.qq.com/getPoint/
猜想:
现象:百度地图
分享出来的经纬度信息,用高德地图、腾讯地图
打开出现了相同的偏移量
;但高德地图、腾讯地图
分享出来的经纬度信息,两者之前可以互相使用。
这里猜测:高德、腾讯地图应该使用了同一套坐标系统;百度地图可能在该地图的基础上,使用了一套新的坐标系统,对坐标系主动进行了某种偏移操作。
二、坐标系
分别查询高德地图、腾讯地图、百度地图三家的开发者平台,发现:高德地图、腾讯地图采用的是 GCJ02 坐标系
;百度地图采用了 BD09 坐标系
;
那么 GCJ02、BD09 坐标系有什么区别?
想要了解 GCJ02、BD09 坐标系的区别,先了解一下国内主流的坐标系类型。
目前国内主流的坐标系类型有 WGS84、GCJ02、BD09
。
- WGS84
世界大地测量系统(World Geodetic System 1984)
是一种用于地图学、大地测量学和导航(GPS全球定位系统)的大地测量系统标准。 - GCJ02
中国国家测量局02号标准(Guojia Cehui Ju 02)
,也称为火星坐标系
。是中国国家测绘局制订的地理信息系统的坐标系统,是在 WGS84 经纬度的基础上执行加密算法而成
。因GPS得到的经纬度
直接在 GCJ02 坐标系下会定位到错误的地点
,有种到了火星的感觉,因此在坊间也将 GCJ02 戏称为火星坐标系
。 - BD09
百度坐标系
,百度在GCJ02坐标系基础上再次加密而成
。
国内主流地图默认采用的坐标系?
了解了各坐标系的大概定义,那么目前国内主流的地图都默认采用了什么坐标系统呢?
总结一句话:
中国大陆、港澳,使用GCJ02坐标系(百度除外,百度默认使用 BD09 坐标系);中国台湾省使用 WGS84 坐标系;海外地区使用 BD09 坐标系
;
以上表格数据依据:
百度地图数据依据
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans
高德地图数据依据
https://lbs.amap.com/faq/advisory/others/39840/?wd=WGS84&cateId=&page=&detail=true
腾讯地图数据依据
https://lbs.qq.com/mobile/androidMapSDK/developerGuide/attention
三、坐标系转换
查看百度、高德、腾讯相关开发者平台,发现对应开发者平台均提供了GCJ02、BD09、WGS84
相关的坐标系转化API。
百度地图
百度地图 坐标转化API:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans
高德地图
高德地图 坐标转化API:
https://lbs.amap.com/api/android-sdk/guide/computing-equipment/coordinate-transformation/