You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展函数至数据框列?解决GeometryTypeError报错问题

问题分析与解决方案

错误原因

  1. 参数传递错误:你调用apply时传入了整个df2['area']和df2['branch'] Series,而函数期望接收单个多边形和分支名称。这导致shape(area)试图处理整个Series而非单个几何对象,进而触发GeometryTypeError(shape仅支持单个GeoJSON特征,无法处理FeatureCollection或Series)。
  2. 全局列表误用:函数中使用全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:45:33