关于GPS坐标系和地图定位偏差_gcj20-程序员宅基地

技术标签: WEB  

关于GPS坐标系和地图定位偏差

关于目前(2019)电子设备和电子地图定位的探索,希望可以回答如下几个问题:

1. 获取GPS位置后,为什么在地图上定位不准?

答:中国地图采用的坐标系和GPS坐标不是同一个坐标系,所以采用GPS坐标在地图上定位不准。

2. 国外GPS位置和国内GPS位置有差别吗?

答:GPS是美国的导航系统,全球通用,手机内置的芯片都是GPS芯片,没有差别。不同的地方是地图有着不同的GPS坐标系。

3. WGS84,GCJ-02, BD09坐标系如何理解?

答:借用百度的说明如下:
WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:又称火星坐标系,是由中国国家测绘局制定的地理坐标系统,是由WGS84加密后得到的坐标系。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
链接:http://lbsyun.baidu.com/index.php?title=coordinate

4. 软件开发如何应对?

坐标系是在一个系统中的参考坐标系,所以在同一个系统内不存在问题。例如,如果需要获取某一个地图上的位置,通过地图SDK就可以获得地图坐标系的位置,不存在问题。(例如,你一直都是用百度地图,定位也是通过地图定位,那么没有任何问题)如果希望在不同的坐标系上使用,必须经过转换。最好的办法是,统一采用同一个地图,不切换坐标系。例如做国内系统,用百度地图,高德地图都可以。如果做国际项目,那么最好建议采用Google地图,国外地图数据最完整,其次是百度。
Google国内外访问地址,key需要在google账号中申请(目前需要梯子)
国内:https://ditu.google.cn/maps/api/js?key=
国外:https://maps.google.com/maps/api/js?key=
关于坐标系转换,参考百度文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans


以下是相关论证过程和分析

缘起,首先来看一个问题,一个朋友在柬埔寨通过GPS软件获得一个GPS位置,发现和实际位置不准的问题,赶快查询了一下,“果然不准确”。
网上各种方法,代码,工具,理论等等……看来这个问题还很普遍嘛,可是随着我的深入查找资料和验证,发现不对!下面我们听我慢慢细说。

  1. 地图和GPS定位坐标系
    先说定位坐标系,目前国际上通用的坐标系是WGS84,参考:https://en.wikipedia.org/wiki/World_Geodetic_System,也是通过GPS获取的经纬度信息是一致的,只是表示方法的存在区别:度分秒表示,还是十进制数表示。所以通过手机获取的地理位置信息,都是GPS位置信息。目前北斗卫星定位在大众手机没有用上,就算用上,估计也是不同的坐标系。
    再来看看电子地图,为什么会存在火星坐标系呢?经过查找资料,没有找到明确的关于GCJ-02国家发布的资料,只找到我国测绘法:
    国家测绘局2002年发布的《中华人民共和国测绘法》,要求使用统一的国家测绘坐标系,参看链接:http://www.gov.cn/ziliao/flfg/2005-08/05/content_20947.htm
    GCJ-02标准最可靠的参考
    上文表达的意思是,国内采用统一的坐标系统,而且和国际坐标系统不一致。而GCJ-02标准和这一致。

关于坐标系查询,可以通过http://www.gpsspg.com/maps.htm网站查询。同时我可以发现这个网站可以通过国界线区分坐标系的换算,而网上不少代码均是通过经纬度范围简单的判断是否在中国境内,对于中国周边国家会存在问题,估计有问题。不过该网站的谷歌地图坐标有问题,估计是老版本的地图,而且也打不开google地图。
中国边境地图坐标
上图为中国云南边境
中国缅甸边境坐标
上图为中国与缅甸交界的地方。

Google地图(国际版)GPS坐标定位工具:
https://www.gps-coordinates.net
Google地图坐标定位工具
该工具可以在google地图(国际版本)上根据GPS定位,而且下发写着坐标系是WGS48。经过实际对比发现Google地图,对于中国境内采用的依然是GCJ-20坐标系。
为了验证Google地图在国内的位置依然是GCJ-20坐标系,我采用下面的方法得出的结论(有兴趣的朋友继续阅读)。


如何判断GPS坐标是WGS-48,还是GCJ-20坐标体系呢?
我发现,通过iPhone的指南针的经纬度,如果直接换算为Google地图的坐标进行设置时发现,和实际位置不相符(国内),通过Android 三款软件进行数据采集发现有相同位置不同软件具有两种经纬度信息:
GPS定位导航采用的GCJ-02坐标
GPS定位工具箱采用的也是GCJ-02坐标
GPS实时海拔采用的是WGS-84,和iPhone指南针相同的数据。
注意:表面上看,并不能确认软件采用的具体坐标系(无法通过数值区分),而是通过比较得出的结论。
我写作位置的GPS位置数据分别如下:

序号 采集设备/程序 纬度 经度 纬度 经度
1 iPhone/指南针 北纬28°15’18’’ 东经113°4’27’’ 28.255 113.0741666667
2 iPhone/GPS讯号 28.255055 113.074167
3 坚果手机/GPS实时海拔 北纬28°15’18’’ 东经113°4’26’’ 28.255 113.0738888889
4 坚果手机/GPS定位导航 28.251874 113.079874
5 坚果手机/GPS定位工具箱 28.251877 113.079878

如果把上述地址在https://www.gps-coordinates.net网页上输入,发现可以准确定位的是上表的4,5!是不是1,2,3。上面工具的网站声称采用WGS-48坐标系,而且Google Map英文文档也是采用WGS-48坐标系,那么是否可以推论4, 5就是WGS-48坐标系呢?
经过我的论证,他们恰恰不是WGS-48,而是GCJ-02!

为了论证这个设备的数值到底是哪种坐标系,煞费苦心。
后来发现百度地图的文档上说明,百度采用BD09LL坐标系,而且具有WGS-48,GCJ-02坐标转换接口,所以我对上述采集的数据通过以上两个转换方法对位置进行转换,得到百度的坐标系,然后在百度的坐标定位工具(http://api.map.baidu.com/lbsapi/getpoint/index.html)中定位,确认实际是否位置一致。
经过测试发现如下结论:

序号 经度 纬度 WGS48->BD09经度 WGS48->BD09纬度 GCJ02->BD09经度 GCJ02->BD09纬度 位置一致坐标类型
1 28.255 113.0741666667 113.08658610 28.25765828 113.08069003 28.26092783 WGS48
2 28.255055 113.074167 113.08658632 28.25771306 113.08069031 28.26098281 WGS48
3 28.255 113.0738888889 113.08630670 28.25766231 113.08041105 28.26093265 WGS48
4 28.251874 113.079874 113.09232310 28.25445936 113.08642390 28.25770832 GCJ02
5 28.251877 113.079878 113.09232718 28.25446229 113.08642791 28.257711260 GCJ02
  1. iPhone指南针软件,得到的都是WGS48坐标数据
  2. Android软件获得坐标就存在两种类型坐标系
    如果要想获得国内坐标系是否是WGS48,还是GCJ02,通过如下方法即可:
  3. 获得经纬度(用任何可用的工具)
  4. 如果需要换算,可以利用工具(http://www.gzhatu.com/du2dfm.html)
  5. 通过百度API转换,也可以通过工具查看(http://www.gpsspg.com/maps.htm)
curl "http://api.map.baidu.com/geoconv/v1/?coords=113.0741666667,28.255&from=1&to=5&ak=hfyzyfi3dAG8dRE3GBTmiqrvpt6ZEr5j"
curl "http://api.map.baidu.com/geoconv/v1/?coords=113.0741666667,28.255&from=3&to=5&ak=hfyzyfi3dAG8dRE3GBTmiqrvpt6ZEr5j"

注意:http://www.gpsspg.com/maps.htm网站的Google地图已经失效(2019.7)。

关于坐标系的图示理解:
坐标系的理解
上图解释了,通过相同坐标系就不会有问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yin138/article/details/96750897

智能推荐

Git自学笔记(本地操作)_git status -uno-程序员宅基地

文章浏览阅读629次。简介Git,目前使用最为广泛的分布式版本控制系统,由Linux之父Linus Benedict Torvalds开发。所谓的分布式版本控制系统,其实是一种管理我们代码的软件。试想,在开发过程中,我们的代码可能会经过多次迭代,版本一多,自然混乱;对于一些用不上但又不敢直接删除的的早期代码,新建文件保存或打上注释标记又太麻烦……此外,在团队协作中每个人的改动、进度的同步也是难以处理的事情。而以..._git status -uno

【Qt】:常用控件(二:QWidget核心属性)-程序员宅基地

文章浏览阅读1.1k次,点赞11次,收藏11次。cursor,font,tooltip,focuspolicy,stylesheet的使用

C++编译链接的那些小事_/home/runner/temp/41256961.42894/main.cc: in funct-程序员宅基地

文章浏览阅读957次。本文转载,尊重原创!受益良多!点击打开链接最近,有同事向我多次问及C++关于编译链接方面的问题,包括如下:1:什么样的函数以及变量可以定义在头文件中2:extern "C"的作用3:防止重复包含的宏的作用4:函数之间是怎么链接起来的我认为,这些问题不难,书上基本上都有,但要是没有真正思考过,就凭死记硬背,也就是只能“嘴上说说”而已,遇到问题还真棘手,所以我觉得有_/home/runner/temp/41256961.42894/main.cc: in function ‘int main()’:

Seata-server启动闪退问题_seata-server.batshantui-程序员宅基地

文章浏览阅读8.1k次,点赞14次,收藏17次。第一步:查看错误日志打开cmd运行seata-server.bat查看错误信息Error: missing server' JVl at C:\ Program Files (x86)\ Javaljre1. 8. 0_221\ bin\ server \ jvn. d11Please instal1 or use the TRE or TDK that contains these missing components找到出错目录搜索jvm.dll在bin文件夹新_seata-server.batshantui

android 中的service 实现之 利用onStart方式_service的onstart方法-程序员宅基地

文章浏览阅读6.4k次。service的实现主要有两种方式,一种是onStart方式,另一种是onBoundd方式。两种方式的关于service的生命周期不一样。前者是和activity的生命周期一样的,后者则不是。activity结束了service可以继续运行。onStart 方法来调用service的话,调用者其实和service是没有关系的,调用者消亡了的话,service是依然可以继续运行的;onB_service的onstart方法

数智化转型人才“大考”,综合人才成为企业“基础设施”_数智化落地,需要专业能力-程序员宅基地

文章浏览阅读302次。数智化转型的目的和核心都是实现业务转型、创新和增长,而我们的基石就是数智化技术。企业做数智化转型,需要什么样的数智化人才?员工要具备哪些能力才能助力企业完成转型?这样的员工该如何培养......首先我们来看下都有哪些数智化人才,以及他们分别需要什么能力。第一类人才是数字化专业人才,他们的主要任务是发现企业业务上的问题、并利用科学技术创造性的解决问题。对于专业人才来说,他需要有技术能力、产品能力、运营能力以及项目管理能力,具体解释为:技术能力:系统或平台规划与设计、开发与建设等_数智化落地,需要专业能力

随便推点

操作系统实验五、进程互斥实验——理发店问题_设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏52次。问题描述理发店问题:假设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过 20 人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本..._设理发店的理发室中有 3 个理发椅子和 3 个理发师,有一个可容纳

LDA主题模型进阶-程序员宅基地

文章浏览阅读553次。其实我在TF-IDF和gensim实现主题提取写过LDA关于LDA的理论相关知识以后有机会阐释import numpy as npfrom gensim import corpora,models,similaritiesfrom pprint import pprint #打印出来的更好看1.构建停用词列表def load_stopword(): f_stop=open('stopword.txt') sw=[line.strip() for line in f_stop]

ionic5+angular8混合移动开发(一)——环境搭建_ionic新建项目指定angular的版本-程序员宅基地

文章浏览阅读9.7k次。ionic5+agular8混合移动开发(一)——环境搭建1、首先安装nodejs,本次安装的是v10.16.02、解决国内连接下载npm包慢,可以配置淘宝镜像3、创建App并运行1、首先安装nodejs,本次安装的是v10.16.01.0 下载nodejs最新稳定版,下载地址如下:https://nodejs.org1.1 安装下载的node-v10.16.0-x64.msi1.2 ..._ionic新建项目指定angular的版本

3.搭建分类器-pytorch与自然语言处理_.join('%5s' % classes[predicted[j]是啥意思-程序员宅基地

文章浏览阅读1.5k次。​Python人工智能20个小时玩转NLP自然语言处理【黑马程序员】_哔哩哔哩_bilibili目的:对不同的输入图像进行识别并分类。采用CIFAR10数据集,进行单分类任务_.join('%5s' % classes[predicted[j]是啥意思

CCS编译问题之#1965 cannot open source file “DSP2833x_Device.h“_descriptionresourcepathlocationtype #1965 cannot o-程序员宅基地

文章浏览阅读3w次,点赞30次,收藏70次。#1965 cannot open source file "DSP2833x_Device.h"1. 现象2. 原因分析3. 解决措施1. 现象当使用CCS进行编译会出现如下错误。2. 原因分析因为.h文件所存放的地址与CCS中的默认位置不同引起。CCS编译器在其默认存放.h文件的地方寻找文件,但是没有找到,就会报错。源文件引用的.h文件确实不存在,当引用的头文件与意图引起的头文件..._descriptionresourcepathlocationtype #1965 cannot open source file "dsp28

dp与px转换_public class dporpxutils { public static int dip2p-程序员宅基地

文章浏览阅读1k次。/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpV_public class dporpxutils { public static int dip2px(context context, floa...

推荐文章

热门文章

相关标签