【问题标题】:What is the most efficient way to work with distances between two coordinates?处理两个坐标之间的距离的最有效方法是什么?
【发布时间】:2010-10-28 23:23:48
【问题描述】:

我在 mysql 表中存储了 2063 个位置。在我的一个过程中,我需要根据它们与给定原点的距离来排除某些结果。问题是,我需要一次过滤几百个甚至几千个结果。

那么做距离数学的最佳方法是什么。我应该在运行时这样做吗

1. Find all points connecting to my point of origin
2. loops through the connecting points
3. calculate the distance between the point of origin and the connecting point
4. exclude the connecting point if the distance if too great

或者我应该创建一个查找表,其中已经计算出每个点之间的距离。我可以避免重复行,因为 p1 和 p2 之间的距离将与 p2 和 p1 之间的距离相同,但这仍然会导致表中有几百万行。

或者..有更好的方法吗?

【问题讨论】:

  • 尝试静态查找表...生成的可执行文件大小应该很有趣:D ~ 2063! * 8 个字节(每个结果的浮点数)

标签: mysql google-maps performance geospatial


【解决方案1】:

由于您的数据位于 mysql 表中,因此您确实需要 SQL 能够帮助您的解决方案。

我假设每个位置都有一个 x 和 y 坐标。将这些作为单独的条目存储在表中。

您可以快速将搜索范围缩小到以您的兴趣点为中心的框。 例如

WHERE X > (MyPosX - Range) AND X < MyPosX + Range) 
AND Y > (MyPosY - Range) AND Y < MyPosY + Range)

一旦您有可能在范围内的较小项目集,您就可以使用更具迭代性的方法

编辑:在计算实际距离时避免平方根计算,因为这些计算很昂贵。例如,而不是

sqrt(x*x + y*y) < distance

试试

(x*x + y*y) < distance*distance    
// distance*distance is a constant and can be calculated once

【讨论】:

    【解决方案2】:

    这个怎么样:

    1.遍历所有点: 2. 如果 abs(a-b) &lt distance && abs(a-b) &lt distance 那么: 3. 做a和b之间的花式距离计算。

    即假设大多数点都在您感兴趣的距离定义的“框”之外,您可以通过第 2 步非常快速地过滤掉大多数点,只计算少得多的点的实际距离。

    【讨论】:

    • +1 假设您的意思是在计算真实距离之前只计算 dx && dy
    【解决方案3】:

    您可以使用 MySQL 的空间扩展来计算距离,甚至可以在数据上创建一个 R-tree 索引来优化在某个范围内的点查找。

    有关详细信息,请参阅 MySQL 空间扩展的文档: http://dev.mysql.com/doc/refman/5.1-maria/en/spatial-extensions.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多