如何扩展函数至数据框列?解决GeometryTypeError报错问题
问题分析与解决方案
错误原因
- 参数传递错误:你调用
apply时传入了整个df2['area']和df2['branch']Series,而函数期望接收单个多边形和分支名称。这导致shape(area)试图处理整个Series而非单个几何对象,进而触发GeometryTypeError(shape仅支持单个GeoJSON特征,无法处理FeatureCollection或Series)。 - 全局列表误用:函数中使用全局
within列表会累积所有行的结果,导致每一行返回的都是整个列表,而非当前点的判断结果,完全不符合需求。
修正后的代码
重构判断函数
def latlon_check(point, polygons_df): # 遍历所有多边形分支 for _, row in polygons_df.iterrows(): # 处理GeoJSON字符串转几何对象(若area已是Geometry类型可省略shape转换) polygon = shape(row['area']) if isinstance(row['area'], str) else row['area'] if point.within(polygon): return f"True,{row['branch']}" # 未匹配任何多边形时返回False return "False"
正确调用apply
df1['within'] = df1['intsct'].apply(latlon_check, args=(df2,))
关键说明
- 函数接收单个点和完整的
df2,逐行遍历df2中的多边形与分支名,找到第一个包含该点的分支后立即返回结果。 - 若
df2['area']已经是Geopandas的Polygon/MultiPolygon类型,直接使用row['area']即可,无需shape()转换,能提升运行效率。 - 若需支持点匹配多个多边形的场景,可修改函数收集所有匹配的分支名,例如返回
"True,分支1,分支2"格式。
内容的提问来源于stack exchange,提问作者daryllim18
相关产品推荐
相关产品推荐

