我有2063个位置存储在mysql表中。在我的一个过程中,我需要根据它们与给定原点的距离来排除某些结果。问题是,我需要一次过滤几百个,可能是几千个结果。
那么做距离数学的最佳方法是什么。我应该在运行时这样做吗
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之间的距离相同,但这仍然会导致表中的几百万行。
或..有更好的方法吗?
答案 0 :(得分:4)
您可以使用MySQL的空间扩展来计算距离,甚至可以在数据上创建R树索引,以优化某个范围内的点的查找。
有关详细信息,请参阅MySQL空间扩展的文档: http://dev.mysql.com/doc/refman/5.1-maria/en/spatial-extensions.html
答案 1 :(得分:1)
这个怎么样:
1. Loop through all points: 2. If abs(a-b) < distance && abs(a-b) < distance then: 3. Do the fancy distance calculation between a and b.
即。假设大多数点将位于您感兴趣的距离所定义的“框”之外,您可以使用步骤2非常快速地过滤掉大多数点,并且仅计算更少数量点的实际距离。
答案 2 :(得分: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