Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多个纬度/经度点的半径_Mysql_Ruby_Math_Geography - Fatal编程技术网

Mysql 多个纬度/经度点的半径

Mysql 多个纬度/经度点的半径,mysql,ruby,math,geography,Mysql,Ruby,Math,Geography,我有一个程序,它将一组lat/long点作为输入。我需要对该阵列执行检查,以确保所有点都在某个半径内。例如,我允许的最大半径是100英里。给定一个lat/long数组(来自MySQL数据库,可能是10个点,也可能是10000个点),我需要弄清楚它们是否都适合半径为100英里的圆 有点困惑于如何处理这个问题。任何帮助都将不胜感激。找到,并将其半径与100进行比较。查看的答案。它提供了一种测量任意两个(横向、纵向)点之间距离的方法。然后,使用一个 我猜想在平面上找到一个最小的包围圈可能是困难的,所以

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

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

找到,并将其半径与100进行比较。

查看的答案。它提供了一种测量任意两个(横向、纵向)点之间距离的方法。然后,使用一个


我猜想在平面上找到一个最小的包围圈可能是困难的,所以为了消除使用纬度、经度和球面几何的微妙之处,你应该考虑把你的点映射到XY平面。这会带来一定程度的失真,但如果你预期的范围是100英里,你可能可以接受。一旦你有一个圆,并且它的中心在XY平面上,你就可以映射回地球球体并重新检查你的距离。

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

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

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

Y=R*sin(长)*cos(宽)

Z=R*sin(横向)

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

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

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

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

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

距离为:

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

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


很抱歉没有用乳胶写我的数学题。

下面的答案是假装地球是一个完美的球体,这应该比把地球当作一个平面来处理给出更准确的答案

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

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

我不会使用Megiddo的算法来做半球性测试的线性规划部分。相反,使用Seidel的算法来解决线性规划问题,如Raimund Seidel在“简化小维线性规划和凸包”中所述。另请参见Kurt Mehlhorn的“赛德尔随机线性规划算法”和Christer Ericson的“实时碰撞检测”第9.4节

一旦你确定你的点是半球形的,就转到Gupta和Saluja的论文的第4节。本部分说明如何实际获取点的“最小封闭圆”

要进行所需的二次规划,请参阅N.D.Botkin的论文“求解二次规划的随机算法”。是有帮助的,但是本文使用(1/2)x^tgx-gx,而web教程使用(1/2)x^thx+cx^tx。一个加上术语,另一个减去,导致与符号相关的问题。提示:如果你使用C++,本征库非常好。 这个方法比上面的一些2D方法稍微复杂一些,但是它应该给你提供比完全忽略地球曲率更精确的结果。该方法还具有O(n)时间复杂度,可能是渐近最优的


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

找到任何给定点集的中心是我一直没有尝试解决的问题,但一旦解决了,哈弗森公式将帮助你确定它们是否落在半径范围内。中心不是只有各个纬度和经度平均值的纬度和经度,还是有一些我遗漏的球面几何的微妙之处?中心称为重心。但是,这没有帮助,因为这与包含所有点的最小圆的中心不同(想象右侧有一吨点,左侧有一吨点-重心在右侧,但圆心在中间),如上所述,你想做的事情可能和找到包含你的点的最小圆一样困难。这是一个棘手的问题(虽然不是不可能的困难)。在这种情况下,我会重新检查原始需求,看看是否有一个替代的东西可以计算出来,足以解决真正的根本问题。您可能不想将开发和CPU时间浪费在解决一个精确的数学问题上,而这个数学问题本身只是一个近似的问题,只是模糊地指定了一个开始。@las3jrock:在同一纬度45度上的两个点的中心,刚好在纬度45度以上。想一想,当投影到墨卡托地图上时,飞机的路径是如何“弯曲”的,即使