首页 > 解决方案 > 计算geopandas中多边形网格上的每条线交点

问题描述

我有一个 40 多年来过去风暴的大型数据集(约 20000 个),其中包含 3 小时间隔内的中心点列表。我正在尝试将网格覆盖到一个大区域上,我想从该区域计算每次风暴通过任何给定网格单元的次数,但是我当前的实现仅以这三个小时的间隔跟踪位置,导致某些情况下,轨道在也应该被计算在内时会跳过网格空间。

我正在尝试使用 geopandas 来解决这个问题,而不是为每个风暴轨道创建一个 lineeries,然后对网格网格执行交叉,但是,我找不到任何允许我这样做的功能实现。

为了在 geopandas 中创建网格,我使用了上一个问题中的以下解决方案

lonCount = ((plotExtent[1]+360) - (plotExtent[0]+360)) * gridResolution
latCount = ((plotExtent[3]) - (plotExtent[2])) * gridResolution

lons = np.linspace(plotExtent[0], plotExtent[1], lonCount)
lats = np.linspace(plotExtent[2], plotExtent[3], latCount)
# Store the meshgrid in polygon format
xlines = [((x1, yi), (x2, yi)) for x1, x2 in zip(lons[:-1], lons[1:]) for yi in lats]
ylines = [((xi, y1), (xi, y2)) for y1, y2 in zip(lats[:-1], lats[1:]) for xi in lons]
# Save as a Shapely object, then store in geopandas
grids = list(polygonize(MultiLineString(xlines + ylines)))
polyFrame = gpd.GeoDataFrame(grids)

这将创建一个包含约 5600 个多边形对象的 geoDataSeries。然后,我循环遍历每个风暴对象以去除纬度/经度列表对,并将它们转换为形状优美的 LineSeries 对象,然后将其读取到 geopandas 中:

polyLine = LineString(list(zip(storm_lons, storm_lats)))
coord_tests = gpd.GeoSeries(polyLine)

我的目标是简单地做这样的事情:

I = coord_tests.intersects(polyFrame)

但是,要收集 LineString 与之相交的多边形列表,这会提示以下错误:

AttributeError: No geometry data set yet (expected in column 'geometry'.)

我想知道我是否在这里的格式不正确,是否将调用错误地传递给此函数,或者是否有更有效的方法来完成我在这里尝试做的事情。

任何帮助将不胜感激。

谢谢!

标签: pythonnumpygeopandas

解决方案


polyFrame = gpd.GeoDataFrame(geometry=grids)

:-)


推荐阅读