Math 如何将球面速度坐标转换为笛卡尔坐标
我有一个高度,经度,高度的速度向量,我想把它转换成笛卡尔坐标,vx,vy,vz。格式来自WGS84标准 这是公式Math 如何将球面速度坐标转换为笛卡尔坐标,math,vector,3d,wgs84,Math,Vector,3d,Wgs84,我有一个高度,经度,高度的速度向量,我想把它转换成笛卡尔坐标,vx,vy,vz。格式来自WGS84标准 这是公式 //------------------------------------------------------------------------------ template <class T> TVectorXYZ<T> WGS84::ToCartesian(T latitude, T longitude, T elevation)
//------------------------------------------------------------------------------
template <class T>
TVectorXYZ<T> WGS84::ToCartesian(T latitude, T longitude, T elevation)
//------------------------------------------------------------------------------
{
double sinlat, coslat;
double sinlon, coslon;
sincos_degree(latitude, sinlat, coslat);
sincos_degree(longitude, sinlon, coslon);
const double v = a / sqrt(1 - WGS84::ee * sinlat*sinlat);
TVectorXYZ<T> coord
(
static_cast<T>((v + elevation) * coslat * sinlon),
static_cast<T>(((1 - WGS84::ee) * v + elevation) * sinlat),
static_cast<T>((v + elevation) * coslat * coslon)
);
return coord;
}
//------------------------------------------------------------------------------
模板
TVectorXYZ WGS84::自流(T纬度、T经度、T高程)
//------------------------------------------------------------------------------
{
双sinlat,coslat;
双sinlon,coslon;
sincos_度(纬度、sinlat、coslat);
sincos_度(经度、sinlon、coslon);
常数双v=a/sqrt(1-WGS84::ee*sinlat*sinlat);
TVectorXYZ合作社
(
静态浇筑((v+标高)*coslat*sinlon),
静态浇筑((1-WGS84::ee)*v+标高)*sinlat),
静态浇筑((v+标高)*coslat*coslon)
);
返回坐标;
}
采用用于将位置从地理坐标转换为笛卡尔坐标的公式。这是向量p(λ,φ,h) ∈ ℝ³,即将纬度、经度和高度转换为x、y、z坐标的三元素向量。现在计算这个公式关于三个参数的偏导数。你会得到三个向量,它们应该相互正交。关于经度λ的导数应指向局部东方,关于纬度φ的导数指向北方,关于高度h的导数指向上方。将这些矢量与速度相乘,得到笛卡尔速度矢量
观察单位如何匹配:位置以米为单位,前两个导数为米/度,速度为度/秒。或者别的,也许是英里和弧度
所有这些对于球体来说都相当容易。对于WGS84椭球体,位置公式更为复杂,计算过程将更为复杂。根据之前的注释流,确定假设您的输入为:
lon[rad],lat[rad],alt[m]//WGS84位置
vlon[m/s],vlat[m/s],alt[m/s]//WGS84 lon,lat,alt方向的速度,但[m/s]
并且想要输出:
x,y,z//笛卡尔坐标位置[m/s]
vx,vy,vz//笛卡尔速度[m/s]
并将有效的变换为笛卡尔坐标系,供您使用。这是我的:
void WGS84toXYZ(双x双y双z双lon双lat双alt)/[rad,rad,m]->[m,m,m]
{
常数双地球=6378137.00000;/[m]WGS84赤道半径
常数双地球=6356752.31414;/[m]WGS84极半径
常数双地球=8.1819190842622e-2;//WGS84偏心率
常数double aa=earth a*earth a;
常数double\u ee=\u earth\u e*\u earth\u e;
双a,b,x,y,z,h,l,c,s;
a=lon;
b=纬度;
h=alt;
c=cos(b);
s=sin(b);
//WGS84偏心距
l=_earth_a/sqrt(1.0-(_ee*s*s));
x=(l+h)*c*cos(a);
y=(l+h)*c*sin(a);
z=((1.0-_ee)*l)+h)*s;
}
和将向量规格化为单位大小的例程:
void规格化(双x、双y、双z)
{
双l=sqrt(x*x+y*y+z*z);
如果(l>1e-6)l=1.0/l;
x*=l;y*=l;z*=l;
}
是的,你可以尝试推导出lihe@MvG建议的公式,但从你的新手错误来看,我强烈怀疑这会导致成功的结果。相反,您可以这样做:
lon、lat、alt
方向向量(x、y、z)
这很简单,只需在WGS84位置中使用一些小步增量,将其转换为笛卡尔减法,并将其规格化为单位向量。让我们调用这些方向基向量U,V,W
double-Ux,Uy,Uz;//[m]
双Vx,Vy,Vz;//[m]
双Wx,Wy,Wz;//[m]
双da=1.567e-7;//[rad]沿lon方向的1.0 m角阶跃
双dl=1.0;//[m] 高潮阶1.0米
WGS84toXYZ(x,y,z,lon,lat,alt);//实际位置
WGS84toXYZ(Ux、Uy、Uz、lon+da、lat、alt);//北向
WGS84toXYZ(Vx、Vy、Vz、lon、lat+da、alt);//纬度方向东
WGS84toXYZ(Wx,Wy,Wz,lon,lat,alt+dl);//alt方向高/高
Ux-=x;Uy-=y;Uz-=z;
Vx-=x;Vy-=y;Vz-=z;
Wx-=x;Wy-=y;Wz-=z;
规范化(Ux、Uy、Uz);
正常化(Vx、Vy、Vz);
归一化(Wx,Wy,Wz);
lon、lat、alt
转换为vx、vy、vz
vx=vlon*Ux+vlat*vx+valt*Wx;
vy=vlon*Uy+vlat*vy+valt*Wy;
vz=vlon*Uz+vlat*vz+valt*Wz;
deg/rad
和m/ft/km
,因为单位很重要
顺便说一句,U,V,W构成基向量,同时也是方向导数
[Edit1]更精确的转换
//---------------------------------------------------------------------------
//---WGS84版本:1.00---------------------------------------
//---------------------------------------------------------------------------
#ifndef_WGS84_h
#定义_WGS84_h
//---------------------------------------------------------------------------
// http://www.navipedia.net/index.php/Ellipsoidal_and_Cartesian_Coordinates_Conversion
//---------------------------------------------------------------------------
//WGS84(a,b,h)=(长,横向,纵向)[rad,rad,m]
//XYZ(x,y,z)[m]
//---------------------------------------------------------------------------
常数双接地=6378137.00000;//[m] WGS84赤道半径
常数双接地=6356752.31414;//[m] WGS84极半径
常数双接地=8.1819190842622e-2;//WGS84偏心率
//常数双接地=sqrt(1.0-(((接地)/接地*)((接地/)