GPS定位不准确、有偏差的问题 您所在的位置:网站首页 微信定位获取位置失败的原因是什么 GPS定位不准确、有偏差的问题

GPS定位不准确、有偏差的问题

2024-07-06 21:41| 来源: 网络整理| 查看: 265

转自: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 实验室设备网 版权所有