python:为交叉点排序两个多边形列表

时间:2011-01-24 00:15:56

标签: python sorting geometry gis

我有两个大的多边形列表。

使用python,我想获取列表1中的每个多边形,并找到它与列表2中的多边形的几何交集的结果(我使用shapely来执行此操作)。

因此,对于列表1中的多边形 i ,列表2中可能有多个与其相交的多边形。

问题是两个列表都很大,如果我只是嵌套两个循环并为每个循环运行交集命令 可能的一对多边形,需要很长时间。我不确定在布尔测试的交点之前是否会显着加快这一点(例如,如果相交:返回交叉点)。

对于我来说,排序或组织这两个多边形列表以便制作交叉点的好方法 更高效?是否有适合这种情况的排序算法,我可以使用python进行排序?

我对编程比较陌生,没有离散数学的背景,所以如果你知道一个现有的算法  我应该使用(我假设存在这种情况),请链接或给出一些可以帮助我实际解释的解释 在python中实现它。

另外,如果这个问题有更好的StackExchange网站,请告诉我。我觉得它有点桥接一般的python编程,gis和几何,所以我不太确定。

2 个答案:

答案 0 :(得分:8)

Quadtrees通常用于缩小需要相互检查的多边形集合 - 如果两个多边形都至少占用一个多边形,则只需相互检查两个多边形四叉树中的区域。你的四叉树有多深(在多边形的情况下,而不是点)取决于你。

答案 1 :(得分:3)

即使只是将空间划分为较小的恒定大小区域,也会加快交叉点检测(如果您的多边形很小且足够稀疏)。您创建一个网格并将每个多边形标记为属于网格中的某些单元格。然后找到其中包含多个多边形的单元格,并仅对这些多边形进行交集计算。这种优化是最容易编码的,但最无效。第二种最简单,最有效的方法是四叉树。然后有BSP tres,KD树和BVH树可能是最有效的,但最难编码。

编辑: 另一个优化如下:找出每个多边形的最左侧和最右侧顶点并将它们放在列表中。对列表进行排序,然后以某种方式从左到右循环,轻松找到边界框的x坐标重叠的多边形,然后对这些多边形进行交集计算。