打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
高德定位SDK坐标偏移问题
使用第三方定位API的目的是稳定快速,在没有GPS信号时也能通过WIFI及移动信号准确定位,但是因为政策问题,国内的地图会偏移,多半采用GCJ-02坐标系,百度采用BD-09坐标系,倒是我没想到,高德的定位API竟然也返回GCJ-02坐标系。
AMapLocation getCoordType描述
而且,setCoordType()不会有任何效果,就是说在国内不提供WGS84的坐标数据。
网上有很多关于把GCJ02转换成WGS84的算法,不过不得不说,都是垃圾,想当年我还辛辛苦苦把搜到的java代码重写成JavaScript代码,然后一点点调参数试的肝肠寸断。就算网上最靠谱的简单算法,最多也只能在部分区域适用。听我一个在百度的师姐说他们在全国范围内采了2000多万个控制点用来转换的,不知是真是假。
很幸运,高德SDK提供了一个CoordinateConverter工具类,用于将阿里云、百度坐标、谷歌坐标、图盟坐标、图吧坐标、搜搜坐标转换成高德地图坐标(不支持反算)。不过他不支持反算,但是我们可以手动反算。
反算有一个默认的前提:GCJ-02和WGS84在同一个点的坐标值通常差别不会特别大,一般都是小数点后面三位起,也就是我们明知定位得到的结果是GCJ02坐标系的,但是就算是把他当成WGS84,这个误差也不会特别大,反应在地图上一般在500米以内。
假设所在的点P用高德定位出来的数据(Xgcj,Ygcj),那么在这个点500米的范围内,一定存在一个点P',他的WGS84的坐标值与P点的GCJ02的坐标值一致,即:
X'wgs = Xgcj
Y'wgs = Ygcj
我们把P'的WGS84的坐标值丢进CoordinateConverter正算一次,那就得到了P'点GCJ02的坐标值(X'gcj,Y'gcj)。P'点的WGS84坐标值和GCJ02的坐标值当然有一个差值:
dx' = X'gcj - X'wgs
dy' = Y'gcj - Y'wgs
又因为P点和P'点相距非常近,所以我们可以认为:
dx ≈ dx'
dy ≈ dy'
即:
Xwgs≈Xgcj - dx'
Ywgs≈Ygcj - dy'
代码就比较简单了:
double longitude = amapLocation.getLongitude();double latitude = amapLocation.getLatitude();//初始化坐标转换类CoordinateConverter converter = new CoordinateConverter(getApplicationContext());converter.from(CoordinateConverter.CoordType.GPS);//设置需要转换的坐标converter.coord(new DPoint(latitude,longitude));//转换成高德坐标DPoint destPoint = converter.convert();double dx = destPoint.getLongitude() -longitude;double dy = destPoint.getLatitude() -latitude;longitude = longitude - dx;latitude = latitude - dy;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
地图坐标系说明
WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说明与转换
百度地图经纬度和 Google 地图经纬度互转
GPS坐标偏移、转换的那些事儿!
百度坐标、国测局坐标、和WGS84坐标系互转
中华人民共和国地理数据限制
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服