其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。在使用环节,GPS终端设备必须集成保密局提供的加密算法(集成工作由保密局完成),把从GPS卫星那里得到的坐标转换成虚拟坐标,然后再去火星地图上查找,这样就在火星坐标系上完成了地图的匹配。 所以大家所用的百度,高德等地图定位准是偏差几百米
名词总结:
地球坐标:指WGS84坐标系统
火星坐标:指使用国家保密插件人为偏移后的坐标
地球地图:指与地球坐标对应的客观真实的地图
火星地图:指经过加密偏移后的,与火星坐标对应的地图
坐标系转换算法
1.GCJ-02(火星坐标系)和BD-09转换
2WGS-84(地球坐标系)和BD-09(百度坐标)转换
1 // WGS-84 坐标转换成 BD-09 坐标 2 + (CLLocationCoordinate2D)WorldGS2BaiduGS:(CLLocationCoordinate2D)coordinate 3 { 4 CLLocationCoordinate2D mars = [ALDGeocoder WorldGS2MarsGS:coordinate]; 5 CLLocationCoordinate2D baidu = [ALDGeocoder MarsGS2BaiduGS:mars]; 6 return baidu; 7 } 8 9 // BD-09 坐标转换成 WGS-84 坐标 10 + (CLLocationCoordinate2D)BaiduGS2WorldGS:(CLLocationCoordinate2D)coordinate 11 { 12 CLLocationCoordinate2D mars = [ALDGeocoder BaiduGS2MarsGS:coordinate]; 13 CLLocationCoordinate2D world = [ALDGeocoder MarsGS2WorldGS:mars]; 14 return world; 15 }
3.WGS-84和sogou坐标转换
4火星坐标和地球坐标转换
5WGS-84 和 墨卡托 坐标转换
开发时所面临的现状
获取经纬度(GPS)
-
火星坐标
-
MKMapView
-
地球坐标
-
CLLocationManager
显示经纬度(地图)
-
火星坐标
-
iOS 地图
-
Gogole地图
-
搜搜、阿里云、高德地图
-
地球坐标
-
Google 卫星地图(国外地图应该都是……)
-
百度坐标
-
百度地图
推荐的解决方案:
-
既然是在国内,存储一律用火星坐标,这样在使用国内地图显示时最方便(用百度地图显示时可以一次转换取得)
-
CLLocationManager 拿到的 CLLocation 转为火星坐标,MKMapView 不用处理
-
使用地图 API 进行 地址解析/逆地址解析(Geocoding) 时注意相应使用相应地图商的坐标系
-
部分地图商支持多个坐标系输入,如高德支持地球、火星坐标(这个一直有变动,具体只能参考厂商最新文档了