ArcMap10.7 arcpy实现多表关联自动计算成本字段值
ArcMap 10.7 arcpy多表关联成本计算实现方案
核心优化点
- 所有中间计算过程使用
in_memory内存临时表存储,脚本执行完成后自动释放,不会生成冗余永久表,也不会修改table1、table2的原有结构和数据 - 分组汇总逻辑直接调用ArcPy原生统计工具实现,无需手动编写游标循环遍历计算,稳定性高、实现简单
- 最终计算结果直接写入原有table3的
costs_calc字段,不生成新的结果表
计算流程对应实现
- 数据筛选:调用
TableSelect_analysis工具筛选table1中section字段值为'B'的记录,写入内存临时表 - 关联匹配系数:调用
JoinField_management将筛选后的临时表与table2通过共有code字段关联,匹配每条记录对应的a_value - 单条记录中间值计算:给内存临时表新增双精度类型
costs_interim字段,调用CalculateField_management计算area * a_value写入该字段 - 按number分组汇总:调用
Statistics_analysis工具,以number为分组字段,对costs_interim字段做求和统计,汇总结果写入新的内存临时表,输出求和字段自动命名为SUM_costs_interim - 关联汇总值到结果表:调用
JoinField_management将table3与汇总临时表通过共有number字段关联,匹配每个number对应的汇总中间值 - 最终成本计算:调用
CalculateField_management计算SUM_costs_interim * b_value,结果直接写入table3原有costs_calc字段,计算完成后删除关联过程中自动添加到table3的临时字段即可
完整可运行代码
# -*- coding:utf-8 -*- import arcpy # 配置环境 arcpy.env.overwriteOutput = True # 允许覆盖临时数据,避免重复运行报错 # 替换为实际数据路径 table1 = r"C:\Users\myuser\Documents\mydatabase.gdb\table1" table2 = r"C:\Users\myuser\Documents\mydatabase.gdb\table2" table3 = r"C:\Users\myuser\Documents\mydatabase.gdb\table3" # 定义内存临时表路径,不生成永久文件 temp_filtered = "in_memory/temp_filtered" temp_sum = "in_memory/temp_sum" try: # 步骤1:筛选section='B'的记录 arcpy.TableSelect_analysis( in_table=table1, out_table=temp_filtered, where_clause="section = 'B'" ) # 步骤2:关联table2获取a_value arcpy.JoinField_management( in_data=temp_filtered, in_field="code", join_table=table2, join_field="code", fields=["a_value"] ) # 步骤3:计算单条中间值costs_interim arcpy.AddField_management( in_table=temp_filtered, field_name="costs_interim", field_type="DOUBLE" ) arcpy.CalculateField_management( in_table=temp_filtered, field="costs_interim", expression="!area! * !a_value!", expression_type="PYTHON_9.3" ) # 步骤4:按number分组汇总costs_interim arcpy.Statistics_analysis( in_table=temp_filtered, out_table=temp_sum, statistics_fields=[["costs_interim", "SUM"]], case_field="number" ) # 步骤5:关联汇总值到table3 arcpy.JoinField_management( in_data=table3, in_field="number", join_table=temp_sum, join_field="number", fields=["SUM_costs_interim"] ) # 步骤6:计算最终costs_calc,如需除以100等系数直接修改表达式即可 arcpy.CalculateField_management( in_table=table3, field="costs_calc", expression="!SUM_costs_interim! * !b_value!", expression_type="PYTHON_9.3" ) # 删除table3上关联产生的临时字段 arcpy.DeleteField_management(table3, ["SUM_costs_interim"]) print("计算完成,结果已写入table3的costs_calc字段") finally: # 清理内存临时表,释放资源 if arcpy.Exists(temp_filtered): arcpy.Delete_management(temp_filtered) if arcpy.Exists(temp_sum): arcpy.Delete_management(temp_sum)
注意事项
- 所有工具均为ArcMap 10.7原生自带工具,无需安装第三方依赖,可直接在ArcMap内置Python窗口、或绑定ArcMap 10.7解释器的独立Python环境运行
- 如果table3中存在number在筛选后的table1里无匹配记录的情况,对应行的costs_calc会自动置空,不会写入错误值
- 若字段名、筛选条件、计算公式有调整,直接修改对应参数即可
内容的提问来源于stack exchange,提问作者geofreak
相关产品推荐
相关产品推荐

