匀称的“ is_valid”将True返回无效的重叠多边形

问题描述

我有5个多边形的shapefile,我在geopandas中加载了它们。我想检查这些多边形是否相互重叠。

enter image description here

我想确定所有重叠的多边形。我读了整齐的手册,说is_valid工具可以检测到以下情况:

object.is_valid如果某个功能在某种意义上为“有效”,则返回True。 1。

注意

有效性测试仅对多边形和多多边形有意义。 对于其他类型的几何图形,总是返回True。

有效的多边形不得具有任何重叠的外部或内部 戒指。有效的Multipolygon可能不会收集任何重叠的多边形。 无效功能的操作可能会失败。

所以我已经在多边形上尝试过了

imprt geopandas as gpd
import shapely as sh

shapes = gpd.read_file(r'test.shp')

shapes.head()

>>>
    id  geometry
0   1   polyGON ((15.49457 7.61388,15.71412 7.59753,...
1   3   polyGON ((15.60721 7.70417,15.91074 7.71807,...
2   2   polyGON ((15.86208 7.28826,16.07873 7.31838,...
3   5   polyGON ((15.34075 7.85246,15.46587 7.85362,...
4   4   polyGON ((15.84123 7.48057,16.03354 7.48405,...

shapes['validation']=shapes['geometry'].is_valid

shapes.head()

>>>id   geometry                                           validation
0   1   polyGON ((15.49457 7.61388,...   True
1   3   polyGON ((15.60721 7.70417,...   True
2   2   polyGON ((15.86208 7.28826,...   True
3   5   polyGON ((15.34075 7.85246,...   True
4   4   polyGON ((15.84123 7.48057,...   True

yuo可以看到

,即使1,3,4重叠,所有多边形也都为True。为什么会这样呢?据我从手册中了解到,它是否还要显示同一图层中的多边形?

我的最终目标:将重叠的多边形分类为False /重叠

解决方法

Shapely的is_valid在单个多边形上工作,并检查该多边形的内外环之间是否重叠。它不会检查与他人的重叠。您所有的多边形都是完全有效的。

如果要检查多边形是否彼此重叠,则应使用geopandas空间索引功能进行检查。

input_indices,result_indices = shapes.sindex.query_bulk(shapes.geometry,predicate='overlaps')
overlapping = numpy.unique(result_indices)  # integer indeces of overlapping

如果要从中获取布尔数组:

import numpy

results = numpy.ones(len(shapes),dtype=bool)
results[overlapping] = False

shapes['validation'] = results

请注意,这需要Geopandas 0.8 +