高德定位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;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值