目标:给定坐标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
答案 0 :(得分:0)
如果我正确理解了您的问题,那就是拥有正确的数据结构的问题。
让我们具有以下数据结构, 1.从线多边形到点的字典 2.另一个从点到线多边形的字典(或等效地从bidict而不是几个字典的单个双向地图) 3. 访问的布尔数组,其大小等于点数
现在,以下算法可以解决您的问题(可以通过上述数据结构有效地实现):
对于所有点,将访问数组初始化为False。
首先从kd树中找到最接近查询点的点,将匹配点和匹配点所属的对应多边形中的所有点标记为已访问,并将该特定多边形(id)返回为最接近的多边形(如果有多个这样的多边形,请全部返回)。
重复步骤2,直到返回n个这样的(不同的)多边形。考虑从kd-tree返回的新点与尚未访问的查询点匹配(如果kd-tree返回的匹配点已被访问,则将其丢弃并查询下一个最近的匹配点)。一旦访问了一个点,则将该点和来自相应多边形的所有点标记为已访问,然后返回该多边形。
答案 1 :(得分:0)
我看到了两种有效的方法: