python - 在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])]
解决方案
您可以编写一个函数,使用 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')
推荐阅读
- android - 安卓工作室 4.1.3。项目视图 > Android 卡在加载中
- matlab - Barchart Matlab-确定平均值和创建带有误差线的条形图的问题
- mysql - 找不到将mysql连接到phpmyadmin数据库的方法
- c++ - 重载运算符“=”用于具有共享ptr c ++的向量
- python - 在给定已打开文件的情况下加载 Keras 模型
- laravel - Laravel API:如何在表中制作默认图像而不是 NULL
- visual-studio-code - 如何构造加入终端的“When”条件?
- mysql - 从多个表中选择并与 COUNT 关联
- javascript - 使用Javascript在输入元素中输入文本
- google-cloud-platform - 在 Bigquery 中执行存储过程时捕获错误消息和执行详细信息