怎么可以让自己的gpsgps定位偏差修正算法在一万米以上

1881人阅读
嵌入式(7)
GPS型号:SIMCOM7100C
最近在做gps定位这块,发现经纬度定位并不准确,偏差的有点离谱。网上查了好多资料,各种坐标系之间相互转换。
在地图上输入转换后的经纬度,偏的不是一点半点。
后来发现是转换前的数据源需要转换。
这是从gps模块获取到的源数据,它是属于地球坐标系的
+CGPSINFO: ,N,,E,450.0,77.6,0.0,181.0
它表示北纬39度58.472727分,东经116度19.957711分 这种格式并不是常见的那种度、分、秒也不是小数度数。它是度十进制分!!!
需要转换为小数度数才能进行地球坐标转火星坐标
转换方法很简单 如上 转换为 39°+58.=39.°
然后就可以用它来进行转换了。
转换 算法如下:
#include &stdio.h&
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &unistd.h&
#include &string.h&
#include &termios.h&
#include &errno.h&
#include &sys/ioctl.h&
#include &stdlib.h&
#include &math.h&
#include &stdbool.h&
static double x_pi = 3.79324 * 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_
& & 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;
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;
// GPS转高德(火星坐标系)&
int transform(double wglat, double wglon, double *mglat, double *mglon)
& & const double a = ;
& & const double ee = 0.;
& & 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 *
& & 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 +
& & *mglon = wglon +
& & return 0;
转完之后就可以在地图上输入经纬度定位了,另外编译的时候需要加上 -lm参数。测试误差基本在十米之内。前提是你获取到的GPS数据是准确的。怎么确定是否准确呢,可以同步谷歌地球(很吊的软件)来确定。
1、选择工具、进入选项界面
2、设置为度十进制分
3、点击添加地标选项
输入经纬度
4、双击我的地点,就定位到了
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:86533次
积分:1520
积分:1520
排名:千里之外
原创:54篇
转载:53篇
评论:15条
(1)(3)(1)(3)(5)(1)(2)(1)(1)(8)(4)(2)(5)(1)(3)(3)(3)(1)(1)(6)(4)(7)(14)(9)(13)(5)LBS定位偏差太大? - 知乎23被浏览5813分享邀请回答13 条评论分享收藏感谢收起211 条评论分享收藏感谢收起查看更多回答为啥我从GPS获取的原始坐标显示在高德地图上会出现偏差,有遇到类似情况的朋友吗? - 知乎12被浏览2003分享邀请回答72 条评论分享收藏感谢收起君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
GPS主要误差源有哪些_上_
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 幸存者偏差 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信