项目维护<<地图相关总结>>
一. 问题: 地图标注点位置不准确
知识背景
1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用; 2.GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系; 3.百度坐标系:bd-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度API提供了从其它坐标系转换为百度坐标系的API,但却没有从百度坐标系转为其他坐标系的API)
以上知识点来自高德,百度,Google地图定位偏移以及坐标系转换
分析原因
我们项目中使用的是高德地图.创建电站时, 会把获取到的高德经纬度调用后台接口转换成GPS经纬度, 然后把高德经纬度和GPS经纬度都给后台, 后台会再把GPS转成经纬度覆盖传入的经纬度(我们的后台设计是不是很神奇😂😂, 懒得吐槽了).
经过以上的过程, 在地图点聚合页面获取到的经纬度其实是真实的经纬度, 然而代码中却是直接当成高德坐标在地图上标注, 所以位置显示有偏差.
解决方案
把GPS转换为高德经纬度, 在标注点.
CLLocationCoordinate2D amapcoord = AMapCoordinateConvert(CLLocationCoordinate2DMake([mapPsModel.latitude doubleValue], [mapPsModel.longitude doubleValue]), AMapCoordinateTypeGPS);
二. 地图POI搜索
注: 在未设置城市限制时, 高德POI搜索仅会返回建议城市, 需要引导用户选择某一城市后,继续搜索. 高德官方sdk
三. 导航功能
跳转到高德地图和苹果自带地图, 目标位置是准确的; 但是跳转到百度地图, 目标位置发生偏移.
分析原因
国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。 因此从高德地图进入百度地图导航, 需要制定经纬度类型
coord_type=gcj02
解决方案
- 需要手动点击开始导航
@"baidumap://map/direction?origin=&destination=latlng:%f,%f|name=目的地&mode=driving&coord_type=gcj02"
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin=&destination=latlng:%f,%f|name=目的地&mode=driving&coord_type=gcj02",locationBaidu.coordinate.latitude, locationBaidu.coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
- 直接导航
@"baidumap://map/navi?location=%f, %f&src=push&type=BLK&src=webapp.line.isolarcloud.operation4ios&coord_type=gcj02"
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/navi?location=%f, %f&src=push&type=BLK&src=webapp.line.isolarcloud.operation4ios&coord_type=gcj02", locationBaidu.coordinate.latitude, locationBaidu.coordinate.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
如果不指定类型, 也可以手动转换坐标点, 请参考火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法
强烈推荐同事(地图方面的大神)的一篇博客,介绍的非常详细 国内外地图差异分析