关于地图坐标和定位偏差
实验背景:
研究并比较,三种定位结果(主要是讨论GPS定位):
1Google Maps + Android API的定位
2.百度地图SDK+百度定位SDK
3.高德地图SDK+高德定位SDK
测试条件:国产Android手机。
定位结果:
2和3都比较靠谱,定位精度符合预期(室外GPS定位误差在10米以内),当然由于百度和高德的定位SDK中一般是混合定位,会结合利用网络定位和后台数据支持什么的。
1的定位结果基本无效,显示的位置和在地图上标记的位置会有几十米的差距。
虽然谷歌地图可以同时注册多种定位方式,比如GPS和网络定位同时开启,然后手动编程选择最佳位置,但是网络定位的精度太低,GPS的精度虽然高但是存在固有偏差(精确但不准确),所以无法拯救这种位置偏差。
原因分析:
由于国家测绘局的规定,地图坐标必须加密,加入随机的偏移。至少需要满足的一个标准叫GCJ-02。
GCJ-02参见百度百科:
GCJ-02是由中国国家测绘局制订的地理信息系统的坐标系统。
它是一种对经纬度数据的加密算法,即加入随机的偏差。
国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。
Google Maps为什么出错:
Google Maps的原生坐标是WGS-84,国际坐标,但是中国区域的部分,为了符合中国测绘法律规定,加入了偏移,满足了GCJ-02标准。
而Android API得出的定位结果值,是GPS读出的,是没有加入偏移的,是WGS-84坐标。
所以坐标体系的不对应导致了误差。
百度地图为什么是对的:
百度定位SDK部分介绍
(http://developer.baidu.com/map/geosdk-android-classv4.0.htm#import.E7.9B.B8.E5.85.B3.E7.B1.BB)
可以通过public void setCoorType ( String )方法定义返回位置值的坐标类型。
支持返回若干种坐标系,包括国测局坐标系、百度坐标系,需要更多坐标系请联系百度。
目前这些参数的代码为
返回国测局经纬度坐标系 coor=gcj02
返回百度墨卡托坐标系 coor=bd09
返回百度经纬度坐标系 coor=bd09ll
百度手机地图对外接口中的坐标系默认是bd09ll,如果配合百度地图产品的话,需要注意坐标系对应问题。
相关问题:
国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。
百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。
百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。
高德地图的处理方式
大致也是和百度类似的:
http://developer.amap.com/location/faq
高德地图的对外提供的坐标都是经过国家测绘局加密处理的,符合国家测绘局对地理信息保密要求,因此如果使用GPS获得的原始坐标在高德地图显示,会有偏差,需要将原始坐标经过加密转换,转化为高德坐标。
一些参考资料:
(也不知道靠谱不)
http://kongxz.com/2013/10/wgs-cgj/
转换算法:http://blog.csdn.net/coolypf/article/details/8686588
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了