Android LBS地图开发基础知识之地球地理GPS坐标系经纬度偏移偏差

通常,我们所说的地球地理经纬度是WGS-84坐标系(World Geodetic System-1984 Coordinate System)的经纬度。WGS-84坐标系是在1984年制定的全球坐标系,这个坐标系上的每一点经纬度能够精确映射到地球表面的任意一点。我们中学地理教科书中所讲述的地理坐标系其实就是WGS-84坐标系。WGS-84坐标系为GPS而生,是全球通用的坐标系。

然而,在中国大陆,所有民用和商用的坐标系都不是WGS-84坐标系,而是GCJ-02坐标系(有些地图供应厂商可能在GCJ-02基础二次深度开发形成自家所有的多形式、多标准的地图坐标系,比如百度经纬度坐标系标准bd09ll)。什么是GCJ-02坐标系呢?GCJ-02坐标系是中国国家测绘局2002年制定的、不同于WGS-84坐标系的、中国大陆境内民用和商用经纬度的坐标系。

GCJ-02坐标系不同于WGS-84坐标系在什么地方呢?

“GCJ-02是由中国国家测绘局制订的地理信息系统的坐标系统。它是一种对经纬度数据的加密算法,即加入随机的偏差。国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。”

GCJ-02坐标系最关键的地方,概括起来:如果说WGS-84坐标系是地球地理表面某一点真实的经纬度坐标系,那么GCJ-02坐标系是在WGS-84坐标系基础上,把WGS-84真实的经纬度坐标点随机添加一定经纬度偏移量(偏移量计算算法相当复杂,不是简单的随机)而形成的“不真实”的经纬度坐标系。GCJ-02坐标系因此也被称为火星坐标系。

WGS-84坐标系到GCJ-02坐标系,最核心的地方就是偏移量的计算和添加,偏移量算法目前没有公开资料,据传闻下面一段算法是WGS-84到GCJ-02处理纬度偏移量的一小节算法:

-100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x)) + (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0 + (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0 + (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0

算法相当精巧,该算法目的是保证在WGS-84坐标系添加一定偏移量形成GCJ-02的过程中,输出结果是连续、单调的,每一个WGS-84坐标系的坐标点经过GCJ-02偏移量算法处理后的坐标点是唯一的、一一对应的,只有这样才能保证GCJ-02即便不是真实的经纬度坐标,但是偏移形成后的GCJ-02依然可以完整显示地图。该算法不可逆,无法找到反函数,即便拿到输出结果,也无法推导真实函数工作原理。但是有些人通过GCJ-02偏移量算法输出的值,经过复杂的数量计算和分析,也是可以大概模拟偏移量算法,但还是存在不小误差。

下图(网传)大体上较为模糊的显示了经过偏移量算法处理后的偏移量值,红色最大,蓝色最小。GCJ-02坐标系将WGS-84坐标系偏移了一定距离,偏移距离在数百米以内,不超过1000米。偏移量越大,意味着定位越不准确,偏移量越小,意味着定位越准确,换言之,偏移量为0即是真实的WGS-84坐标系:

中国国内民用商用的地图供应商和服务商,都至少是基于GCJ-02开发的。但GCJ-02明明不是真实的坐标系,那为什么显示的是真实正确的呢?是因为火星坐标系必须配上国内的火星地图,才能在表面上看上去是“真实、正确”的。比如百度,百度地图上给出的某点的坐标系都是处理后的火星坐标系,不是真实的。百度在自己的官方网站(http://developer.baidu.com/map/question.htm)给出了文档加以说明:

节选一段百度官方网站的文档内容:

2 坐标体系

2.1 坐标体系是否遵循国家对地理信息保密要求?

百度对外接口的坐标系,都是经过国家测绘局加密处理,符合国家测绘局对地理信息保密要求。

2.3 百度坐标为何有偏移?

国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。

2.4 如何从其他体系的坐标迁移到百度坐标?

开发者可以使用坐标转换接口进行转换。JavaScript API 、Android SDK、iOS SDK的开发用户可直接调用相应方法进行转换。

百度已经开放API接口,提供不同标准的经纬度坐标系转换(纠偏)。百度官方的不同坐标系经纬度转换(纠偏)地址:http://developer.baidu.com/map/changeposition.htm

也有一些其他厂商提供的坐标系转换API接口,比如这个网站提供的GPS火星坐标转换纠偏接口:

http://www.zdoz.net/apiList.html

关于经纬度偏移偏差,还有一个重要情况需要在LBS开发时候引起注意,是关于GPS硬件模组本身的,分两类情况,黑盒测试发现,据推测也许应该存在(真实情况有待进一步论证):

(1)中国大陆境内经过正规行货渠道发售的智能手机。这类手机自带的GPS硬件模组,返回的GPS经纬度值不是真实的,也是经过一定偏移量算法处理后的经纬度。这是因为GPS模组在硬件级别的偏移量处理导致。这类国内行货手机的GPS模组在收到GPS卫星返回的真实WGS-84坐标系经纬度后,执行偏移量算法处理成GCJ-02经纬度之后,此时才将GCJ-02经纬度返回给上层软件系统。

(2)国外发售的手机(或者水货),不是国家正规途径许可的手机。由于这类智能手机目标市场不是中国,自身的GPS硬件模组收到WGS-84坐标系经纬度后不做任何偏移量处理,直接返回给上层软件,那么这种情况下,这类手机得到的经纬度是真实的WGS-84坐标系经纬度。但是,如果在中国大陆境内使用这类手机,把底层GPS硬件模组返回的真实WGS-84经纬度交给国内厂商的地图直接定位,也是会出现偏差,原因是国内地图厂商的地图是基于火星经纬度坐标系的!如果不做经纬度转换,国内的地图直接将真实的WGS-84坐标系经纬度误以为是火星坐标系经纬度进行定位,当然会出现偏差!



android 地球坐标 火星坐标系,Android LBS地图开发:地球地理GPS坐标系经纬度偏移偏差...相关推荐

  1. Android LBS地图开发:地球地理GPS坐标系经纬度偏移偏差

    本文作者:ZhangPhil 欢迎各位转载!但请注明转载出处: http://blog.csdn.net/zhangphil/article/details/48024831 Android LB ...

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

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

  3. android 地球坐标 火星坐标系,IOS开发入门之iOS开发火星坐标系与地球坐标系解析...

    本文将带你了解IOS开发入门iOS开发火星坐标系与地球坐标系解析,希望本文对大家学IOS有所帮助. iOS开发火星坐标系与地球坐标系解析. 在开发过程中,遇到一个问题,安卓和iOS传同样的经纬度给后台 ...

  4. [转]地球坐标 火星坐标 百度坐标 相互转换

    在开始这个题目之前,先给大家再次扫扫盲,扫的不是坐标系统的盲,而是我们国家所使用的坐标系统.大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际 ...

  5. 地球坐标 火星坐标 百度坐标 相互转换

    在开始这个题目之前,先给大家再次扫扫盲,扫的不是坐标系统的盲,而是我们国家所使用的坐标系统.大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际 ...

  6. 离线地图开发下实现GPS定位,坐标纠偏回放,偏离路线

    一.GPS坐标转换(通过离线算法调用,各类坐标系之间的转换) GPS设备标准坐标采用WGS-84坐标系或北斗导航,需要通过坐标系之间转换才能准确定位到地图上,通过js接口算法函数可简单实现坐标系之间的 ...

  7. 谷歌地图开发:地理编码和反地理编码

    谷歌地图Geocoding说明:内容主要来自谷歌官网的文档,谷歌地图android api地理和反地理编码反应迟钝内容有时不准确,这里使用的googlemap的webapi接口.嗯,需要vpn这个不多 ...

  8. 高德地图的逆地理编码 | 将经纬度坐标转化为对应的地理位置

    官网 地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图API 官方解释:地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬 ...

  9. oracle查询坐标在范围之内,lbs中从库中查询某经纬度2KM范围内的数据

    sql语句查询经纬度范围 指定一个经纬度,给定一个范围值(单位:千米),查出在经纬度周围这个范围内的数据. 经度:113.914619 纬度:22.50128 范围:2km longitude为数据表 ...

最新文章

  1. c语言增强,C语言提高-day5
  2. 汇编: 描述内存长度
  3. OSS全球传输加速开启公测,助力企业业务全地域覆盖...
  4. Servlet中的HttpServlet
  5. nginx在Centos下的安装,转:http://www.linuxidc.com/Linux/2016-09/134907.htm
  6. python request file upload_Python request 上传文件
  7. 使用Scikit-learn,Spotify API和Tableau Public进行无监督学习
  8. python100以内自然数之和_python教程:利用while求100内的整数和
  9. arduino机器人设计与制作_百元搭建人工智能自主导航机器人
  10. ajax调用后台java方法,jquery ajax再次封装,前台调用后台java方法直接返回数据
  11. Java Eclipse下载安装教程
  12. 集团企业税务管理浅析
  13. 什么是单子?Java开发人员的基本理论
  14. 安装Activemq5.13.2异常
  15. 阿里云远程桌面连接不到的问题
  16. hive分区表之insert overwrite 注意事项
  17. Android 拨打电话各安卓版本适用
  18. C语言项目二:电阻并联
  19. 第一个OGSI程序出了此错
  20. [转]情侣相处最佳模式

热门文章

  1. 给你的员工一个可期许的未来(by leo)
  2. wifi认证取消html查看器,wifi网页认证怎么设置
  3. Foxmail提示错误421 too many connections【企业邮箱申请】
  4. AI在零售业的五大应用场景:消费者喜欢苹果时,不要给他一箱梨
  5. GBase XDM用户管理
  6. 深入解读云场景下的网络抖动
  7. 1.3.14 路由器 OSPF 动态路由配置
  8. nova系列可以升级鸿蒙吗,鸿蒙官网再度放出新消息,华为nova 6系列以上7款机型可以升级...
  9. 关于torch.bmm()函数计算过程
  10. c语言printf显示变量,零基础学C语言 笔记一 变量 printf