【问题标题】:python: sorting two lists of polygons for intersectionspython:为交叉点排序两个多边形列表
【发布时间】:2011-01-24 00:15:55
【问题描述】:

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

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

所以对于列表 1 中的多边形 i,列表 2 中可能有几个多边形会与其相交。

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

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

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

另外,如果有更好的 StackExchange 站点来解决这个问题,请告诉我。我觉得它有点像一般 Python 编程、gis 和几何学的桥梁,所以我不太确定。

【问题讨论】:

  • 多边形是凸的吗?
  • 它们的顶点可能形成凸角或凹角,它们也有孔,但如果有帮助的话,我可以很容易地使用它们的边界框。
  • 空间分区!边界框上的四叉树或体积 kd 树。

标签: python sorting geometry gis


【解决方案1】:

Quadtrees 通常用于缩小需要相互检查的多边形集合的范围 - 只有两个多边形都占据了至少一个相同区域时,才需要相互检查四叉树。四叉树的深度(在多边形的情况下,而不是点)取决于您。

【讨论】:

  • 你认为四叉树在这种情况下是否足够简单,我应该读入它并在 python 中组合起来?或者这是我应该学习使用现有库的那种东西(例如 pygame 中的 QuadTree 类)?
  • 这听起来是最好的答案。谢谢你,琥珀。
【解决方案2】:

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

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

【讨论】:

  • 感谢 kynnysmatto - 了解这些方法的不同之处很有帮助。
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多