【问题标题】:Point to great-circle segment distance点到大圆线段距离
【发布时间】:2018-01-17 03:47:52
【问题描述】:

我想计算从经纬度给定的点到两点给定的线段(大圆的一部分)的距离。所有坐标均在 WGS84 中给出。

我知道如何在笛卡尔坐标中计算这个,但不是在球体上。有人可以提供公式吗?

【问题讨论】:

  • 我想你在mathma.stackexchange上可能会有更多的运气
  • 我投票结束这个问题,因为它是关于 Mathematics 而不是编程或软件开发。
  • 距离d应该是穿过球体的直线,还是应该也是大圆段?
  • @hypehuman:它也应该是一个大圆段。

标签: geometry distance point wgs84 great-circle


【解决方案1】:
  1. 球形到二维笛卡尔

    如果距离不是太远并且不在极点附近,您可以将线段和从您的点发射并垂直于您的线段的线转换为球坐标(如果它们还没有的话)并将这两个角度用作笛卡尔空间(忽略半径)。

    1. 计算交点

    2. 转回球形

    3. 计算点和交点之间的弧长

      很难说您使用的是 sphere 还是 WGS84 或什么......

  2. 笛卡尔 3D

    让我们有弧段AB,半径球R和中心C(理想情况下(0,0,0))和点P然后我看到它是这样的:

    1. 在 3D 笛卡尔坐标中找到平面 ABC 与其法线通过点 P 之间的交点 P'

    2. 将其投影回球体表面

      对于球面很简单,因为投影意味着只需将矢量P'C 长度更改为R(如果球体以(0,0,0) 为中心)。

      P'' = (R*(P'-C)/|P'-C|) + C
      
    3. 计算两点之间的弧长|P-P''|

      对于球面也很简单,只需计算向量 P-CP''-C 之间的角度

      ang = acos(dot(P-C,P''-C)/(R*R)); // [radians]
      

      并转换为弧长

      d = ang*R; // [same Units as R]
      

【讨论】:

  • 我正在使用 WGS84。
  • @user2033412 这有点复杂...投影是迭代完成以提高精度...您只需搜索lat直到它适合x,y,z您从球面投影开始,然后更改 lat 以最小化距离 ...
  • @user2033412 请参阅How to convert a spherical velocity coordinates into cartesian 以及一些其他想法的链接答案...
  • 我无法让它工作。举个简单的例子,看这里的可视化:desmos.com/calculator/7vknrruqwc:线段端点 A 在 (1,0,0),线段端点 B 在 (0,1,0),点 P 在 (4/5, 3/5, 0)。所有都是共面的,所以它减少到一个圆,我们可以看到 P 在弧段 AB 上,所以 d 应该是 0。但是让我们用你的方法来解决它(正如我所读的那样)。直线 AB 上到 P 的最短最近点是点 I:(3/5,2/5,0)。将其径向扩展,您将得到点 P':(2/√13, 3/√13)。这和原来的 P 不一样,所以 d 非零!
  • @hypehuman +1 嗯,你说得对,我在第一步中遇到了错误......必须在法线和平面而不是线之间进行交叉......我修复了答案并更新了图像。在您的情况下,点 P,P',P'' 是相同的(因此距离为零),因为 P 已经位于弧 AB 上。 P' 不需要躺在 AB 线上……那是错误
【解决方案2】:

这是跨轨距离described here

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)

请注意,角度需要以弧度为单位才能传递给三角函数

【讨论】:

  • 很抱歉,将删除我的评论。
  • 为什么会被接受?这是从一个点到 大圆 的距离,而不是大圆段,这是 OP 要求的..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多