首页 > 解决方案 > 在python中选择与目标多边形共享边界的多边形,最好使用GeoPandas

问题描述

我有一个 GeoDataFrame 作为gdf. 我想选择接触 id 为 4 的目标几何体的多边形。但是当我使用 GeoPandas 时touches(),它会吐出共享边界的几何体以及仅接触目标几何体的一角(id 为 4)的几何体。我对 GeoPandas 的运气也很差,intersects()以至于它产生了所有产生的几何图形,touches()包括目标几何图形。

我只想选择那些实际上与目标(id 4)共享边界的几何图形,这样输出将只是 ID 为(3、7、5、1)的几何图形。 code:

import geopandas as gpd
gdf = ,Id,geometry
        0,0,"POLYGON ((-2247824.100899419 -4996167.43201861, -2247824.100899419 -4996067.43201861, -2247724.100899419 -4996067.43201861, -2247724.100899419 -4996167.43201861, -2247824.100899419 -4996167.43201861))"
        1,0,"POLYGON ((-2247724.100899419 -4996167.43201861, -2247724.100899419 -4996067.43201861, -2247624.100899419 -4996067.43201861, -2247624.100899419 -4996167.43201861, -2247724.100899419 -4996167.43201861))"
        2,0,"POLYGON ((-2247624.100899419 -4996167.43201861, -2247624.100899419 -4996067.43201861, -2247524.100899419 -4996067.43201861, -2247524.100899419 -4996167.43201861, -2247624.100899419 -4996167.43201861))"
        3,0,"POLYGON ((-2247824.100899419 -4996067.43201861, -2247824.100899419 -4995967.43201861, -2247724.100899419 -4995967.43201861, -2247724.100899419 -4996067.43201861, -2247824.100899419 -4996067.43201861))"
        4,0,"POLYGON ((-2247724.100899419 -4996067.43201861, -2247724.100899419 -4995967.43201861, -2247624.100899419 -4995967.43201861, -2247624.100899419 -4996067.43201861, -2247724.100899419 -4996067.43201861))"
        5,0,"POLYGON ((-2247624.100899419 -4996067.43201861, -2247624.100899419 -4995967.43201861, -2247524.100899419 -4995967.43201861, -2247524.100899419 -4996067.43201861, -2247624.100899419 -4996067.43201861))"
        6,0,"POLYGON ((-2247824.100899419 -4995967.43201861, -2247824.100899419 -4995867.43201861, -2247724.100899419 -4995867.43201861, -2247724.100899419 -4995967.43201861, -2247824.100899419 -4995967.43201861))"
        7,0,"POLYGON ((-2247724.100899419 -4995967.43201861, -2247724.100899419 -4995867.43201861, -2247624.100899419 -4995867.43201861, -2247624.100899419 -4995967.43201861, -2247724.100899419 -4995967.43201861))"
        8,0,"POLYGON ((-2247624.100899419 -4995967.43201861, -2247624.100899419 -4995867.43201861, -2247524.100899419 -4995867.43201861, -2247524.100899419 -4995967.43201861, -2247624.100899419 -4995967.43201861))"

shares_boundary = gdf[gdf.geometry.touches(gdf['geometry'][4])]

gdf

标签: pythongeopandasshapely

解决方案


您可以编写一个函数,使用 shapely 方法,实现您的逻辑,如下所示:

def share_boundary(geom1, geom2):
    if geom1.touches(geom2):
        if not isinstance(geom1.intersection(geom2), Point):
            return True
    return False

然后使用以下命令将其应用于您的几何列apply

result = gdf[gdf.geometry.apply(lambda x: share_boundary(x, gdf['geometry'][4]))]
print(result.index) # Int64Index([1, 3, 5, 7], dtype='int64')

推荐阅读