QGIS 和 Python(geopandas) 之间的不同输出

different output between QGIS and Python(geopandas)

我是 python 和 qgis 的初学者。

我尝试使用交集将两个 shapefile 相交。 (多边形)

首先,我尝试了与 QGIS 的交集,它起作用了。 (EPSG : 4326) QGIS picture

但问题是,当我试图在 python 处相交时,只有一个值 returns。 怎么了??

这是我的代码

sb_4326 = buildings polygon
sg_4326 = city_polygon
import geopandas as gpd
###
###
sg4326 = gpd.read_file('sg_4326/sg4326.shp')
sb4326 = gpd.read_file('sb_4326/sb4326.shp')
mm = sb4326.intersects(sg4326)

Out[35]:
0        False
1        False
2        False
3        False
4        False
5        False
6        False
7        False
8        False
9        False
10       False
11       False
12       False
13       False
14       False
15       False
16       False
17       False
18       False
19        True
20       False
21       False
22       False
23       False
24       False
25       False
26       False
27       False
28       False
29       False

有 27000 个值。

我不确定当 geopandas 被交给两个大小不等的 GeoSeries (?) 时它的行为是什么。

你可能想要:

sb4326.geometry.map(lambda building: any(sg4326.intersects(building))

这将针对整个区域集测试每个建筑物,并且 return True 如果 any 的交叉点是 True

请注意,这 运行 相当缓慢。有一些技巧可以使它 运行 更快(QGIS 可能使用),但这是一个起点。

您可能想像这样使用 overlay

gpd.overlay(sg4326, sb4326, how='intersection')

这returns两个数据框相交形成的所有几何图形。

或者 sjoin 做你想做的事:

gpd.sjoin(sb4326, sg4326, how='inner', op='intersection')

这会为 sb4326 中的所有相交几何添加一个 index_right 列。