如何在WGS84椭球上插入ECEF坐标

时间:2014-02-10 20:01:39

标签: coordinates gis interpolation wgs84

是否存在直接方法(不涉及将坐标转换为lat / lon)以在2个ECEF坐标(xyz)之间进行插值,以使插值点位于WGS84 ellispoid上。原始的2个点是根据大地坐标计算的。

在球体上插值似乎很明显,但我似乎无法得到椭圆体的解。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

假设你得到2分<!DOCTYPE html> <html lang="en-us"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta charset="UTF-8"> <!-- CSS --> <link rel="stylesheet" href="css/normalize.css"> <link rel="stylesheet" href="css/style.css"> </head> <body> <main> <section class="tech" id="nextsection"> <div class="tech-row"> <div class="tech-column"> <img src="images/red_icon.svg" alt="Your Cash"> <h4>Your Cash</h4> <p>Seed your retirement with recurring payments</p> </div> </div> </section> </main> </body> </html> p0(x,y,z),并希望在p1(x,y,z)之间插入一些p(t)

你可以:

  1. 将椭圆体重新缩放为球体

    就像这样:

    t=<0.0,1.0>

    现在你有笛卡尔坐标参考球形地球模型。

  2. <强>插值

    简单的线性插值可以做到

    const double mz=6378137.00000/6356752.31414; // [m] equatoreal/polar radius of Earth
    p0.z*=mz;
    p1.z*=mz;
    

    但是粗糙的你还需要归一化到地球曲率所以:

    p(t) = p0+(p1-p0)*t
    

    其中r0 = |p0| r1 = |p1| p(t) = p0+(p1-p0)*t r(t) = r0+(r1-r0)*t p(t)*=r/|p(t)| 表示向量|p0|的长度。

  3. 重新缩放回椭球

    除以相同的值

    p0
  4. 这是简单而便宜的,但插值路径不会有线性时间刻度。

    这里是C ++示例:

    p(t).z/=mz
    

    预览:

    preview

    黄色方块是使用的void XYZ_interpolate(double *pt,double *p0,double *p1,double t) { const double mz=6378137.00000/6356752.31414; const double _mz=6356752.31414/6378137.00000; double p[3],r,r0,r1; // compute spherical radiuses of input points r0=sqrt((p0[0]*p0[0])+(p0[1]*p0[1])+(p0[2]*p0[2]*mz*mz)); r1=sqrt((p1[0]*p1[0])+(p1[1]*p1[1])+(p1[2]*p1[2]*mz*mz)); // linear interpolation r = r0 +(r1 -r0 )*t; p[0]= p0[0]+(p1[0]-p0[0])*t; p[1]= p0[1]+(p1[1]-p0[1])*t; p[2]=(p0[2]+(p1[2]-p0[2])*t)*mz; // correct radius and rescale back r/=sqrt((p[0]*p[0])+(p[1]*p[1])+(p[2]*p[2])); pt[0]=p[0]*r; pt[1]=p[1]*r; pt[2]=p[2]*r*_mz; } 笛卡尔坐标,白色曲线是p0,p1 ...

    的插值路径