【问题标题】:Arcpy fails to field calculate integer source value to LONG fieldArcpy 无法将整数源值字段计算到 LONG 字段
【发布时间】:2025-11-21 12:25:01
【问题描述】:

我正在编写一个脚本,该脚本遍历“要素类 A”的记录,对“要素类 B”上的每个单独的“A”记录执行空间选择(流跟踪),然后字段从“ A" 到 "B" 中的结果选择记录

基本上,对于下水道管网中的每个最下游节点,追踪上游并将该下游节点的 ID 分配给所有上游要素。

属性值始终为整数,但有时 A 中的字段格式为文本,有时为数字。

如果满足以下条件,我可以成功执行此计算:

A 被格式化为 TEXT

B 被格式化为 LONG

如果出现以下情况,该操作将无法计算任何内容:

A 被格式化为 LONG

B 被格式化为 LONG

如果 A 的 ID 是文本整数或整数整数格式,我缺少什么以便这对两种潜在的输入情况都有效? p>

...
for row in cursor:
ID = (str(row.getValue(str(flagname))))
whereclause = ((str(flagname)) +str(' = ') + "'%s'" %ID)
fc=str(r"outfalls_lyr")
arcpy.MakeFeatureLayer_management(traceflag, fc)

try:
    arcpy.SelectLayerByAttribute_management(fc, "NEW_SELECTION",str(whereclause))
    arcpy.MakeFeatureLayer_management( fc,r"in_memory\temp_of")
    arcpy.TraceGeometricNetwork_management(geomnet, r"in_memory\outNet",r"in_memory\temp_of" , "TRACE_UPSTREAM", "", "", "","", "", "NO_TRACE_ENDS", "NO_TRACE_INDETERMINATE_FLOW", "", "", "AS_IS", "", "", "", "AS_IS")
    for layer in arcpy.mapping.Layer(r"in_memory\outNet"):
        try:
            print arcpy.mapping.ListLayers(layer)
            calc = str('"%s"' %ID)
            arcpy.CalculateField_management (layer, fieldname, calc,"","")
        except:
            print arcpy.GetMessages()

except:
    print arcpy.GetMessages()

也交叉发布到 GIS Stack Exchange。

【问题讨论】:

    标签: python esri arcpy


    【解决方案1】:

    问题似乎在于选择查询的解析和执行方式。对于其中一种字段类型,它返回一个空选择,因此没有生成用于执行上游跟踪选择的跟踪标志。这返回了一个空的跟踪结果,因此没有可以计算 ID 的记录。

    为源字段类型添加测试似乎已经解决了问题。

    我很肯定有更有效和更简洁的方式来编写此代码,但下面的更新代码似乎在两种情况下都可以执行所需的结果(源字段是 TEXT 或源字段是 LONG ) 所以它对于我的目的来说是一个足够的修复。

    cursor = arcpy.SearchCursor(traceflag)
    
    fields = arcpy.ListFields(traceflag)
    for field in fields:
        if field.name == flagname and field.type == 'String':
            typeIsString = "True"
        elif field.name == flagname and not field.type == 'String':
            typeIsString = "False"
    
    
    for row in cursor:
        if typeIsString == "True":
            ID = str((row.getValue(str(flagname))))
        elif typeIsString == "False":
            ID = int((row.getValue(str((flagname)))))
    whereclause = (flagname + ' = ' + `ID`)
    fc=str(r"outfalls_lyr")
    arcpy.MakeFeatureLayer_management(traceflag, fc)
    
    try:
        arcpy.SelectLayerByAttribute_management(fc, "NEW_SELECTION",str(whereclause))
        arcpy.MakeFeatureLayer_management( fc,r"in_memory\temp_of")
        arcpy.TraceGeometricNetwork_management(geomnet, r"in_memory\outNet",r"in_memory\temp_of" , "TRACE_UPSTREAM", "", "", "","", "", "NO_TRACE_ENDS", "NO_TRACE_INDETERMINATE_FLOW", "", "", "AS_IS", "", "", "", "AS_IS")
        for layer in arcpy.mapping.Layer(r"in_memory\outNet"):
            try:
                print arcpy.mapping.ListLayers(layer)
                calc = str('"%s"' %ID)
                arcpy.CalculateField_management(layer, fieldname, ID, "PYTHON", "")
            except:
                print arcpy.GetMessages()
    

    【讨论】:

      最近更新 更多