WGS84和ECEF坐标的转换

简介:

#include "stdafx.h"

#include <math.h>


#define  PI  3.141592653

/*

该程序根据GPS.G1-X-00006.pdf文档,实现了WGS84和ECEF坐标的转换

*/


void LLAtoECEF(double latitude, double longitude, double height, double &X, double &Y, double &Z)

{

  double a = 6378137;

  double b = 6356752.314245;// b=(1-f)

  double E = (a*a - b*b)/(a*a);


  double COSLAT = cos(latitude*PI/180);

  double SINLAT = sin(latitude*PI/180);

  double COSLONG = cos(longitude*PI/180);

  double SINLONG = sin(longitude*PI/180);


  double N = a /(sqrt(1 - E*SINLAT*SINLAT));

  double NH = N + height;


  X = NH * COSLAT * COSLONG;

  Y = NH * COSLAT * SINLONG;

  Z = (b*b*N/(a*a) + height) * SINLAT;

}


void ECEFtoLLA(int lx, int ly, int lz)

  double      x, y, z;

  double      a, b, f, e, e1;

  double      Longitude;

  double      Latitude;

  double      Altitude;

  double      p, q;

  double      N;

  x = (double)lx ;

  y = (double)ly ;

  z = (double)lz ;

  a = (double)6378137.0;

  b = (double)6356752.31424518;

  f = 1.0 / (double)298.257223563;

  e = sqrtl(((a * a) - (b * b)) / (a * a));

  e1 = sqrtl(((a * a) - (b * b)) / (b * b));

  p = sqrtl((x * x) + (y * y));

  q = atan2l((z * a), (p * b));

  Longitude = atan2l(y, x);

  Latitude = atan2l((z + (e1 * e1) * b * powl(sinl(q), 3)), (p - (e * e) * a * powl(cosl(q), 3)));

  N = a / sqrtl(1 - ((e * e) * powl(sinl(Latitude), 2)));

  Altitude = (p / cosl(Latitude)) - N;

  Longitude = Longitude * 180.0 / PI;

  Latitude = Latitude  * 180.0 / PI;

  Latitude = (double)Latitude;

  Longitude = (double)Longitude;

  Altitude = (double)Altitude;

}



int _tmain(int argc, _TCHAR* argv[])

{

  double latitude = 22.21555549969;

  double longitude = 113.367229848;

  double h = 0.5;

  double XX = 0.0;

  double YY = 0.0;

  double ZZ = 0.0;

  LLAtoECEF(latitude, longitude, h, XX, YY, ZZ);

  ECEFtoLLA(XX, YY, ZZ);

return 0;

}


注意

    当前程序对于海拔高度的转换,出现问题,需要重新调整





    本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1892212,如需转载请自行联系原作者



相关文章
|
5月前
|
算法 C++
大地经纬度坐标与地心地固坐标的的转换
大地经纬度坐标与地心地固坐标的的转换
123 0
|
5月前
|
定位技术 图形学
地心地固坐标系(ECEF)与站心坐标系(ENU)的转换
地心地固坐标系(ECEF)与站心坐标系(ENU)的转换
275 0
|
定位技术 开发工具 数据安全/隐私保护
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
2548 1
|
算法 JavaScript 前端开发
84坐标系、02坐标系、百度坐标之间相互转换算法
最近有同学反馈之前的坐标系转换有问题,对之前的工具类进行了修正。 一、地图坐标转换java工具类 包含84坐标系、02坐标系、百度地图、高德地图、腾讯地图坐标之间相互转换的算法 wgs84ToGcj02:将 WGS84 坐标系下的经纬度转换为 GCJ02 坐标系下的经纬度。 gcj02ToWgs84:将 GCJ02 坐标系下的经纬度转换为 WGS84 坐标系下的经纬度。 gcj02ToBd09:将 GCJ02 坐标系下的经纬度转换为 BD09 坐标系下的经纬度。 bd09ToGcj02:将 BD09 坐标系下的经纬度转换为 GCJ02 坐标系下的经纬度。
1181 0
84坐标系、02坐标系、百度坐标之间相互转换算法
如何判断投影坐标是 3 度带还是 6 度带?如何计算中央子午线经度?
如何判断投影坐标是 3 度带还是 6 度带?如何计算中央子午线经度?
|
移动开发 C++
C/C++编程题之坐标移动
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
|
定位技术 数据安全/隐私保护 芯片