zhengrenzhe's blog   About

WTF的“火星坐标”

今天在写写代码时,遇到一个奇怪的问题:根据CoreLocation返回的经纬度数据在MapView上标出大头针,同时打开MapView的showsUserLocation,大头针居然不能和我当前的位置重合,具体就是如下午的情况:

但是把经纬度数据复制到OS X下的地图应用里,搜到的位置却是正确的,这真是一个相当蛋疼的问题,在研究一番后终于明白了问题的原因:不是我的GPS数据有问题,而是国内的地图根本就不是用GPS数据标的,这就是我朝特色之一的“火星坐标”。

什么是火星坐标

这个火星坐标到底是个什么鬼呢?火星坐标只是一个戏称,他的真实身份是中国国家测绘局搞出的GCJ-02标准,就是在经纬度数据上加入一定量的随机偏差,之后按计算出的数据进行标注,也就是说你用GPS数据在中国出版的地图上根本就没法找到精确的位置,偏差从几十到几百米不等,例如上图就是一个例子,这就是官方宣称的“国家保密插件”,这种做法保证了通过GPS得到数据总是没发与实际地理位置相匹配的,例如想发个导弹打到人民大会堂,结果却打到了故宫里,降低恐怖势力对我国造成的伤害。

所以现在的解决办法就是将原始GPS数据经过某种转换,成为火星坐标,这样才可以对应上中国大陆的地图。GPS大家肯定都不会陌生,全称全球定位系统,通过经纬度标识地球上任意一点的位置,国际标准称为WGS-84。现在在网上也有很多开源转换实现了,可以直接将GPS坐标转换为火星坐标,为此我也写了一个swift实现,点击右侧链接即可观看。 Github

← 理解iOS的autolayout  NodeJS传输二进制数据 →