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

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 <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.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、双击我的地点,就定位到了


猜你喜欢

转载自blog.csdn.net/a_tu_/article/details/52948341
今日推荐