6686| 3
|
GPS模块使用 FAQ |
楼主近期使用了DFRobot公司的两块GPS模块。一块是GPS/GPRS/GSM模块V3.0(TEL0051),另一块是DFRduino GPS Shield-LEA-6H(TEL0044),使用的过程中出现了很多问题,也对GPS的知识有了初步的了解。 本帖将主要解决在GPS模块使用的过程中出现的一些问题,对于模块的工作原理将不做进一步说明。 问题一:在浦东进行的定位,为何在地图上却是闵行? 这个涉及到了GPS的单位转化问题,在GPRMC协议(以上提到的两块GPS模块所使用的协议)中,$GPGGA一行的第三位和第五位为GPS收集到的经纬度信息,如楼主在浦东软件园Y1座进行GPS测量,收集到的GPRMC信息中的$GPGGA一行信息如下: $GPGGA,062351.000,3112.136400,N,12135.895059,E,1,4,2.92,29.357,M,8.341,M,,*5B 其中3112.136400,N,12135.895059,E即为经纬度信息。 该经纬度的格式为ddmm.mmmmmm,其小数点前倒数两位为分,小数点倒数两位之前的数字为度,小数点后的数字为分的小数位。这个格式一不是单纯的小数制的单位换算,二也不是我们熟悉的度分秒的单位秒转换,而是单纯的度分转换。所以得到的数据的具体含义为,当前点的经度为东经121度35.895059分,北纬31度12.136400分。了解了这个也就可以理解了为什么明明在浦东却定位在闵行了。 地图中的经纬度单位为度,比如百度地图的坐标拾取系统中,天安门的经纬度为116.40386,39.915291,其含义为东经116.40386度,北纬39.915291度。地图所使用的经纬度和GPRMC中的经纬度有单位的差距,如果没有经过换算就使用的话就会造成偏差。比如在坐标拾取系统中输入121.35895059,31.12136400。然后再进行单位转换,即121+35.895059/60=121.598251;31+12.136400/60=32.202273。在坐标拾取系统中输入121.598251, 31.202273。将两次结果整合到一张图中即可理解为何明明在浦东测量的GPS反而定位到了闵行。 ![]() 在具体的使用过程中我发现出了GPRMC协议使用度分的格式之外,其他地方所使用的皆为度的单位。其中百度的标准为经度在前,纬度在后,谷歌的标准为纬度在前,经度在后。使用时需记得区分。 问题二:为何在地图上显示出来和我测量的位置相差了一千米左右的距离?是因为GPS模块不精确么? 这个涉及到了地图的参考点的问题,具体的内容无需了解,只需要了解的是现如今,在国内一共有三种坐标系,第一种为大地坐标系统WGS-84,第二种为火星坐标系统GCJ-02,第三种是百度坐标系统BD-09。第一种即为全球通用的坐标系统,GPRMC中的经纬度信息即按照该坐标系统选取,第二种为国家保密加偏后的坐标系统,即对真实的坐标系统进行了人为的加偏处理,国内很多地图公司(除百度地图)的坐标系均为此坐标系,第三种是百度在火星坐标系统上又进行了一次加密。网上有很多的算法,可以在各种坐标系之间进行转换,但是楼主使用下来之后感觉还是百度提供的坐标转换API最为方便好用。因为在百度的自己的官方文件中也曾提到,可能会因为时间的不同在定位出来的点上面有一些偏差,这说明百度坐标系的加密算法可能并不是固定的。由于百度坐标系算法并不开源,所以楼主也不敢下更多结论。百度地图坐标转换的API链接为:百度坐标转换。转换结果如下图: ![]() 参考信息: |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed