【问题标题】:Radius of multiple latitude/longitude points多个纬度/经度点的半径
【发布时间】:2011-02-12 13:59:40
【问题描述】:

我有一个程序,它将一组经纬度点作为输入。我需要对该数组进行检查,以确保所有点都在某个半径内。因此,例如,我允许的最大半径是 100 英里。给定一个纬度/经度数组(来自 MySQL 数据库,可能是 10 个点,可能是 10000 个),我需要弄清楚它们是否都适合半径为 100 英里的圆。

对于如何处理这个问题有点困惑。任何帮助将不胜感激。

【问题讨论】:

  • 找到任何给定点集的中心是我没有试图弄清楚的事情,但是一旦你这样做了,Haversine 公式将帮助你确定它们是否在半径范围内。
  • 中心不会只有个别经纬度平均值的经纬度,还是我缺少一些球面几何的微妙之处?
  • 中心称为重心。但是,这无济于事,因为这与包含所有点的最小圆的中心不同(想象一下右边有很多点,左边有一个 - 重心将在右边,但是圆的中心将在中间)
  • 如上所述,您想做的事情可能与找到包含您的点的最小圆圈一样难。这是一个棘手的(虽然不是不可能的)问题。在这种情况下,我会重新检查原始要求,看看是否有可以计算出的替代事物足以解决真正的潜在问题。您可能不想浪费开发和 CPU 时间来解决一个精确的数学问题,而该问题本身只是对开始时仅含糊地指定的问题的近似。
  • @las3jrock: 同一纬度 45 度的两点的中心,正好在纬度 45 度以上。想想飞机的路径在墨卡托地图上投影时是如何“弯曲”的,即使它实际上是直线飞行。

标签: mysql ruby math geography


【解决方案1】:

找到the smallest circle containing all points,并将其半径与100进行比较。

【讨论】:

    【解决方案2】:

    对我来说,解决这个问题的最简单方法是将坐标转换为 (X,Y,Z),然后找到沿球体的距离。

    假设地球是一个半径为 R 的球体(完全不真实)...

    X = R * cos(long) * cos(lat)

    Y = R * sin(long) * cos(lat)

    Z = R * sin(lat)

    此时,您可以使用三空间勾股定理的扩展近似点之间的距离:

    dist = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)

    但要找到沿表面的实际距离,您需要知道两点与原点(地球中心)的夹角。

    将您的位置表示为向量 V1 = (X1, Y1, Z1) 和 V2 = (X2, Y2, Z2),角度为:

    角度 = arcsin((V1 x V2) / (|V1||V2|)),其中 x 是叉积。

    那么距离就是:

    dist = (地球周长) * 角度 / (2 * pi)

    当然,这并没有考虑到海拔变化或地球在赤道处更宽的事实。

    很抱歉我没有用 LaTeX 写数学。

    【讨论】:

      【解决方案3】:

      下面的答案涉及假设地球是一个完美的球体,这应该比将地球视为一个平面给出更准确的答案。

      要计算一组纬度/经度点的半径,您必须首先确保您的一组点是“半球形的”,即。所有点都可以放入完美球体的任意一半。

      查看 Gupta 和 Saluja 撰写的“高斯球上一些邻近问题的优化算法及其应用”一文中的第 3 节。我没有具体的链接,但我相信你可以在网上免费找到一份副本。这篇论文不足以实现解决方案。您还需要 Ha 和 Yoo 的“球面多边形最大相交的近似质心”中的附录 1。

      我不会使用 Megiddo 的算法来进行半球度测试的线性规划部分。相反,请使用 Seidel 的算法来解决线性规划问题,该算法在 Raimund Seidel 的“Small-Dimensional Linear Programming and Convex Hulls Made Easy”中进行了描述。另请参阅 Kurt Mehlhorn 的“Seidel 的随机线性规划算法”和 Christer Ericson 的“实时碰撞检测”的第 9.4 节。

      一旦您确定您的点是半球形的,请继续阅读 Gupta 和 Saluja 论文的第 4 部分。这部分展示了如何实际获得点的“最小封闭圆”。

      要进行所需的二次规划,请参阅 N.D. Botkin 的论文“求解二次规划的随机算法”。 This tutorial 很有帮助,但论文使用 (1/2)x^T G x - g^T x,网络教程使用 (1/2)x^T H x + c^T x。一个添加术语,另一个减去,导致与符号相关的问题。 Also see this example 2D QP problem。提示:如果你使用 C++,Eigen 库非常好。

      这种方法比上面的一些 2D 方法稍微复杂一点,但它应该比完全忽略地球曲率更准确。该方法还具有 O(n) 时间复杂度,可能是渐近最优的。

      注意:上述方法可能无法很好地处理重复数据,因此您可能需要在找到最小的封闭圆之前检查重复的纬度/经度点。

      【讨论】:

        【解决方案4】:

        查看this question 的答案。它提供了一种测量任意两个(纬度、经度)点之间距离的方法。然后使用smallest enclosing circle algorithm

        我怀疑在平面上找到一个最小的封闭圆可能已经够难了,因此为了消除处理经纬度和球面几何的微妙之处,您可能应该考虑将点映射到 XY 平面。这会引入一定程度的失真,但如果您的预期规模是 100 英里,您可能可以忍受。一旦您在 XY 平面上获得了一个圆及其中心,您就可以随时映射回地球并重新检查您的距离。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 1970-01-01
          • 2011-08-04
          • 2013-03-15
          相关资源
          最近更新 更多