python - 计算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'.)
我想知道我是否在这里的格式不正确,是否将调用错误地传递给此函数,或者是否有更有效的方法来完成我在这里尝试做的事情。
任何帮助将不胜感激。
谢谢!
解决方案
polyFrame = gpd.GeoDataFrame(geometry=grids)
:-)
推荐阅读
- mysql - AWS Lambda 和 RDS 工作示例(需要它与 Sequelize 一起使用)
- javascript - 使用 Regex JS 删除字符串中的重复单词
- android - 使用 Mockito 测试最小的实时数据视图模型
- java - Java将差异数组转换为变量
- python - Virtutalenv 命令“python setup.py egg_info”失败,错误代码为 1
- javascript - 尽管 API 已激活,但在尝试使用嵌入地图 API 时出现 ApiNotActivatedMapError
- java - Spring Boot 仅在 IDE 中工作
- javascript - 从特殊字符前后的字符串中获取值 - Jquery
- r - 将 XLS 转换为 CSV - R(试用 Rio 包)
- java - LocalDateTime 和 SQL Server JDBC 4.2 驱动程序