ArcGIS Pro字段计算结合Python len()的自定义函数异常排查
原脚本核心错位问题梳理
- 代码执行流断联:所有
return语句分布在三个类型字段判断、面积判断分支上,后续书写的Fieldvalue5.upper()代码位于函数无return的路径末端,永远不会被执行 - 空值触发报错:直接对可能为ArcGIS空值(Python中对应None)的字段调用
len()方法,会直接抛出类型错误,未先做无效值过滤 - 参数逻辑错配:需求要求将Typ1/Typ2/Typ3的标识文本转大写,原代码将大写转换逻辑绑定到了未参与核心计算的
!total!字段上 - 规则应用顺序颠倒:Shape_area低于60统一修正为60的规则未前置处理,反而被放在类型字段判断之后单独返回,脱离了“类型字段+面积值”的拼接核心目标
- 兜底逻辑缺失:未实现“三个类型字段均无有效取值时返回No data”的判断,原代码走完类型字段判断分支后,会直接进入面积判断,逻辑完全偏离需求
适配原调用语句的修正代码
直接把以下代码粘贴到字段计算的代码块中,无需改动原函数调用语句value (!Typ1!, !Typ2!, !Typ3!, !Shape_area!, !total!):
def value(Fieldvalue1, Fieldvalue2, Fieldvalue3, Fieldvalue4, Fieldvalue5): # 前置处理Shape_area值:低于60统一校准为60 try: area_num = float(Fieldvalue4) area_part = "60" if area_num < 60 else str(area_num) except: # 面积值为空、格式异常时默认用60参与拼接,避免计算中断 area_part = "60" # 按优先级取第一个有效类型字段值,统一转大写 valid_type = None for field_val in [Fieldvalue1, Fieldvalue2, Fieldvalue3]: if field_val is None: continue type_str = str(field_val).strip() # 保留原代码的“字段长度大于1才算有效”判断规则 if len(type_str) > 1: valid_type = type_str.upper() break # 按规则返回最终结果 if valid_type: return f"{valid_type}_{area_part}" else: return "No data"
现场调试校验要点
- 字段计算对话框的解析器需选择
Python 3,避免脚本语法不兼容 - 分场景测试:
- 当Typ1有长度大于1的有效文本、Shape_area为40时,校验返回值是否为「大写后的Typ1内容_60」
- 当Typ1、Typ2为空,Typ3有有效文本、Shape_area为120时,校验返回值是否为「大写后的Typ3内容_120」
- 当三个Typ字段均为空或长度小于1时,校验返回值是否为
No data
- 如果类型字段存在单字符的有效取值,只需将有效判断的
len(type_str) > 1调整为len(type_str) > 0即可
内容的提问来源于stack exchange,提问作者Vandeda
相关产品推荐
相关产品推荐

