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

ArcMap10.7 arcpy实现多表关联自动计算成本字段值

ArcMap 10.7 arcpy多表关联成本计算实现方案

核心优化点

  • 所有中间计算过程使用in_memory内存临时表存储,脚本执行完成后自动释放,不会生成冗余永久表,也不会修改table1、table2的原有结构和数据
  • 分组汇总逻辑直接调用ArcPy原生统计工具实现,无需手动编写游标循环遍历计算,稳定性高、实现简单
  • 最终计算结果直接写入原有table3的costs_calc字段,不生成新的结果表

计算流程对应实现

  1. 数据筛选:调用TableSelect_analysis工具筛选table1中section字段值为'B'的记录,写入内存临时表
  2. 关联匹配系数:调用JoinField_management将筛选后的临时表与table2通过共有code字段关联,匹配每条记录对应的a_value
  3. 单条记录中间值计算:给内存临时表新增双精度类型costs_interim字段,调用CalculateField_management计算area * a_value写入该字段
  4. 按number分组汇总:调用Statistics_analysis工具,以number为分组字段,对costs_interim字段做求和统计,汇总结果写入新的内存临时表,输出求和字段自动命名为SUM_costs_interim
  5. 关联汇总值到结果表:调用JoinField_management将table3与汇总临时表通过共有number字段关联,匹配每个number对应的汇总中间值
  6. 最终成本计算:调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:57:18