Posts GPS坐标纠偏和加偏
Post
Cancel

GPS坐标纠偏和加偏

做过iOS地图开发的同学都会遇到同一个问题–坐标偏移,简而言之就是你拿到的GPS坐标显示在地图上的时候并不会像你想象的那样显示在正确的位置,通常会有一公里左右的偏移。这是为什么呢?

为何会有偏移?

天朝测绘局以国家安全为由,用法律的形式对所有在天朝发型的地图类产品加了强制性规范,要求所有地图类产品都必须使用国家测绘局的一种加偏算法,对真实的GPS坐标(WGS-84)进行加偏处理。因此国内所有商用地图的坐标都是偏移的,这种加偏后的坐标就叫做火星坐标(GCJ-02)。国内的高德地图、搜狗地图、苹果地图、谷歌地图等都使用的是火星坐标(GCJ-02),奇葩的是百度在天朝测绘局要求的加密的基础之上又做了一层加密,我们叫它百度坐标(BD-09)

事实上,GPS设备本身获取到的GPS坐标信息是正确的,只不过地图是经过偏移的,这样没有偏移的GPS坐标显示到加偏了的地图之上就会出现位置显示的错位。

天朝之所以是天朝,就是因为她的独一无二。任何东西到了天朝,都会被进行中国特色社会主义改造。尽管对地图使用设置人为的障碍很不好用,但是不管怎样,我们还是得用,要用就得另辟蹊径。

纠偏和加偏

俗话说上有政策,下有对策。天朝测绘局的加密算法虽然没有公开,但是为了和国际接轨,广大人民群众利用自己的智慧破解了这个算法。虽然说不上百分之百的破解,还有一定程度的误差,但是对于正常使用已经基本没有影响。

我根据网友公开的算法整理出了一个开源库KSCoordinateConverter - iOS坐标转换工具,通过他可以在GPS坐标火星坐标百度坐标三者之间进行相互转换。

要进行纠偏和加偏,首先我们得知道iOS系统的API获取到的坐标是哪种坐标。事实上,iOS中的通过CLLocationManager的delegate方法- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;获取到的坐标是GPS坐标,这个坐标是没有经过偏移的,而苹果地图是经过偏移的,所以需要把获取到的坐标转换成火星坐标才可以正常显示。与之不同的是,iOS中MKMapView的delegate方法- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;获取到的坐标是已经偏移了的火星坐标,所以她不需要加偏就可以在苹果地图上正常显示。

彩蛋

众所周知,谷歌地图在国内也是进行了加偏操作,但是谷歌卫星地图属于卫星照片,它不是地图,所以不受天朝测绘局的约束,它的坐标是真实的。但正是因为这样你会发现卫星地图和路网全都是错位的,根本没法看,如下图所示:

我们可以明显的看到公路修到了屋顶,这肯定是有问题的。要解决这个问题,最好的办法就是谷歌的工程师们可以对天朝的卫星地图也进行加偏,这样就会匹配了。但是有网友反映自己已经很多次给谷歌反映这个问题了,但是一直得不到解决,个中原因没人知道。

向谷歌求助无望那就只能靠我们自己了,我偶然间发现把iPhone系统语言切换为英文之后卫星地图和路网就相匹配了,效果如下图:

看着是不是心情好了很多,估计这是一个bug,也可以能是故意为之。管他呢,能愉快的使用就行!

相关项目:KSCoordinateConverter - iOS坐标转换工具 参考文章:GPS纠偏及大陆地图偏移原因

This post is licensed under CC BY 4.0 by the author.

从指针说起

让你的Mac终端“漂亮”起来

Comments powered by Disqus.