这几天在处理定位相关的代码,彻彻底底的被火星坐标恶心到了。

恶心列表

  1. 从 CLLocationManager 取出来的经纬度放到 mapView 上显示,是错的!
  2. 从 CLLocationManager 取出来的经纬度去 Google Maps API 做逆地址解析,当然是错的!
  3. 从 MKMapView 取出来的经纬度去 Google Maps API 做逆地址解析终于对了。去百度地图API做逆地址解析,依旧是错的!
  4. 从上面两处取的经纬度放到百度地图上显示都是错的!错的!的!

当时我还不知道火星坐标、XX坐标,大骂苹果SB(我错了)……
如果你碰到上述情况,接着往下看。

名词解释:

地球坐标 (WGS84)

  • 国际标准,GPS标准从 GPS 设备中取出的原始数据是就是这个
  • 国际地图提供商一般使用的也是这个

火星坐标 (GCJ-02)

  • 中国标准,行货 GPS 设备取出的最终数据是这个
  • 国家龟腚: 国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。

百度坐标 (BD-09)

  • 百度标准,百度 SDK,地图,Geocoding 用的都是这个。

开发时所面临的现状

获取经纬度(GPS)

  • 火星坐标

    • MKMapView
  • 地球坐标
    • CLLocationManager

显示经纬度(地图)

  • 火星坐标

    • iOS 地图
    • Gogole地图
    • 搜搜、阿里云、高德地图
  • 地球坐标
    • Google 卫星地图(国外地图应该都是……)
  • 百度坐标
    • 百度地图

推荐的解决方案:

  • 既然是在国内,存储一律用火星坐标,这样在使用国内地图显示时最方便(用百度地图显示时可以一次转换取得)
  • CLLocationManager 拿到的 CLLocation 转为火星坐标,MKMapView 不用处理
  • 使用地图 API 进行 地址解析/逆地址解析(Geocoding) 时注意相应使用相应地图商的坐标系
  • 部分地图商支持多个坐标系输入,如高德支持地球、火星坐标(这个一直有变动,具体只能参考厂商最新文档了)

附上相应的转换算法

iOS 平台的转换算法的已经封装了一个 Category,在这里 CLLocation+Sino 。

地图坐标 to 火星坐标

火星坐标 to 地图坐标

火星坐标 vs 百度坐标

总结

    • 火星坐标是天朝的新发明,至于火星坐标能补呢功能保证国家安全,我对此深深怀疑:至少用穷举法精度达到10米内是很容易的
    • GPS厂商和地图厂商都需要加偏、纠偏算法,买算法是要付钱的 , 所以你懂的
    • 火星坐标已经挺有天朝特色了:全民都处以虚幻坐标系之下,而百度又极尽展现了天朝厂商特色,为了垄断不折手段。我朝威武!
    • iOS SDK 的做法还是比较合理的,毕竟他是一个国际化的平台。CLLocationManager 提供地球坐标,这样显示国外地图商的地图服务没问题,碰到火星地图,转一下就好,逆之则没那么容易。而 MKMapView 则与 iOS 地图展示相关,国内地图必须使用火星坐标
    • 本人只是想用户使用 app 时能简简单单定位准确,而不是飞檐走壁狐死首丘。本文只做技术讨论,不敢侵犯任何个人、团体、政党、国家、星球权利,任何XXX对此文不满,请留言,我立刻删之

iOS 火星坐标相关整理及解决方案汇总(转)的更多相关文章

  1. iOS 定位坐标不准确的相关整理及解决方案汇总

    这几天处理定位相关的代码,彻彻底底的被火星坐标恶心到了. 恶心列表 从 CLLocationManager 取出来的经纬度放到 mapView 上显示,是错的! 从 CLLocationManager ...

  2. ios 解决有关火星坐标的问题

    CLLocationManager 定位获取CLLocation 是地球坐标,而MKMapView 获取的是天朝火星坐标,这就导致了使用定位的时候,显示用户的蓝点和当前定位信息偏差(因为蓝点是调用了M ...

  3. IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法

    转载自:http://blog.csdn.net/swingpyzf/article/details/16972351 纠偏也可参考:http://www.2cto.com/kf/201310/253 ...

  4. ios 百度地图,火星坐标,地球坐标互转

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. iOS、mac开源项目及库汇总

    原文地址:http://blog.csdn.net/qq_26359763/article/details/51076499    iOS每日一记------------之 中级完美大整理 iOS.m ...

  6. Android WebView常见问题及解决方案汇总

    Android WebView常见问题解决方案汇总: 就目前而言,如何应对版本的频繁更新呢,又如何灵活多变地展示我们的界面呢,这又涉及到了web app与native app之间孰优孰劣的争论. 于是 ...

  7. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  8. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  9. Android之Android WebView常见问题及解决方案汇总

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 Android WebView常见问题解决方案汇总: 就目前而言,如何应对版本的频繁更新呢,又如何灵活多变 ...

随机推荐

  1. asp.net推送

    http://tech.it168.com/a2012/0210/1310/000001310252_all.shtml http://www.infoq.com/cn/news/2012/09/rc ...

  2. 1319-n皇后问题

    描述 在n×n 格的棋盘上放置彼此不受攻击的n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一 ...

  3. IntelliJ IDEA 中文乱码解决

    显示乱码的主要原因,编辑器自带的字体里没有对中文的支持, 将字体换成有中文支持的即可,例如:为微软雅黑.宋体.... 字体转换位置 Ctrl+Alt+S     > Appearance > ...

  4. php数组遍历 使用while循环

    while() 通常和 list(),each()配合使用. $colors= array('red','blue','green','yellow'); while(list($key,$val)= ...

  5. UVA 825 Walkiing on the safe side

    根据地图,要求固定两点间最短路径的条数 . 这题的输入数据就是个坑,题目有没有说明数据之间有多个空格,结尾换行符之前也不止一个空格,WA了好几遍,以后这种情况看来都要默认按照多空格的情况处理了. 可以 ...

  6. code forces Watermelon

    /* * Watermelon.cpp * * Created on: 2013-10-8 * Author: wangzhu */ /** * 若n是偶数,且大于2,则输出YES, * 否则输出NO ...

  7. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-005- 异常处理@ResponseStatus、@ExceptionHandler、@ControllerAdvice

    No matter what happens, good or bad, the outcome of a servlet request is a servlet response. If an e ...

  8. tshark 使用说明

    yum install -y wireshark 最近才发现,原来wireshark也提供有Linux命令行工具-tshark.tshark不仅有抓包的功能,还带了解析各种协议的能力.下面我们以两个实 ...

  9. Problem A+B

    Problem A+B   Time Limit : 1000 MS   Memory Limit : 65536 KB   Description Calculate a+b   Input Two ...

  10. AS 学习笔记 加载数据

    AS2 加载本地(外部)数据.swf .png .jpg 等资源使用loadMovie() 加载库里面的mc 用 attachMovie AS3 加载本地(外部)数据 用 Loader 类来完成这个操 ...