GeoPandas判断点在面内时提示两GeoSeries索引不同如何解决
GeoPandas空间包含判断问题解答
1. 报错原因与索引相关说明
这里提到的索引就是GeoSeries/GeoDataFrame自带的行索引,和普通Pandas对象的索引规则完全一致。
默认情况下contains是逐行对位运算,也就是默认规则是比对第1个多边形和第1个点、第2个多边形和第2个点,以此类推。如果两个GeoSeries的索引不一致,GeoPandas会判定存在数据错位风险,避免输出错误的匹配结果,因此会提前抛出报错。
举个例子:如果多边形GeoSeries有3个元素索引为
[0,1,2],点GeoSeries有5个元素索引为[1,2,3,4,5],默认状态下GeoPandas无法确认不同行的几何对象匹配规则,因此直接报错。
两个align参数的作用:
align=True:先把两个GeoSeries按索引值对齐,缺失匹配的位置返回空值align=False:忽略索引,严格按行的先后顺序对位比对,要求两个GeoSeries长度必须完全一致,否则也会抛出报错
2. 关于转Shapely对象的疑问
GeoPandas的GeoSeries本质就是封装了Shapely几何对象的序列,所有空间运算底层都是调用Shapely的接口实现,不需要手动转换Shapely对象,相关网络方案属于冗余操作。
3. 正确实现方法
你的需求是判断每个点是否落在任意一个多边形内部,不属于逐行对位匹配场景,因此不能直接调用shape.contains(points),可根据数据量选择以下两种方案:
方案1:空间连接(适合大批量数据,最常用)
import geopandas as gpd # 空间连接,inner模式仅保留落在多边形内部的点 # 左表为点、右表为多边形时,predicate用'within'语义更清晰,和'contains'结果一致 points_in_polygons = gpd.sjoin( points, shape, predicate='within', how='inner' )
如果需要给原始点表加是否在多边形内的标记,可补充以下代码:
points['in_polygon'] = points.index.isin(points_in_polygons.index)
方案2:单多边形匹配(适合小数据量、多边形仅1个的场景)
如果你的多边形表只有1个多边形,直接提取对应几何对象判断所有点即可:
# 提取第一个多边形的Shapely对象 target_polygon = shape.geometry.iloc[0] # 返回与点表长度一致的布尔序列,标记对应点是否在多边形内 points_in_flag = points.geometry.apply(lambda x: target_polygon.contains(x))
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

