0
是否存在直接方法(不包括將座標轉換爲經緯度)以在2個ECEF座標(xyz)之間進行插值以使插入點位於WGS84橢圓體上。原始2點是從大地座標計算而來的。如何插入WGS84橢球體上的ECEF座標
在一個球體上插值似乎很明顯,但我似乎無法得出橢球體的解決方案。
預先感謝您。
是否存在直接方法(不包括將座標轉換爲經緯度)以在2個ECEF座標(xyz)之間進行插值以使插入點位於WGS84橢圓體上。原始2點是從大地座標計算而來的。如何插入WGS84橢球體上的ECEF座標
在一個球體上插值似乎很明顯,但我似乎無法得出橢球體的解決方案。
預先感謝您。
假設你得到2分p0(x,y,z)
和p1(x,y,z)
以及內插什麼p(t)
其中t=<0.0,1.0>
兩者之間。
,您可以:
重新調整你的橢球體
只是這樣的:
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|
意味着矢量的長度p0
。
重新調整回用相同的值
p(t).z/=mz
這是簡單,便宜,但插值路徑不會有線性的時間尺度劃分到橢球
。
這裏C++例如:
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
直角座標系,白色曲線插補路徑,其中t=<0.0,1.0>
...
沿着什麼插入?設定終點是不夠的。你在插入什麼功能?問題並不完整。 – Gangnus
我不知道我的問題中缺少什麼;我試圖在WGS84橢球體的2個笛卡爾座標之間進行插值。我找不到一個更清晰的方法。 – Philippe
@Philippe使用問題的縮放來添加答案,以球形問題極大地簡化了事情(類似於將橢圓問題轉換爲圓形)。 – Spektre