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