Kar*_*l T 0 geometry intersection great-circle
我有一个纬度、经度和一个以真北度数表示的行进方向。我想计算我是否会与另外两个纬度/经度点定义的线相交。
我认为定义这条线的两个点将创建我的大圆,而我的位置和方位角将定义我的 Rhumb 线。
我只对几百公里内会发生的交叉路口感兴趣,所以我不需要所有可能的解决方案。
我不知道从哪里开始。
简单的答案是肯定的——如果您从任何纬度/经度开始并继续沿着某个大圆旅行,您最终将穿越地球上的任何和所有其他大圆。地球上每两个大圆正好在两个点上相互交叉(除了两个相同的大圆,它们的所有点都相互交叉。)
但我想你不仅仅是在问是/否问题。您可能想知道这两个大圆究竟在哪里相交。我们可以使用以下策略来找出答案:
每个大圆都位于穿过地球中心的平面上。
这些平面的交点是一条线(假设它们不是完全相同的平面。)
这条相交线在两点穿过地球表面——正是我们两个大圆相交的地方。
因此,我们的任务是:(1)找到飞机。(2)找到它们的交点。(3) 找到两个交点,最后, (4) 用纬度/经度表示这些交点。(5) 找出哪个交叉点更接近您开始的纬度/经度的额外功劳。
听起来不错?下面用三角函数和向量数学来做这件事。为了稍微简化数学,我们将:
第 1 步——找到飞机:
我们真正关心的是平面法线。以下是我们如何找到它们:
--一个大圆是由它所穿过的地球上的两点定义的
法线将是来自原点 (0,0,0) 的每个点的 (x,y,z) 向量的叉积。给定每个点的纬度/经度,使用球坐标转换,对应的(x,y,z)为:
x=cos(lat)*sin(lon)
y=cos(lat)*cos(lon)
z=sin(lat)
Run Code Online (Sandbox Code Playgroud)
有了这个,我们给定的两个点分别为 lat1/lon1 和 lat2/lon2,我们可以找出向量 P1=(x1,y1,z1) 和 P2=(x2,y2,z2)。
第一个大圆法线是叉积:
N1=P1 x P2
Run Code Online (Sandbox Code Playgroud)
--另一个大圆由地球上的一个点和一个方位角定义
我们有一个点 P3 和一个方位角 T。我们将找到一个点 P4,沿着大圆穿过 P3 在方位角 T 处,使用余弦的球面定律(为了方便起见,这里也求解):
lat4=asin(cos(lat3)*cos(T))
lon4=lon3+atan2(sin(T)*cos(lat3),-sin(lat3)*sin(lat4))
Run Code Online (Sandbox Code Playgroud)
然后正常情况和以前一样:
N2=P3 x P4
Run Code Online (Sandbox Code Playgroud)
第 2 步:找到平面相交线:
给定两个平面法线,它们的叉积定义了它们的相交线:
L=N1 x N2
Run Code Online (Sandbox Code Playgroud)
第3步:找到交点:
只需将向量 L归一化即可获得单位球面上的交点之一。另一点在球体的另一侧:
X1=L/|L|
X2=-X1
Run Code Online (Sandbox Code Playgroud)
第 4 步:用纬度/经度表示交点:
给定 X=(x,y,z),再次使用球坐标转换,并考虑到点在单位球面上:
lat=asin(z)
lon=atan2(y,x)
Run Code Online (Sandbox Code Playgroud)
第 5 步:两点中哪一个更接近?
使用半正弦公式计算您的点到 X1 和 X2 的距离,选择较近的一个。