1、发射坐标系O-xyz
发射坐标系是指:
原点O:在发射点,
OX轴:在发射点水平面内指向发射瞄准方向
OY轴:沿发射点的铅垂线向上
OZ轴:与OX轴、OY轴构成右手直角坐标系的坐标系。
2、地心坐标系(ECEF) Oe-XeYeZe
原点Oe:地心
OeXe:通过本初子午线(0度经度)和赤道(0deglatitude)的交点
OeZe:延伸通过的北极(即,与地球旋转轴重合)
OeYe:组成右手直角坐标系
3、大地坐标系(也叫WGS-84坐标系,LLA坐标系,经纬高坐标系,全球地理坐标系)
WGS-84坐标系的X轴指向BIH(国际时间服务机构)1984.0定义的零子午面(Greenwich)和协议地球极(CTP)赤道的交点。Z轴指向CTP方向。Y轴与X、Z轴构成右手坐标系。把前面提到的ECEF坐标系用在GPS中,就是WGS-84坐标系。
想要将发射坐标系的 xyz值 转成WGS-84坐标系的 经度(longitude),纬度(latitude)和高度(altitude),首先必须先由 发射坐标系O-xyz 转成 地心坐标系(ECEF) Oe-XeYeZe,再转为WGS-84坐标系
第一步:发射坐标系O-xyz 转成 地心坐标系(ECEF) Oe-XeYeZe
假设地球为椭球,发射点在地球表面的位置可以用经度 0、纬度0 确定, Ox轴的方向以射击方位角0 表示,(所谓射击方位角的含义:ox轴与子午线切线正北方向的夹角,以对着 y 轴看去顺时针为正)。如下图:
方向余弦矩阵关系: 发射坐标系 = GE * 地心坐标系
其中,
在这里,需要做一个转置即可得到 地心坐标系下的值
第二步:地心坐标系(ECEF) Oe-XeYeZe 转成 WGS-84坐标系
(如果不假设为球体,可以用R1长半径和R2短半径分别求经纬度,matlab中有自动转换的函数,参见函数ecef2lla和lla2ecef。)网上也有很多讲这一步的。可以搜着看看,下面简单写一下java代码:
public static String WGS84toECEF(double latitude, double longitude, double height)
{
double X;
double Y;
double Z;
double a = 6378137.0;
double b = 6356752.31424518;
double E = (a * a - b * b) / (a * a);
double COSLAT = Math.cos(latitude * Math.PI / 180);
double SINLAT = Math.sin(latitude * Math.PI / 180);
double COSLONG = Math.cos(longitude * Math.PI / 180);
double SINLONG = Math.sin(longitude * Math.PI / 180);
double N = a / (Math.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;
return X + "," + Y + "," + Z;
}
public static String ECEFtoWGS84(double x, double y, double z)
{
double a, b, c, d;
double Longitude;//经度
double Latitude;//纬度
double Altitude;//海拔高度
double p, q;
double N;
a = 6378137.0;
b = 6356752.31424518;
c = Math.sqrt(((a * a) - (b * b)) / (a * a));
d = Math.sqrt(((a * a) - (b * b)) / (b * b));
p = Math.sqrt((x * x) + (y * y));
q = Math.atan2((z * a), (p * b));
Longitude = Math.atan2(y, x);
Latitude = Math.atan2((z + (d * d) * b * Math.pow(Math.sin(q), 3)), (p - (c * c) * a * Math.pow(Math.cos(q), 3)));
N = a / Math.sqrt(1 - ((c * c) * Math.pow(Math.sin(Latitude), 2)));
Altitude = (p / Math.cos(Latitude)) - N;
Longitude = Longitude * 180.0 / Math.PI;
Latitude = Latitude * 180.0 / Math.PI;
return Longitude + "," + Latitude + "," + Altitude;
}
到此,转换结束。
觉得有用的话还请点个赞,谢谢~