常见的坐标系有三种:
- 1、地球坐标(WGS84,国际公认坐标),
- 2、火星坐标(GCJ02,国家标准,适用于高德百度地图大陆+港澳部分、Google地图大陆部分),
- 3、百度坐标(BD09,适用于百度地图大陆+港澳台部分)。
坐标系需要和地图关连才有意义,只有正确匹配地图坐标系的坐标才能在该地图上完美标识位置,否则就会存在偏移。
iOS系统上通过定位服务CLLocation相关接口获取定位信息时,获取的经纬度坐标系是WGS84地球坐标,如果直接将该坐标系在iOS系统地图中打点,会发现存在偏移,因为iOS系统地图查看国内时使用的是高德地图数据,因此只接受GCJ02火星坐标。
各个地图API采用的坐标系
API 坐标系
百度地图API 百度坐标
腾讯搜搜地图API 火星坐标
搜狐搜狗地图API 搜狗坐标*
阿里云地图API 火星坐标
图吧MapBar地图API 图吧坐标
高德MapABC地图API 火星坐标
灵图51ditu地图API 火星坐标
注1:百度地图使用百度坐标,支持从地球坐标和火星坐标导入成百度坐标,但无法导出。并且批量坐标转换一次只能转换20个(待验证)。
注2:搜狗地图支持直接显示地球坐标,支持地球坐标、火星坐标、百度坐标导入成搜狗坐标,同样,搜狗坐标也无法导出。
个人认为:采用自家坐标体系,而不采用国内通用的火星坐标体系,实在是自寻短处。当然,百度是因为做的足够大、足够好,所以很霸道,也为以后一统天下而不让别人瓜分之而做准备吧。搜狗虽然用自家坐标体系,但能将地球坐标直接导入,此举也属唯一。而图吧地图不知道学什么加密方式,以前用地球坐标用的好好的,现在用图吧自己的坐标,难道是因为给百度做过所以也来了这么一招?或者沿用百度?不得而知。
做地图开发的时候,如果不希望被一家地图API迁就,采用火星坐标是正确的选择。
定位
定位即获取用户当前经纬度,iOS平台都是通过系统SDK接口获取的,因此所有App获取定位及精度的能力是相同的,即使Google Maps、百度地图、高德地图这种专业地图App也是如此。
精度问题
为什么两台一样的手机,获取的当前位置不一样?我明明在这个位置,为什么定位却显示在附件另一个位置,相差那么远?
这类问题的根源是手机不同定位方式导致的,通常手机定位方式有三种:
- GPS:根据系统GPS模块获取经纬度,精度10-100米左右,限制是容易受环境影响,在室内几乎不起作用。
- 基站:根据运营商基站位置计算经纬度,精度1000-3000米左右,限制是定位较慢,精度差。
- WIFI:根据周围WIFI路由器位置计算经纬度,精度100-200米左右,限制是受周围WIFI数量和分布影响,需要打开手机WIFI开关。
地图
App地图同样存在坐标系和精度问题。前面说过在地图里显示坐标点时,需要匹配正确的坐标系,否则就会产生偏移。
iOS平台的系统地图就存在数据源地图坐标系导致的一个大坑,iOS系统地图App以及系统地图组件MKMapView的数据源分为两种:高德数据源和TomTom数据源。最坑的是iOS地图使用的数据源和当前手机所处的位置是相关的:
如果手机在大陆地区,iOS地图使用的是高德地图数据源:此时用户查看大陆和港澳台地图细节信息时,使用的是GCJ02火星坐标系,同时地图显示精度很高,但是看海外地图时,由于数据源问题精度就会很差(坐标系是WGS84)。
如果手机在港澳台和海外地区,iOS地图使用的是TomTom地图数据源,该地图匹配的是WGS84地球坐标系,如果用户在海外查看国内地图,同时你的POI打点坐标系是GCJ02火星坐标系,那么就会产生偏差;另外手机在港澳台和海外地区时查看港澳台和海外的地图数据精度很好,然而查看国内地图便会精度偏低。
因此要想在iOS地图中正确打点,就需要先行判断使用的地图数据源,以及对应的坐标系,同时使用的POI坐标系务必与地图坐标系匹配,否则就会出现偏差。