[英]Selecting polygons which shares a boundary with target polygon in python preferably using GeoPandas
我有一个 GeoDataFrame 作为gdf
。 我想要 select 多边形,它接触 id 为 4 的目标几何体。但是当我使用 GeoPandas 的touches()
时,它会吐出共享边界的几何体以及仅接触目标几何体的一角(id 为 4)的几何体。 我对 GeoPandas intersects()
也很不走运,以至于它产生了touches()
产生的所有几何图形,包括目标几何图形。
我只想 select 那些实际上与目标(id 4)共享边界的几何图形,这样 output 将只是具有 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])]
您可以编写一个 function,使用匀称的方法,实现您的逻辑,如下所示:
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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.