车载导航仪GPS开发基础
来源:互联网 发布:json格式解析方法 编辑:程序博客网 时间:2024/04/29 12:50
1.2.3WGS84->LLA转换问题
在分析其日志的过程中,遇到一个问题,就是TimGPS二进制日志保存的坐标数据是以WGS84大地坐标系为准的,大地坐标系的XYZ轴如下:
要得到经纬度和海拔(LLA:Longitude/Latitude/Altitude)坐标,需要一些椭球体、基准面及地图投影的知识。
后来从网上找到一个Fortune77写的WGS84->GLL换算函数,将其转成C/C++的函数:
void wgsxyz2lla(double x,double y,double z,double *lat,double *lon,double *alt)
{
double pi = 3.14159265357;
longA_EARTH = 6378137;
double flattening = 1/298.257223563;
double NAV_E2 = (2-flattening)*flattening; // also e^2
double rad2deg = 180/pi;
double wlon,wlat,walt,rhosqrd,rho,templat,tempalt,rhoerror,zerror;
double slat,clat,q,r_n,drdl,invdet,aa,bb,cc,dd;
if ((x == 0.0) & (y == 0.0))
wlon = 0.0;
else
wlon = atan2(y, x)*rad2deg;
if ((x == 0.0) & (y == 0.0) & (z == 0.0))
{
printf("WGS xyz at center of earth");
wlon = 360;
wlat = 360;
walt = 6378137;
}
else
{
rhosqrd = x*x + y*y;
rho = sqrt(rhosqrd);
templat = atan2(z, rho);
tempalt = sqrt(rhosqrd + z*z) - A_EARTH;
rhoerror = 1000.0;
zerror = 1000.0;
while ((Dabs(rhoerror) > 1e-6) | (Dabs(zerror) > 1e-6))
{
slat = sin(templat);
clat = cos(templat);
q = 1 - NAV_E2*slat*slat;
r_n = A_EARTH/sqrt(q);
drdl = r_n*NAV_E2*slat*clat/q; // d(r_n)/d(latitutde)
rhoerror = (r_n + tempalt)*clat - rho;
zerror = (r_n*(1 - NAV_E2) + tempalt)*slat - z;
aa = drdl*clat - (r_n + tempalt)*slat;
bb = clat;
cc = (1 - NAV_E2)*(drdl*slat + r_n*clat);
dd = slat;
invdet = 1.0/(aa*dd - bb*cc);
templat = templat - invdet*(+dd*rhoerror -bb*zerror);
tempalt = tempalt - invdet*(-cc*rhoerror +aa*zerror);
}
wlat = templat*rad2deg;
walt = tempalt;
}
if(lon )*lon = wlon;
if(lat )*lat = wlat;
if(alt )*alt = walt;
}
在分析其日志的过程中,遇到一个问题,就是TimGPS二进制日志保存的坐标数据是以WGS84大地坐标系为准的,大地坐标系的XYZ轴如下:
要得到经纬度和海拔(LLA:Longitude/Latitude/Altitude)坐标,需要一些椭球体、基准面及地图投影的知识。
后来从网上找到一个Fortune77写的WGS84->GLL换算函数,将其转成C/C++的函数:
void wgsxyz2lla(double x,double y,double z,double *lat,double *lon,double *alt)
{
double pi = 3.14159265357;
longA_EARTH = 6378137;
double flattening = 1/298.257223563;
double NAV_E2 = (2-flattening)*flattening; // also e^2
double rad2deg = 180/pi;
double wlon,wlat,walt,rhosqrd,rho,templat,tempalt,rhoerror,zerror;
double slat,clat,q,r_n,drdl,invdet,aa,bb,cc,dd;
if ((x == 0.0) & (y == 0.0))
wlon = 0.0;
else
wlon = atan2(y, x)*rad2deg;
if ((x == 0.0) & (y == 0.0) & (z == 0.0))
{
printf("WGS xyz at center of earth");
wlon = 360;
wlat = 360;
walt = 6378137;
}
else
{
rhosqrd = x*x + y*y;
rho = sqrt(rhosqrd);
templat = atan2(z, rho);
tempalt = sqrt(rhosqrd + z*z) - A_EARTH;
rhoerror = 1000.0;
zerror = 1000.0;
while ((Dabs(rhoerror) > 1e-6) | (Dabs(zerror) > 1e-6))
{
slat = sin(templat);
clat = cos(templat);
q = 1 - NAV_E2*slat*slat;
r_n = A_EARTH/sqrt(q);
drdl = r_n*NAV_E2*slat*clat/q; // d(r_n)/d(latitutde)
rhoerror = (r_n + tempalt)*clat - rho;
zerror = (r_n*(1 - NAV_E2) + tempalt)*slat - z;
aa = drdl*clat - (r_n + tempalt)*slat;
bb = clat;
cc = (1 - NAV_E2)*(drdl*slat + r_n*clat);
dd = slat;
invdet = 1.0/(aa*dd - bb*cc);
templat = templat - invdet*(+dd*rhoerror -bb*zerror);
tempalt = tempalt - invdet*(-cc*rhoerror +aa*zerror);
}
wlat = templat*rad2deg;
walt = tempalt;
}
if(lon )*lon = wlon;
if(lat )*lat = wlat;
if(alt )*alt = walt;
}
0 0
- 车载导航仪GPS开发基础
- 车载GPS导航项目
- 车载GPS,开发环境搭建
- 手机、PDA、车载GPS导航入门手册
- 车载GPS导航错误原因解析
- 车载DVD GPS导航地图围棋GPS地图
- 车载DVD GPS导航地图围棋GPS地图
- GPS车载导航仪进行多媒体娱乐的双屏异显
- 优趣购物与您分享车载GPS导航仪选购技巧
- 浅谈汽车车载导航仪GPS地图安装配置常见错误的解决方法(如提示缺少Style.ini等)
- 浅谈汽车车载导航仪GPS地图安装配置常见错误的解决方法(如提示缺少Style.ini等)
- 车载导航
- 车载GPS等基于部标通信协议的开发方案
- 智能手机“逼迫”车载导航仪重新定义
- 车载导航仪的行业概要
- 车载导航仪的基本机能概要
- GPS车载定位系统
- 开发基于高德SDK的Android车载导航应用
- 导航开发基础篇章
- 2.1 Intent and Intent Filters
- 黑马程序员___15java基础IO流
- JAVA定时关机小程序
- Mongodb使用过程中的优化原则
- 车载导航仪GPS开发基础
- hasOwnProperty方法的使用
- C/OSⅡ内核的车载影音系统设计
- 水風井 (易經大意 韓長庚)
- 03-TOMCAT的域名配置
- SPOJ GIRLSNBS
- 型车载DVD影音系统
- POJ 1185 炮兵阵地 ( dp[状态压缩] )
- thinkphp D方法和M方法