GPS定位不准确、有偏差的问题 | 您所在的位置:网站首页 › 微信定位获取位置失败的原因是什么 › GPS定位不准确、有偏差的问题 |
转自:http://blog.csdn.net/a_tu_/article/details/52948341 GPS型号:SIMCOM7100C 最近在做gps定位这块,发现经纬度定位并不准确,偏差的有点离谱。网上查了好多资料,各种坐标系之间相互转换。 在地图上输入转换后的经纬度,偏的不是一点半点。
后来发现是转换前的数据源需要转换。 这是从gps模块获取到的源数据,它是属于地球坐标系的 +CGPSINFO: 3958.472727,N,11619.957711,E,140416,020450.0,77.6,0.0,181.0
它表示北纬39度58.472727分,东经116度19.957711分 这种格式并不是常见的那种度、分、秒也不是小数度数。它是度十进制分!!! 需要转换为小数度数才能进行地球坐标转火星坐标 转换方法很简单 如上3958.472727 转换为 39°+58.472727/60=39.97454545° 然后就可以用它来进行转换了。 转换 算法如下: #include #include #include #include #include #include #include #include #include #include #include #include static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; //高德转百度 static int bd_encrypt(double gg_lat, double gg_lon, double *bd_lat, double *bd_lon) { double x = gg_lon, y = gg_lat; double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi); double theta = atan2(y, x) + 0.000003 * cos(x * x_pi); *bd_lon = z * cos(theta) + 0.0065; *bd_lat = z * sin(theta) + 0.006; return 0; } // 百度转高德 static void bd_decrypt(double bd_lat, double bd_lon, double *gg_lat, double *gg_lon) { double x = bd_lon - 0.0065, y = bd_lat - 0.006; double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi); double theta = atan2(y, x) - 0.000003 * cos(x * x_pi); *gg_lon = z * cos(theta); *gg_lat = z * sin(theta); } static double transformlat(double x, double y) { double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x)); ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0; ret += (20.0 * sin(y * PI) + 40.0 * sin(y / 3.0 * PI)) * 2.0 / 3.0; ret += (160.0 * sin(y / 12.0 * PI) + 320 * sin(y * PI / 30.0)) * 2.0 / 3.0; return ret; } static double transformlon(double x, double y) { double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x)); ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0; ret += (20.0 * sin(x * PI) + 40.0 * sin(x / 3.0 * PI)) * 2.0 / 3.0; ret += (150.0 * sin(x / 12.0 * PI) + 300.0 * sin(x / 30.0 * PI)) * 2.0 / 3.0; return ret; } // GPS转高德(火星坐标系) int transform(double wglat, double wglon, double *mglat, double *mglon) { const double a = 6378245.0; const double ee = 0.00669342162296594323; double dlat = transformlat(wglon - 105.0, wglat - 35.0); double dlon = transformlon(wglon - 105.0, wglat - 35.0); double radlat = wglat / 180.0 * PI; double magic = sin(radlat); magic = 1 - ee * magic * magic; double sqrtmagic = sqrt(magic); dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); dlon = (dlon * 180.0) / (a / sqrtmagic * cos(radlat) * PI); *mglat = wglat + dlat; *mglon = wglon + dlon; return 0; } 转完之后就可以在地图上输入经纬度定位了,另外编译的时候需要加上 -lm参数。测试误差基本在十米之内。前提是你获取到的GPS数据是准确的。怎么确定是否准确呢,可以同步谷歌地球(很吊的软件)来确定。 1、选择工具、进入选项界面
2、设置为度十进制分
3、点击添加地标选项
输入经纬度
4、双击我的地点,就定位到了
|
CopyRight 2018-2019 实验室设备网 版权所有 |