今天遇到个问题,客户给了个 矢量地图,然后给了 左上角 & 右下角 的经纬度,让我实时定位,并将自己的位置显示在适量地图上。
问题来了:
我把做好的给客户测试,客户远在内蒙古,我在帝都。客户说咋没有自己的定位呢,小人在哪呢,看不见啊。
尴尬了,在我这好好滴,去她那就不行了,郁闷。
跟客户沟通下,客户的 矢量地图 都是现画的,AI画图,经纬度都是用 北京54采集数据,我也不懂,反正就是测出来的跟 谷歌 的吻合。
那就可以解决了。
客户用的是谷歌地图的经纬度,我用的是百度地图的经纬度,只要转化下就👌了
先了解下
WGS84: 即地图坐标,美国GPS使用的是WGS84的坐标系统。GPS系统获得的坐标系统,基本为标准的国际通用的WGS84坐标系统.
GCJ-02: 即火星坐标,是由中国国家测绘局制订的地理信息系统的坐标系统。它是一种对经纬度数据的加密算法,即加入随机的偏差。国内出版的各种地图系统(包括电子形式),出于国家安全考虑,必须至少采用GCJ-02对地理位置进行首次加密.
BD-09: 即百度坐标: 在GCJ02基础上,进行了BD-09二次加密措施,API支持从WGS/GCJ转换成百度坐标,不支持反转.
/**
*坐标转换函数,从原始GPS坐标,mapbar坐标,google坐标,51地图坐标,mapabc坐标转换为百度坐标(51地图坐标需要显出10000)
*@param coordinate 待转换的坐标
*@param type 待转换的坐标系类型,GPS为原始GPS坐标,COMMON为google坐标,51地图坐标,mapabc坐标
*@return 返回的NSDictionry中包含“x”,“y”字段,各自对应经过base64加密之后的x,y坐标
*/
UIKIT_EXTERN NSDictionary* BMKConvertBaiduCoorFrom(CLLocationCoordinate2D coordinate,BMK_COORD_TYPE type);
/**typedef enum
{
BMK_COORDTYPE_GPS = 0, ///GPS设备采集的原始GPS坐标
BMK_COORDTYPE_COMMON, ///google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标
} BMK_COORD_TYPE;
*base64加密后的坐标字典解密函数
*@param dictionary 带解密的NSDictionry,该NSDictionry中应包含“x”,“y”字段,各自对应经过base64加密之后的x,y坐标
*@return 解密之后的坐标
*/
UIKIT_EXTERN CLLocationCoordinate2D BMKCoorDictionaryDecode(NSDictionary* dictionary);
用这两个方法转一下,就OK了,完美解决!
效果图
下面这段在其他地方看到的,应该有所帮助
3.5.2 BD-09 转换为 WGS84.GCJ-02(百度没公开API,只能google了)
在Github 找到这个转换算法https://github.com/TinyQ/TQLocationConverter
* 将WGS-84转为GCJ-02(火星坐标)+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLoc;
* 将GCJ-02(火星坐标)转为百度坐标+ (CLLocationCoordinate2D)transformFromGCJToBaidu:(CLLocationCoordinate2D)p;
* 将百度坐标转为GCJ-02(火星坐标)+ (CLLocationCoordinate2D)transformFromBaiduToGCJ:(CLLocationCoordinate2D)p; * 将GCJ-02(火星坐标)转为WGS-84+ (CLLocationCoordinate2D)transformFromGCJToWGS:(CLLocationCoordinate2D)p;