首页 > 解决方案 > 如何在 Shapely 中找到每对 LineString 之间的交点?

问题描述

我有一个包含来自 Shapely 的 LineString 的子列表列表,如下所示:

My_list = [
           [(0, 0), (1, 1), (1,2), (2,2)], 
           [(0, 0), (1, 1), (2,1), (2,2)], 
           [(-1, 0), (1, -1), (-2,1), (2,0)]
          ]

在我的列表中,我有三个(在这个例子中是三个,在我的例子中是数千个)集合,它们在 Shapely 中定义为 LineString。

现在我喜欢迭代地找到每个子列表之间的交集,例如我说的,这里我有三个 LineStrings。让我们称他们为a1, a2, a3.

a1 = [(0, 0), (1, 1), (1,2), (2,2)]

a2 = [(0, 0), (1, 1), (2,1), (2,2)]

a3 = [(-1, 0), (1, -1), (-2,1), (2,0)]

我想找到每对之间的交点检查(并找到交点):(a1,a2),(a1,a3),(a2,a1),(a2,a3),(a3,a1),( a3,a2)。

标签: pythonintersectionshapely

解决方案


下面是一个查找 2 个可迭代列表之间的交集的函数:

def find_intersection(list1,list2):
    lst =[]
    for el1 in list1 :
            if any(el1 is el2 for el2 in list2):
                lst.append(el1)
    return lst

您可以像我一样在循环中使用它来返回所有子列表之间的所有可能交集:

result = []
for index1 in range(0,len(My_list)):
    for index2 in range(0,len(My_list)) :
        if index1 is not index2 :
            inter = find_intersection(My_list[index1],My_list[index2])
            if inter :
                result.append({('a'+str(index1 +1 ),'a'+str(index2 + 1 )): inter})

为了使结果可读,我让它返回一个字典列表,如: [ { (a1,a2) :inter1 } (a1,a3) :inter2 } ect ..]

请注意,我忽略了结果列表中没有交集的夫妇。


推荐阅读