【发布时间】:2018-11-23 07:29:51
【问题描述】:
我有一个函数
get_polygon(polygon_collection, point):
for polygon in polygon_collection:
if polygon.intersects(point):
return polygon
return None
这种方法有效,但它在 O(n) * O(单多边形检查)中。如果构建树数据结构,这肯定可以减少到 O(log(n)) * O(单多边形检查)。
shapely 是否直接支持这一点?
多边形集合的结构
- 该集合包含 n 个 MultiPolygons - 因此一个对象可以包含许多多边形。
- 每个 MultiPolygon 都可以有飞地/飞地
- 通常 (> 95%),它们是没有孔的简单多边形
- 通常 (> 50%),形状相当简单(例如正方形)
用例示例
多边形列表可以是德国的邮政编码区域。那将是数千。然后我有我和一些朋友的 GPS 位置,也有几千个。我想说的是我们在哪个区域获得了最多的数据点。
【问题讨论】:
-
我认为您没有正确解决问题(针对您的用例)。德国的邮政编码有特定的顺序,您永远不应该检查那里的所有邮政编码。从检查第一个数字开始,这样你就可以排除 ~9/10 并且永远不必检查那些。然后从那里缩小范围。将邮政编码视为一棵树。如果您可以排除整个分支,您将永远不会遍历所有叶子。
-
对于一般多边形,预先计算 gps-achses 边界框的排序列表,然后找出 gps 坐标可以在哪些多边形中。如果您的 x 坐标(或任何 gps 等价物)为 5,并且您的多边形分布在 0 到 100 之间,则只检查边界框从 5 开始并从 5 右结束的那些。这部分迭代了 2 个排序列表。 y 也一样。
-
@DonQuiKong 我描述的用例比我的实际用例简单得多。我已经建议构建一个树形数据结构是我想做的事情(事实上,我已经为它编写了自定义软件)。但我想知道 shapely 是否内置了对构建和使用树的支持。