Math 如何将球面速度坐标转换为笛卡尔坐标

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)

我有一个高度,经度,高度的速度向量,我想把它转换成笛卡尔坐标,vx,vy,vz。格式来自WGS84标准

这是公式

  //------------------------------------------------------------------------------
    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-(((接地)/接地*)((接地/)