|
最近使用龙尚的4G模块(U9300C)做GPS定位功能!
ps:U9300C的gps天线区分了有源跟无源的!
一、首先获取GPS信息是通过AT指令获取的,这个可以参考(U9300_1_9x07平台_AT手册_V5.3.9.pdf)
二、GPS信息解析
1、通过4G模块获取到最原始的gps信息如下
- +GPSNMEA:
- $GPGGA,024922.00,3011.501542,N,12011.789043,E,1,10,0.6,41.7,M,7.0,M,,*674
- $GPRMC,024922.00,A,3011.501542,N,12011.789043,E,0.0,83.6,190520,4.4,W,A,V*665A
- $GPVTG,83.6,T,88.0,M,0.0,N,0.0,K,A*2E2B2B
- $GNGSA,A,2,75,76,86,87,88,,,,,,,,0.9,0.6,0.7,2*396,0.7,1*3E,,1*484,24,1*7
复制代码
2、经度和纬度信息如下
经度:12011.789043
纬度:3011.501542
3、首先将最原始的gps信息转为WGS84(GPS)坐标
参考地址如下
获取NMEA经纬度转换为百度地图API需要的数据https://blog.csdn.net/HeGuang68207/article/details/81814718
转换概率论公式如下
GPS模块输出的数据是NMEA格式,其中GPGGA字段包含我们需要的经纬度信息。
例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,12.2,M,19.7,M,,0000*1F
其中 4250.5589,S,14718.5084,E 就是经度和纬度数据,其格式是
纬度:ddmm.mmmmm(度分)
经度:dddmm.mmmmm(度分)
===========================
转换概率论公式 dd.ddddd = dd + mm.mmmm/60。
===========================
转换的C语言代码如下
double gpsNameToWgs84(double lon_temp) { long lon_Onenet = 0; int dd_int = 0; long mm_int = 0; double lon_Onenet_double = 0;
lon_Onenet =lon_temp*100000;
dd_int = lon_Onenet/10000000;
mm_int = lon_Onenet%10000000;
double long_mm = (double)mm_int/6;
lon_Onenet_double = dd_int + (double)mm_int/60/100000; return lon_Onenet_double; }
上面经度 12011.789043
120 + (11.789043)/60 = 120.19648405
---------------------------------------------------------------
上面纬度 3011.501542
30 + (11.501542)/60 = 30.19169236666667
转换以后得到的WGS84坐标(120.19648405,30.19169236666667)
4、前端使用的是百度地图,所以还需要将上面的WGS84坐标转换
参考帖子如下
百度坐标转换,以及国测局、WGS84(GPS)坐标系之间的转换札记
我这边参考的是wgs84tobd09
- /**
- * WGS84 转换为 BD-09
- * @param lng
- * @param lat
- * @returns {*[]}
- *
- */
- public String wgs84tobd09(double lng, double lat){
- //第一次转换
- double dlat = transformlat(lng - 105.0, lat - 35.0);
- double dlng = transformlng(lng - 105.0, lat - 35.0);
- double radlat = lat / 180.0 * PI;
- double magic = Math.sin(radlat);
- magic = 1 - ee * magic * magic;
- double sqrtmagic = Math.sqrt(magic);
- dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
- dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
- double mglat = lat + dlat;
- double mglng = lng + dlng;
- //第二次转换
- double z = Math.sqrt(mglng * mglng + mglat * mglat) + 0.00002 * Math.sin(mglat * x_PI);
- double theta = Math.atan2(mglat, mglng) + 0.000003 * Math.cos(mglng * x_PI);
- double bd_lng = z * Math.cos(theta) + 0.0065;
- double bd_lat = z * Math.sin(theta) + 0.006;
- return bd_lng+","+bd_lat;
- }
- private double transformlat(double lng,double lat){
- double ret= -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
- ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
- ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
- ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
- return ret;
- }
- private double transformlng(double lng,double lat){
- double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
- ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
- ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
- ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
- return ret;
- }
- 版权声明:本文为CSDN博主「zhg_vincent」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- 原文链接:https://blog.csdn.net/Vincent2014Linux/article/details/98217524
复制代码 改写成C语言以后的代码如下
- static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
- static double PI = 3.1415926535897932384626;
- static double a = 6378245.0;
- static double ee = 0.00669342162296594323;
复制代码
转换成百度地图能识别的坐标(120.20758246,30.19511710)
|
|