多个纬度/经度点的半径

时间:2010-04-26 20:28:42

标签: mysql ruby math geography

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

有点难以接受这个问题。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

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

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

Y = R * sin(长)* cos(纬度)

Z = R * sin(lat)

此时,您可以使用毕达哥拉斯定理的扩展来近似点之间的距离:

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

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

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

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

距离是:

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

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

不在LaTeX写我的数学表示道歉。

答案 2 :(得分:1)

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

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

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

我不会使用Megiddo的算法来进行半球性测试的线性编程部分。相反,使用Seidel的算法来解决线性规划问题,由Raimund Seidel在“小维线性规划和凸壳简单”中描述。另请参阅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)时间复杂度,这可能是渐近最优的。

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

答案 3 :(得分:0)

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

我怀疑在平面上找到一个最小的封闭圆可能很难,所以为了消除使用纬度和经度以及球面几何的微妙之处,你应该考虑将你的点映射到XY平面。这将引入一些扭曲,但如果你的预期规模是100英里,你可能会接受它。一旦你有一个圆并且它的中心在XY平面上,你总是可以映射回地球并重新检查你的距离。