我有大量的多边形(~100000),并尝试找到一种智能方法来计算它们与规则网格单元的相交面积。
目前,我正在使用shapely创建多边形和网格单元(基于它们的角坐标)。然后,我使用一个简单的for循环遍历每个多边形,并将其与附近的网格单元进行比较。
只是一个小例子来说明多边形/网格单元。
from shapely.geometry import box, Polygon
# Example polygon
xy = [[130.21001, 27.200001], [129.52, 27.34], [129.45, 27.1], [130.13, 26.950001]]
polygon_shape = Polygon(xy)
# Example grid cell
gridcell_shape = box(129.5, -27.0, 129.75, 27.25)
# The intersection
polygon_shape.intersection(gridcell_shape).area
(顺便说一下:网格单元的尺寸为0.25x0.25,多边形最大为1x1)
实际上,对于单个多边形/网格单元组合来说,这相当快,大约需要0.003秒。然而,在我的机器上,在大量多边形(每个多边形可以与数十个网格单元相交)上运行这段代码大约需要15分钟(根据相交网格单元的数量,最多需要30分钟),这是不可接受的。不幸的是,我不知道如何编写多边形相交的代码来获得重叠面积。你有什么建议吗?有没有一个替代品来塑造身材?
自2013/2014年以来,Shapely拥有STRtree。我已经用过了,而且看起来效果很好。
以下是docstring中的一段代码:
STRTree是一个使用Sort-Tile-Recursion算法创建的R树。STRTree将一系列几何对象作为初始化参数。初始化后,查询方法可用于对这些对象进行空间查询。
>>> from shapely.geometry import Polygon
>>> from shapely.strtree import STRtree
>>> polys = [Polygon(((0, 0), (1, 0), (1, 1))), Polygon(((0, 1), (0, 0), (1, 0))), Polygon(((100, 100), (101, 100), (101, 101)))]
>>> s = STRtree(polys)
>>> query_geom = Polygon([(-1, -1), (2, 0), (2, 2), (-1, 2)])
>>> result = s.query(query_geom)
>>> polys[0] in result
True
考虑使用Rtree来帮助识别面可能与哪些格网单元相交。这样,您可以删除与lat/lons数组一起使用的for循环,这可能是最慢的部分。
像这样组织你的代码:
from shapely.ops import cascaded_union
from rtree import index
idx = index.Index()
# Populate R-tree index with bounds of grid cells
for pos, cell in enumerate(grid_cells):
# assuming cell is a shapely object
idx.insert(pos, cell.bounds)
# Loop through each Shapely polygon
for poly in polygons:
# Merge cells that have overlapping bounding boxes
merged_cells = cascaded_union([grid_cells[pos] for pos in idx.intersection(poly.bounds)])
# Now do actual intersection
print(poly.intersection(merged_cells).area)
问题内容: 我有大量的多边形(〜100000),并尝试找到一种聪明的方法来计算与常规网格单元的相交面积。 当前,我正在使用形状(基于它们的角坐标)来创建多边形和网格单元。然后,使用简单的for循环,遍历每个多边形并将其与附近的网格单元进行比较。 只是一个小例子来说明多边形/网格单元。 (顺便说一句:网格单元的尺寸为0.25x0.25,多边形的最大值为1x1) 实际上,对于单个多边形/网格单元组合来
问题内容: 除了我的Rect类: 我有一种方法来检查两个Rect是否相交(无双关): 测试用例: 这堂课很好。 我想知道的是,是否还有另一种(也许更快)的方式来检查矩形是否相交。我可以以某种方式对其进行优化吗? 问题答案: 我倾向于将矩形存储为min x,min y,max x和max y。然后当发生重叠时 如果它们重叠,则交点定义为 如果它们具有相同的边界,则应根据您是否认为它们重叠来进行一些注
我们是否可以使用符合以下条件的mongodb地理空间查询来查询和获取位置数据? 获取两个框或一般两个多边形之间交集的所有位置。 例如,在下面,我们能在查询输出中只获得那些位于黄色区域内的位置吗?黄色区域实际上是紫色和红色几何对象[多边形]的公共区域?
我目前正在使用JavaFX研究不同形状之间的边界相交。我想检测两个多边形在它们的点上的碰撞,而不是在它们的边界上(即2个多边形)。 请参阅图1:不期望的行为,以及图2:期望的行为。 是否有任何现有的算法可以帮助我或使用任何库?提前感谢:) 在这里找到我的解决方案: 输出: 它似乎工作正常,我将使用Path对象进行测试以替换多边形objets。
我是新来的,对C#来说也是新来的,我希望有一个简单的问题要解决。 (我使用gmaps.net for winforms来实现这一点,但也将通过web API maps版本使用该方法)。 我们的数据库中有一个zipcodes和Area的数据库。每个区域包含多个Zipcode。每个zipcode都有一系列坐标,可以为该zipcode创建一个google maps多边形。 目前,如果我们想在地图上显示我
问题内容: 测试2个矩形是否相交的快速方法是什么? 在Internet上进行了搜索,找到了这种单行代码(WOOT!),但我不知道如何用Javascript编写它,它似乎是用C ++的古老形式编写的。 问题答案: 这就是将代码转换为JavaScript的方式。请注意,正如注释所建议的那样,您的代码和本文的代码中都有一个错字。该功能应该并且应该具体起作用。 测试用例: