Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中选择与目标多边形共享边界的多边形,最好使用GeoPandas_Python_Geopandas_Shapely - Fatal编程技术网

在python中选择与目标多边形共享边界的多边形,最好使用GeoPandas

在python中选择与目标多边形共享边界的多边形,最好使用GeoPandas,python,geopandas,shapely,Python,Geopandas,Shapely,我有一个GeoDataFrame作为gdf。我想选择与id为4的目标几何体接触的多边形。但是,当我使用GeoPandas的touchs()时,它会吐出共享边界的几何体以及仅接触目标几何体一角的几何体(id为4)。我的GeoPandasintersects()也运气不好,因此它生成了touch()生成的所有几何体,包括目标几何体 我只想选择那些实际上与目标(id 4)共享边界的几何体,这样输出将仅是id为(3,7,5,1)的几何体。 code: import geopandas as gpd gd

我有一个GeoDataFrame作为
gdf
。我想选择与id为4的目标几何体接触的多边形。但是,当我使用GeoPandas的
touchs()
时,它会吐出共享边界的几何体以及仅接触目标几何体一角的几何体(id为4)。我的GeoPandas
intersects()
也运气不好,因此它生成了
touch()
生成的所有几何体,包括目标几何体

我只想选择那些实际上与目标(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])]

您可以使用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')