百度地图坐标和高德地图坐标转换


网上解决该类问题的帖子很多,但是这里还需记录下自己解决问题的过程。

需求背景

项目中使用的都是百度坐标系BD-09,当APP跳转到高德地图APP时,虽然坐标经过了转换,但在高德地图上显示仍有偏移。因此问题:解决坐标偏移问题。

解决思路

从以下几方面入手:
1、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。
解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。
2、原始坐标准确度不够
解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。
如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。
3、度分秒的概念混淆
比如,在google earth上采集到的是39°31’20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。
4、经纬度顺序写反了
有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。

方案实施

1.在程序中打印log得到百度坐标系、通过转换后的火星坐标系,校验转换后的结果是否正确,校验工具:百度坐标拾取器(http://api.map.baidu.com/lbsapi/getpoint/index.html)、高德坐标拾取器(http://lbs.amap.com/console/show/picker)。
此处就发现转换算法有问题,转换结果有偏差。算法应采用:http://blog.csdn.net/w605283073/article/details/64906518

2.从百度坐标系转换得到正确的火星坐标系,从自己的APP跳转到高德地图发现仍有偏移。那么问题一定出在APP跳转的过程。因此排查到跳转代码有问题,以下直接贴出正确跳转代码:

// viewMap-服务类型,
// sourceApplication-第三方调用应用名称,
// poiname-POI名称,
// lat-经纬度参数,lon-经纬度参数,
// dev-起终点是否偏移(0:lat和lon是已经加密后的,不需要国测加密;1:需要国测加密)
Intent intent = new Intent("android.intent.action.VIEW",                  android.net.Uri.parse("androidamap://navi?sourceApplication=我的应用&poiname=应用&lat="
+ loc.getLat() + "&lon=" + loc.getLng()
+ + "&dev=0"));
intent.setPackage("com.autonavi.minimap");
context.startActivity(intent);

注意:这里的dev参数,一般要写dev=0,即通过步骤1中的转换算法就已经是国测加密后的坐标,无需在进行国测加密了,否则得到的结果在地图上显示是一定有偏移的。这里参考的(http://blog.csdn.net/u010998327/article/details/71515147)

综上,经过上述步骤将坐标转换偏移问题修复。举一反三,其他坐标系的转换偏移问题解决思路应如上,如:火星坐标系转换到百度坐标系、WGS-84坐标系与百度互相转换等。

参考文献

https://segmentfault.com/a/1190000000498434
http://blog.csdn.net/u010998327/article/details/71515147
http://blog.csdn.net/w605283073/article/details/64906518

猜你喜欢

转载自blog.csdn.net/lrxb_123/article/details/78804869