我想计算从经纬度给定的点到两点给定的线段(大圆的一部分)的距离。所有坐标均在 WGS84 中给出。
我知道如何在笛卡尔坐标中计算这个,但不是在球体上。有人可以提供公式吗?
这是此处描述的跨轨道距离
dxt = asin( sin(δ13) ⋅ sin(θ13−θ12) ) ⋅ R
where
δ13 is (angular) distance from start point to third point
θ13 is (initial) bearing from start point to third point
θ12 is (initial) bearing from start point to end point
R is the earth’s radius
您可以使用给定页面中的公式计算所需的距离和方位
distance
a = sin²(Δφ/2) + cos φ1 ⋅ cos φ2 ⋅ sin²(Δλ/2)
c = 2 ⋅ atan2( √a, √(1−a) )
d = R ⋅ c
where
φ is latitude, λ is longitude, R is earth’s radius (mean radius = 6,371km);
bearing
θ = atan2( sin Δλ ⋅ cos φ2 , cos φ1 ⋅ sin φ2 − sin φ1 ⋅ cos φ2 ⋅ cos Δλ )
where
φ1,λ1 is the start point, φ2,λ2 the end point (Δλ is the difference in longitude)
请注意,角度需要以弧度为单位才能传递给三角函数
球形到二维笛卡尔
如果距离不是太远并且不在极点附近,您可以将线段和从您的点发出并垂直于您的线段的线转换为球坐标(如果它们还没有的话)并使用 2 个角度作为笛卡尔空间(忽略半径)。
计算交点
转换回球形
计算点和交点之间的弧长
很难说您使用的是 sphere 还是 WGS84 或什么....
笛卡尔 3D
让我们有弧段AB
,半径球体R
和中心C
(理想情况下(0,0,0)
)和点P
然后我看到它是这样的:
在 3D 笛卡尔坐标系中找到P'
平面ABC
与其法线通过点之间的交点P
将其投影回球体表面
对于球面来说,这很容易,因为投影意味着只需将矢量P'C
长度更改为R
(如果球体以 为中心(0,0,0)
)。
P'' = (R*(P'-C)/|P'-C|) + C
计算两点之间的弧长|P-P''|
对于球面也很简单,只需计算向量之间的角度P-C
和P''-C
ang = acos(dot(P-C,P''-C)/(R*R)); // [radians]
并转换为弧长
d = ang*R; // [same Units as R]