【问题标题】:How to find the intersection of two geodataframes in pandas?如何在熊猫中找到两个地理数据框的交集?
【发布时间】:2018-07-14 05:14:42
【问题描述】:

关于我的工作的一些信息:

  1. 我有一个形状文件,其中包含从 ARC GIS 导出的县土壤 ssurgo 数据。它被读入 GeoDataFrame (Gdf1)。

  2. 我有一个形状文件,其中包含从 SMS AgLeader 导出的农场各个字段的边界。它已被读取为 DataFrame 并转换为 GeoDataFrame (Gdf2)。

当我执行子图时:

aa = Gdf1.plot()
Gdf2.plot(ax=aa)

我可以看到 Gdf2 落在 Gdf1 中。

这是我卡住的地方:

我正在尝试从 R 复制“裁剪”功能。Python 似乎具有应该可以工作的“叠加”功能,但我的代码从未完成运行。覆盖在这种情况下要么过慢要么根本不起作用(混淆,而不是声明 annnnnnnnd 我的沮丧点)。

R 代码示例(有效):

result <- crop(Gdf1, Gdf2)

永远不会完成执行的 Python 代码示例:

result = overlay(Gdf1, Gdf2, how='intersection')

我不确定的其他尝试:

*1。 result = Gdf1.geometry.intersects(Gdf2.geometry) # result.plot() 生成带有水平线的绘图。

*2。 result = Gdf1[Gdf1.within(Gdf2)] # result.plot() 给出错误:“cannot reindex from a duplicate axis”。

*3。 result = Gdf1['geometry'] & Gdf2['geometry'] # result.plot() 生成空白图。

【问题讨论】:

  • overlay 的性能不佳目前是一个已知问题。在这方面有一些工作,在这里你可以看到一个可能的新实现发布,你可以尝试:github.com/geopandas/geopandas/pull/338#issuecomment-290303715
  • 感谢您的指点。只需用“spatial_overlays”函数替换“overlay”就可以满足我的需求。当我在各个字段上迭代绘图时它仍然很慢,但至少我知道它现在可以工作。 # 有效的代码:result = spatial_overlays(Gdf1, Gdf2, how='intersection') result.plot()

标签: r python-3.x geospatial arcgis geopandas


【解决方案1】:

正如 Joris 在 cmets 中所说,overlay 的不良性能是众所周知的问题。 但是,这仅对“相交”操作特别不利。

如果您可以不使用“内部”或“包含”,我会试一试。在当前的实现中,它们要快得多。

within/contain 和 intersect 之间的主要区别在于它们处理边界的方式。来自文档:

相交
如果每个对象的边界和内部以任何方式与另一个对象的边界和内部相交,则返回 True。


如果每个对象的边界和内部仅与另一个对象的内部(而不是其边界或外部)相交,则返回 True。 (包含()的逆)

除此之外,您的第二次额外尝试可以通过以下方式修复:

result = Gdf1.loc[Gdf1.within(Gdf2)]

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2021-07-04
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多