iOS之火星地图与地球坐标(MapKit&CoreLocation)

(2013-01-15 23:43:02)

转载▼
标签:

ios

mapkit

corelocation

火星地图

火星坐标

分类: iOS
前言

1、MapKit和CoreLocation分别是iOS的地图框架和定位框架,说句废话呵呵。
下面有几个名词解释一下,因为发现没有有过“精确定位”需求的同学一般不太了解。
2、火星地图:x国出于安全原因将x国的所有需要出版的地图进行了偏移,这样正确的经纬度就在这种地图上定位不到正确的地点了,而且偏移是非线性的,简单说就是不容易找便宜的规律。这种地图就叫火星地图。
3、火星坐标:用正确的坐标经过了与火星地图一样的算法偏移后产生的经纬度坐标。
4、地球地图:通常意义上的地图。
5、地球坐标:通常意义上的经纬度坐标。
6、火星坐标+火星地图=地图定位准确。这个想一下就可以理解,相同的算法偏移后,就能在地图上正确显示定位。
正题
一图胜万言,先上图:

条件:
1、大头针坐标是通过CoreLocation获取的
2、蓝点是MapKit的isShowUserLocation=YES得到的
3、上方corelocation:120.118093,30.285131的经纬度是CoreLocation获取的,与1对应
4、上方mapkit:120.122886,30.282860的经纬度是从MapKit获取的,与2对应
5、真实的地址是蓝点所在位置,已经非常精确了,误差很小。
推测:
1、高德地图是火星地图,被x国偏移过了
2、CoreLocation获取的是地球坐标
3、苹果对于火星地图在使用isShowUserLocation=YES时用的是火星坐标。
如果想在地图上定位显示正确,并且业务场景也符合,建议使用MKMapView.userLocation.location。获取这个坐标时必须isUserLocationVisible这个只读属性是YES,含义是用户当前所在点(上面说的蓝点)在地图上可见区域显示。

iOS 火星坐标相关整理及解决方案汇总

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

恶心列表

  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 火星坐标

  • 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法 (推荐!)
  • 地图 API: 百度的 高德的

火星坐标 to 地图坐标

  • 数据库查表转换 中国区 GPS坐标 修正(适用于google地图)
  • iOS 私有 API (已不可用)

火星坐标 vs 百度坐标

  • 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法

总结

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

links

  • 国内各地图API坐标系统比较
  • 火星坐标系问题在iOS下的修正
  • 借助百度地图转换火星坐标的研究

updates

  • 2013.05.01 『部分地图商支持多个坐标系输入』

iOS 火星坐标相关整理及解决方案汇总相关推荐

  1. iOS上架小课堂:被拒解决方案汇总【2.1蓝牙权限、3.1.1微信小程序、5.1.1权限使用说明、 境外IP访问权限等】

    文章目录 引言 I 3.1.1微信小程序 1.1 问题分析 1.2 解决步骤 1.3 去掉微信小程序推广的相关功能 II 蓝牙权限(2.1)被拒绝上架的案例 2.1 拒绝原因 2.2 解决方案 III ...

  2. iOS时间转换相关整理(附送试用期逻辑处理)

    对于时间转换我们并不陌生,只是不同的后台风格不同,我们请求回来的时间格式也不同! 现整理时间相关点: //从1970年开始到现在经过了多少秒-(NSString *)getTimeSp{NSStrin ...

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

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

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

    为什么80%的码农都做不了架构师?>>>    IOS7 WGS-84转GCJ-02(火星坐标) CLLocationManager类可以实时的获得我们位置的经纬度,并且可以通过经纬 ...

  5. IOS 地球坐标-火星坐标-百度坐标 转换

    如果你正需要这样的工具,保证拿过去就能用 如果你还不知道这是什么工具,我保证以后的iOS开发中肯定会用 如果你是iOS大牛,期待您能指点一下 ^_^ 好了,废话不多说了.上干货 坐标系介绍 首先介绍一 ...

  6. iOS端矢量图解决方案汇总

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者 | 小猪  来源 | 小猪的博客 https: ...

  7. 微信小程序image组件开发程序以及相关图片问题参考资料汇总

    微信小程序image组件开发程序以及相关图片问题参考资料汇总,希望对大家小程序开发能有一定的参考和借鉴价值.以下汇总主要涉及到微信小程序image组件有关资源路径.缩放和剪裁模式等进行的探讨,无论是对 ...

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

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

  9. 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系互转

    为什么写这个模块 随着移动互联网的兴起,几乎每一个app都会去收集用户位置,如果恰好你在处理与地理定位相关的代码,并且不了解地理坐标系的话,肯定要被我大天朝各种坐标系搞晕.写这个模块的目的也是因为项目 ...

最新文章

  1. DB2 9 使用拓荒(733 检讨)认证指南,第 2 部分: DB2 数据操作(6)
  2. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)...
  3. 整理一下linux系统expand 命令
  4. maven 插件的应用
  5. Python是否具有字符串“包含”子字符串方法?
  6. 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程
  7. 华为手机卡在升级界面_你的华为手机变卡了,1分钟调整这3个功能,让手机再战3年...
  8. LookAheadEnumerator:在解析器中实现回溯
  9. webstorm注释写出的提示
  10. 8种开源情报(OSINT)工具简介
  11. 2020-05-26
  12. 腾讯云服务器入门使用流程 新手必看教程
  13. 使用Viewpager Indicator实现图片无限轮播
  14. iOS 启动优化和安装包瘦身
  15. 一块宝藏存储芯片【SD NAND】
  16. Android之WebView的使用与简单浏览器
  17. php开源记账,php记账
  18. 5张图带你了解Pulsar的存储引擎BookKeeper
  19. 计算机网络学习——王道教材书(持续更新)
  20. gitlab中国官方网站

热门文章

  1. 车用计算机电路板,使用车充、LED头灯电路板制作1.5V电源模块(可代替1号电池)...
  2. java毕业设计校园招聘系统设计mybatis+源码+调试部署+系统+数据库+lw
  3. 可以免费批量Excel转PDF的在线转换工具
  4. Chrome+selenium+headless报错无法加载插件
  5. Apache Druid安装部署手册
  6. 湖北省武汉汽车上牌篇2008年完整上牌程序供参考
  7. 最大规模开源说话人识别语料集——VoxCeleb
  8. web学习一——We简介、Tomcat、HTTP协议
  9. MIPI 系列之 D-PHY
  10. Word标准简单格式