Python kdtree查找“ n”个最近的相邻组(坐标)

时间:2018-08-27 04:04:03

标签: python algorithm data-structures nearest-neighbor kdtree

目标:给定坐标X,找到坐标X的“ n”个最近的线多边形,而不仅仅是“ n”个最近的点。示例:https://i.imgur.com/qyxV2MF.png


我有一组空间线多边形,可以具有两个以上的坐标。它们的坐标存储在(scipy)KDtree中,以启用NN搜索。

首先,我将查询“ i”个最接近的坐标,然后查找相应的line-polygons->“ i”个坐标不一定会产生“ i”条线。

为了获得最接近的“ n”行,我需要增加“ i”。我的问题是“ i”可能是不可预测的,因为每个线多边形之间的坐标数都不同。例如,线多边形可以用2个坐标表示,但另一个可以用10个坐标表示。大多数时候,我只需要从点X开始2个最近的相邻线多边形。

在示例图像中,我需要A和B行作为结果。即使“ i” = 3,也只能找到A行,因为A1,A2,A3是X的最近邻居。


问题:是否可以将形状的坐标分组在一起,然后进行NN搜索以获得“ n”个唯一形状? (除了强制使用“ i”以确保“ n”个唯一形状之外)


当前解决方法伪代码:

found = []
while True:
    if first_loop:
        result = look up N nearest coords
    else:
        result = look up Nth nearest coord

    look up shapes using result and append to found
    perform de-duplication of found

    if len(found) >= required:
         return found
    else:
         N = N+1 # to check the Nth neighbor next iteration

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,那就是拥有正确的数据结构的问题。

让我们具有以下数据结构,  1.从线多边形到点的字典  2.另一个从点到线多边形的字典(或等效地从bidict而不是几个字典的单个双向地图)  3. 访问的布尔数组,其大小等于点数

现在,以下算法可以解决您的问题(可以通过上述数据结构有效地实现):

  1. 对于所有点,将访问数组初始化为False。

  2. 首先从kd树中找到最接近查询点的点,将匹配点和匹配点所属的对应多边形中的所有点标记为已访问,并将该特定多边形(id)返回为最接近的多边形(如果有多个这样的多边形,请全部返回)。

  3. 重复步骤2,直到返回n个这样的(不同的)多边形。考虑从kd-tree返回的新点与尚未访问的查询点匹配(如果kd-tree返回的匹配点已被访问,则将其丢弃并查询下一个最近的匹配点)。一旦访问了一个点,则将该点和来自相应多边形的所有点标记为已访问,然后返回该多边形。

答案 1 :(得分:0)

我看到了两种有效的方法:

  1. 为完整的“线多边形”建立索引:为此,您可以通过最小边界矩形来边界每个线多边形。然后使用适当的索引结构(例如R-Tree)对所有矩形进行索引。代替点,您将在最底层使用线多边形,因此您必须针对这种情况调整距离。
  2. 使用Distance Browsing:此处的想法是在每个点上附加其线多边形的ID,并在索引结构(例如KD-Tree)中为这些点建立索引。然后,您可以使用距离浏览连续检索查询的下一个最近点。继续进行直到找到n个不同的线多边形的点。