前言
最近在研究的一个社交APP设计到定位分享的问题,在获取定位以后分享给好友,好友点击定位拉起第三方地图进行导航,在开发的过程中发现,用户在拉起第三方app后得到的位置和原本的位置出现了偏差。有经验的小伙伴就知道-不同坐标系造成的问题
关于坐标系
我们的定位一般会用经纬度来进行描述,但是由于一个原因出现了不同的坐标系,来对经纬度会进行加密操作,用于保护用户隐私,这个时候如果双方使用不同坐标系,就会对位置造成偏差
对于不同坐标系的详细定义,我就不再详细记录,以下是简单的了解:
- WGS84: 这个是国际上同的坐标系,使用经纬度表示一个位置
- GCJ-02: 这个是中国使用的坐标系,在中国地区高德地图,腾讯地图,以及谷歌中国区地图都是使用这个坐标系
- BD-09: 这个是百度地图使用的坐标系,在GCJ-02的基础上进行了二次加密
使用场景:
我们app使用的是高德地图进行定位,也就是使用的是GCJ-02这个坐标系,所以我们首先得弄清楚自己目前获得的经纬度,使用的是什么坐标系,这样才能够精准的减少误差
我们的app上主要对高德地图和百度地图以及苹果原生的地图进行了引用,也就是我们点击定位的时候可以选择这三个地图中的一个来进行导航
关于百度地图
对于百度地图我们主要使用一下链接进行拉起
[[NSString stringWithFormat:@"baidumap://map/marker?location=%f,%f&title=目标位置&content=%@&coord_type=gcj02",location.latitude,location.longitude] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
对照下面的参数列表
从参数列表中我们可以看到,百度的web api有一个关于coord_type的参数,由于我们使用的是高德进行定位所以当前使用的坐标系是gcj02,所以我们得把这个告诉百度地图,百度地图自己会进行换算
关于高德地图
前面已经说到我们使用的就是高德地图来进行定位,也就是我们不用再对获得的坐标系进行换算
使用的链接
[[NSString stringWithFormat:@"iosamap://viewMap?sourceApplication=Demo&poiname=%@&lat=%f&lon=%f&dev=0",name,location.latitude,location.longitude] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]
参数列表:
我们当前使用的就是gcj02的坐标系,已经是经过了一层加密,所以dev这个参数我们一定要传0,所以如果你们获取经纬度使用的坐标系使用的是 WGS84等未加密的坐标系,这里一定要把dev设置为1,让高德自己进行换算
总结
对于拉起第三方app定位造成误差的问题,最主要的就是先弄清楚自己当前使用的坐标系,这样经过换算后就能把误差消除
下面是一些可能用到的工具: