app定位、地图、坐标系的那些坑

2023-05-16

原文地址:  http://www.jianshu.com/p/f8224779ca63

开发App时会遇到各种坑,本文分享我们在iOS/Android系统中定位和地图中遇到的坑,以及携程App的解决方案。

定位


定位即获取用户当前经纬度,iOS平台都是通过系统SDK接口获取的,因此所有App获取定位及精度的能力是相同的,即使Google Maps、百度地图、高德地图这种专业地图App也是如此;Android平台由于Google Service被阉割,国内App通常是通过高德、百度等第三方SDK接口获取定位信息,因此在定位能力和精度上会有些差异。

坐标系问题

App定位遇到的第一个坑是坐标系问题。目前常见的坐标系有三种:地球坐标(WGS84,国际公认坐标),火星坐标(GCJ02,国家标准,适用于高德百度地图大陆+港澳部分、Google地图大陆部分),百度坐标(BD09,适用于百度地图大陆+港澳台部分)。坐标系需要和地图关连才有意义,只有正确匹配地图坐标系的坐标才能在该地图上完美标识位置,否则就会存在偏移。另外对于旅行类App而言,经常需要根据用户当前位置查询周围酒店或者其他POI信息,并且按距离排序,如果坐标系不匹配,就会由于坐标系偏移产生排序问题。

iOS系统上通过定位服务CLLocation相关接口获取定位信息时,获取的经纬度坐标系是WGS84地球坐标,如果直接将该坐标系在iOS系统地图中打点,会发现存在偏移,因为iOS系统地图查看国内时使用的是高德地图数据(这里有另一个坑,详见下文),因此只接受GCJ02火星坐标。如果使用高德或者百度iOS定位SDK中的接口,是可以直接获得火星偏移后的坐标的,由于App Size问题,携程App没有集成第三方SDK,而是通过近似偏移算法直接做偏移(自行Google『transform From WGS To GCJ』)。然而如果在iOS系统地图中获取当前位置,同时在国内,那么获取到的坐标系直接是GCJ02火星坐标系,这点需要小心。

Android系统上通常使用高德或者百度定位SDK获取定位信息。高德SDK没有坐标系参数设定,在大陆和港澳地区获取的坐标系即为GCJ02坐标系,在台湾和海外地区都是WGS84坐标系;百度SDK可以自行设定坐标系参数,即返回WGS84坐标系,还是GCJ02坐标系或者BD09坐标系(注意BD09坐标系只适用于百度地图),如果设定的是GCJ02坐标系,它在大陆+港澳台地区获取的坐标系都是GCJ02坐标系。

海外地图(非大陆和非港澳台地区)是没有火星坐标或者百度坐标之说,都是标准的WGS84地球坐标系。

精度问题

第二个常见的坑是定位精度问题,经常有用户或者Boss反馈,为什么两台一样的手机,获取的当前位置不一样?我明明在这个位置,为什么定位却显示在附件另一个位置,相差那么远?

这类问题的根源是手机不同定位方式导致的,通常手机定位方式有三种:

1. GPS:根据系统GPS模块获取经纬度,精度10-100米左右,限制是容易受环境影响,在室内几乎不起作用。

2. 基站:根据运营商基站位置计算经纬度,精度1000-3000米左右,限制是定位较慢,精度差。

3. WIFI:根据周围WIFI路由器位置计算经纬度,精度100-200米左右,限制是受周围WIFI数量和分布影响,需要打开手机WIFI开关。

如果用户没有打开WIFI开关,定位的精度会受到极大的影响,下图是同一部iPhone手机在相同位置,百度地图在打开或者关闭WIFI场景下的效果对比,直观反映出是否打开WIFI开关对于定位精度的影响。携程iOS App的用户统计数据显示37.1%在非WIFI情况下定位精度超过了1000米,因而用户会感觉偏移很厉害。


打开WIFI

关闭WIFI

一定会有同学疑问,开车导航时周围通常没有WIFI,为什么地图软件可以精确的把用户当前位置显示在道路上。那是因为在导航模式下,用户的运动速度和方向信息是可以获取的,导航算法会将用户位置重新计算后定位在道路上,如果把车停在路边,关闭WIFI,一样有可能偏移很严重。

地图


App地图同样存在坐标系和精度问题。前面说过在地图里显示坐标点时,需要匹配正确的坐标系,否则就会产生偏移。

iOS平台的系统地图就存在数据源地图坐标系导致的一个大坑,iOS系统地图App以及系统地图组件MKMapView的数据源分为两种:高德数据源和TomTom数据源。最坑的是iOS地图使用的数据源和当前手机所处的位置是相关的:

如果手机在大陆地区,iOS地图使用的是高德地图数据源:此时用户查看大陆和港澳台地图细节信息时,使用的是GCJ02火星坐标系,同时地图显示精度很高,但是看海外地图时,由于数据源问题精度就会很差(坐标系是WGS84),例如下图看新加坡,如果你要在地图中显示POI打点,效果可想而知。


iOS海外地图

如果手机在港澳台和海外地区,iOS地图使用的是TomTom地图数据源,该地图匹配的是WGS84地球坐标系,如果用户在海外查看国内地图,同时你的POI打点坐标系是GCJ02火星坐标系,那么就会产生偏差;另外手机在港澳台和海外地区时查看港澳台和海外的地图数据精度很好,然而查看国内地图便会精度偏低。

因此要想在iOS地图中正确打点,就需要先行判断使用的地图数据源,以及对应的坐标系,同时使用的POI坐标系务必与地图坐标系匹配,否则就会出现偏差。下图是旅行类App显示香港一家酒店的POI打点,可以看出除了携程外其他App都有偏差,其中三家偏差的方式还是一样的,原因应该是他们服务端仅保存了这家酒店的WGS84地球坐标系坐标。


POI显示对比

Android平台我们使用的是百度地图(高德地图情况相同),然而百度地图在大陆+港澳台地区的数据源精度是正常的,海外地区的精度就和iOS平台下高德数据源在海外的精度类似,不够详尽(百度在日韩地区的地图精度已经变好,数据源的精度提升确实需要一个过程)。我们的解决办法是开发WebView版的Google地图组件,载入ditu.google.cn,见下图效果。


Android自定义WebView地图

前面提到的iOS系统地图精度问题我们也是用相同方法解决的,只是显示时处理逻辑更复杂,人在国内看国外地图,人在国外看国内地图两种情况就会使用自定义Google地图替代,其他情况下继续使用系统地图。


iOS自定义WebView地图

WebView版地图虽然操作体验比Native地图差一些,但是显示数据源精度高很多,对用户价值更大。

综述


App定位和地图存在问题其实都是国内地理信息特殊标准导致的,我们只能使用一些tricky的方式解决,一切都是为了部落,不对,为了用户:)

欢迎关注携程无线技术公众号『CtripMobile』:

文/hrchen(简书作者)
原文链接:http://www. jianshu.com/p/f8224779ca63
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

app定位、地图、坐标系的那些坑 的相关文章

随机推荐

  • 找出4*5矩阵中值最小和最大元素,并分别输出其值及所在的行号和列号 java

    package 矩阵 import java util Scanner public class 矩阵 public static void main String args TODO Auto generated method stub
  • 将python程序打包成exe可执行文件

    方法一 xff1a xff1a 打包完成后可以直接被他人使用 xff0c 他人不用安装python环境的 可以使用pyinstaller模块实现将python项目打包成exe执行文件 span class token triple quot
  • latex 如何在overleaf中插入算法伪代码

    问题描述 博主今天在用overleaf写论文 xff0c 急需插入伪代码 xff0c 将查阅结果记录在此以便后续参考 解决方案 overleaf有专门的说明文档来教大家如何正确插入伪代码 xff1a https www overleaf c
  • 手把手教你一整套R语言数据分析+建模流程

    手把手教你一整套R语言数据分析 43 建模流程 Intro项目背景前期准备数据描述数据清洗预分析及预处理数值型数据类别型数据 特征建模模型对比 Intro 近期在整理数据分析流程 xff0c 找到了之前写的一篇代码 xff0c 分享给大家
  • (工具技巧) —— Visual Studio Code页面放大缩小和字体的调整方式

    文章目录 Visual Studio Code页面放大缩小和字体的调整方式使用方式个人格言 Visual Studio Code页面放大缩小和字体的调整方式 使用方式 在日程的使用过程中 xff0c 有需要对Visual Studio Co
  • Centos7.8 安装 openldap+phpldapadmin 最详细步骤

    本文借助很多网上知识 做一个汇总 xff0c 并且自己手动一步步安装 很多openldap安装都是0几年的安装方式 xff0c 下面给大家演示我一步步安装的详细过程 xff0c CentOS7系统安装就不做演示了 xff0c 直接开肝 这里
  • Apache配置中文说明

    APACHE的配置 xff08 中文 xff09 基于 NCSA 服务的配置文件 这是Apache服务器主要配置文件 它包含服务器的影响服务器运行的配置指令 参见以取得关于这些指令的详细信息 不要只是简单的阅读这些指令信息而不去理解它 这里
  • ubunut 18.04安装xrdp及pulseaudio-module-xrdp

    1 桌面环境 sudo apt install xfce4 2 xrdp服务 sudo apt install xrdp 参考 xff1a xrdp 3 远程声音重定向 确认pulseaudio版本为11 1 pulseaudio vers
  • ios8 新的AlertView

    转自cocoachina OS 8的新特性之一就是让接口更有适应性 更灵活 xff0c 因此许多视图控制器的实现方式发生了巨大的变化 全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸变化
  • Debian 系统时间配置(NTP)

    系统时间NTP和RTC同步 xff0c Debian的时区配置 系统及架构 xff1a Linux Matrix 061001 5 10 42 yocto standard 1 Thu Jun 3 07 00 52 UTC 2021 arm
  • ubuntu之VScode

    文章目录 0 安装1 配置中文2 插件 xff08 推荐使用 xff09 3 conda4 matlab5 fira字体设置6 字符显示配置7 terminal自定义颜色配置8 环境变量 xff1a terminal runner问题9 复
  • PPT中一打开输入法后就卡死

    解决办法 C Program Files Common Files xff08 x86 xff09 Microsoft Shared OFFICE12 Office Setup Controller xff0c 把这个文件夹删除即可
  • LaTex 使用plt.savefig保存矢量图并插入论文中

    问题描述 今天开始给实验结果画图了 xff0c 总觉得使用png格式的图片糊糊的 xff0c 于是决定研究一下如何将矢量图插入Latex中 解决方案 由于我需要插入的图片是使用python绘制的并通过plt savefig保存下来 通过参考
  • AD18中制作自己的原理图模板

    新建原理图 xff0c 在原理图上使用画线等工具做出自己想要的样式 xff0c xff08 如果要在模板中加入图片 xff0c 可以直接将想要的图片用鼠标直接拖到原理图中 xff09 xff0c 制作好后将原理图另存为后缀 SchDot x
  • STM32 RTC晶振不起振原因

    今天下载程序后发现程序像死机一样 xff0c 然后仿真发现 xff0c 程序一直在等待RTC晶振就绪 xff0c 最终超时死机 然后检查的电路看都没问题 xff0c 最后通过查阅资料和咨询厂家了解到可能是晶振匹配电容的原因 如下为记录 xf
  • NO Cortex-M Device found in JTAG chain常见问题及解决方法.

    昨晚调试程序时 xff0c 由于是在别人程序基础上修改的程序 xff0c 没有对照自己的硬件原理图 xff0c 导致程序下载过后就不能再继续下载 xff0c 但那个源程序 xff08 即楼主参考的程序 xff09 还是可以继续下载 xff0
  • STM32系统时钟硬件仿真查看

    前几天回校调试基于407的程序 xff0c 以前都是在别人的程序基础上面改写只要能实现想要的功能不会管其他的 xff0c 结果基本就没用用过硬件JLINK的硬件仿真 xff0c 那晚蔡师姐帮忙一直弄到夜里12点多 xff0c 真的很感谢她
  • keil里面不能修改程序或加入程序

    楼主后知后觉 xff0c 今天打开一个工程文件 xff0c 发现不能在其中的文件 xff08 含有 xff09 里添加注释和修改 几经周折后 xff0c 发现这个问题与Keil没有关系 xff0c 这个带有锁的文件属性是 xff1a 只读
  • Alutium Designer中原理图库设计时如何设置鼠标移动元器件的最小间隔

    1 点击图中菜单栏中的高亮部分 43 43 43 43 43 2 点进去后 xff0c 选择 Set snap Grid xff0c 最小设置为1mil 完成
  • app定位、地图、坐标系的那些坑

    原文地址 xff1a http www jianshu com p f8224779ca63 开发App时会遇到各种坑 xff0c 本文分享我们在iOS Android系统中定位和地图中遇到的坑 xff0c 以及携程App的解决方案 定位