我的任务是找到球体上两条弧的交点(如果存在的话)。我使用http://www.boeing-727.com/Data/fly%20odds/distance.html的算法,但在某些情况下纬度偏差太大。是什么引起的?
我有4个点(lat,lon)。我使用以下算法将坐标转换为笛卡尔坐标:
x = sin(toRadians(p.lat)) * cos(toRadians(p.lon));
y = sin(toRadians(p.lat)) * sin(toRadians(p.lon));
z = cos(toRadians(p.lat));
之后,我创建向量V1(第一个平面的向量指向矢,垂直于它)和向量V2(到第二个平面)
//coords - class for Cartesian coordinates (x,y,z)
coords V1 = P1 * P2; //Vector multipication (y * rhs.z - rhs.y * z, rhs.x * z - x * rhs.z, x * rhs.y - rhs.x * y)
coords V2 = P3 * P4;
然后我计算向量指向D = V1 * V2;
因为代表地球的球体的半径为1,我们再次计算D的单位向量,使它接触球体的表面。这个向量S1和它的相反向量S2直接给予球面上两个不重叠的大圆的交点的坐标。
length = D.length();
coords S1(D.x / length, D.y / length, D.z / length);
coords S2(-D.x / length, -D.y / length, -D.z / length);
然后将其转换为球坐标(以度为单位):
lat = toDegrees(atan2(sqrt(x * x + y * y), z));
lon = toDegrees(atan2(y, x));
例如,当穿过以下点(60,30)-(60,60) & (40,50)-(60,50) /*(lat,lon)*/
时,我们得到坐标:
s1: {lat=120.77136585404358 lon=-130.00000000000000 }
s2: {lat=59.228634145956427 lon=50.000000000000014 }
第二点的纬度与正确的纬度(85771.97米)相差很大
2条答案
按热度按时间bttbmeg01#
在纬度和经度方面(注意“球坐标”通常使用CO-LATITUDE)我认为你的坐标应该是
求出单位球面上的笛卡尔点P1,P2,P3,P4。
然后通过原点的平面由它们的单位法向量定义
一条交线必须垂直于这两条线,所以平行于交叉(V1,V2)。只要它不为零,你就可以将它归一化,得到单位球面上的一个点。
最后,转换回纬度和经度。
对于给出的示例(注:两个解决方案,在球体的相对侧)
bjp0bcyl2#
你的xyz地理坐标公式似乎不正确。你可以使用下面的代码,这是椭圆体的意思,但你可以设置半长轴(a),半短轴(b)为
1.0
,你会得到一个完美的椭圆体,这是一个球体,如果你设置高度为0.0
,你将在该球体的表面:另一个问题是,即使您使用其他方法,在使用此IRL时,您也很可能具有来自WGS84椭球的坐标。在椭球坐标上执行椭球计算将产生错误的结果。这就是为什么你需要先减少你的椭球纬度(你只需要减少纬度,因为经度不受当前椭球的展平影响),使用公式
tan(beta)=(1-f)*tan(phi)
,其中phi
是你的椭球纬度,f
是WGS84椭球的展平(或任何你使用的),beta
是最终减少的纬度。