2012-11-20 41 views
3

我正在开发一种算法和数据结构来处理大量二维点上的欧几里德距离查找。地理空间查找

我试过在谷歌学者研究这个,但没有发现任何东西(可能是因为我不知道这个问题通常在文献中被称为什么)。

这是我认为这两种方法:

方法1: 创建一个水桶电网bidimentional。将点插入桶中,保留每个点桶的参考。 查找距离为D的点P,得到它的桶B以及其网格平方的任一角具有的所有桶(到B的距离)< D. 最后,枚举所有这些桶中的点并计算距离至P.

方法2: 创建两个列表,每个列表的所有点都由坐标(x,y)之一排序。在距离为D的点P上查找,执行二进制搜索以在每个列表中找到两个点,以便找到矩形区域,其点的切比雪夫距离为P < D. 最后,计算所有这些点的欧氏距离P

我猜测最先进的算法将大大优于这个,但?在这个任何想法表示赞赏

+2

我没有资格回答这个问题,但这个链接可能有帮助 - 它解释了MongoDB的地理空间索引是如何实现的。 http://www.kchodorow.com/blog/2011/06/08/mongo-in-flatland/ – Rich

+0

你在问[2D会合](http://c2.com/cgi/wiki?TwoDimensionalRendezvous)还是[ 2D范围查询](http://c2.com/cgi/wiki?TwoDimensionalRangeQuery)? –

+0

@DavidCary没有,看起来,尽管它更类似于2D范围查询。这个问题可以概括为“找到与点P的欧氏距离小于D的所有点” – goncalopp

回答

5

一些技巧可以帮助你:

  • 看看KDTree,这是一个k维树(在你的情况2D),这是看的最佳途径之一为最近邻居。
  • 也许你可以从专门为处理地理空间数据而开发的Spatial Database中受益;
  • 你可以使用上述任何一种与你想要的距离功能。根据您的应用,您需要地图距离,大圆距,恒定斜距,恒定轴承距离等。您的距离函数应由您知道。我使用大圆圈(haversine)来处理google-maps-like地图和轨道。

如果你想要一个Python实现,有scipy.spatialdocs)。从这个模块,功能query_ball_point((px, py), radius)似乎是你在找什么。

希望这会有所帮助!

+1

特别是,[Quadtree](http://en.wikipedia.org/wiki/Quadtree)(另一个2d KDTree)将是默认解决方案,特别是在直角坐标上使用欧几里德距离函数时即如果你忽略了地球表面的曲率)。 –

+1

@ErikP。我想象一个四叉树是一个常规细分(将正方形细胞分成一半以获得半个小的方形细胞),而KD树不一定将细胞分成相同大小的子细胞。相反,在KD树中,子单元的尺寸取决于单元内部的点分布。那是对的吗? – heltonbiker

+0

我倾向于认为(ir)细分的规律性是KDTrees(或四叉树)中的一个(重要的!)实现选择,但我开始相信你是正确的,并且我的使用条款是非标准的。无论如何,在这种情况下,我认为原则上定期的和不定期的细分都是可行的;这可能取决于哪种方法最适合的点分布。 –