Arcpy 无法将整数源值计算为 LONG 字段

Arcpy fails to field calculate integer source value to LONG field

我正在编写一个脚本,该脚本遍历 "feature class A" 的记录,对 "feature class B" 上的每个 "A" 记录执行空间选择(流跟踪),然后进行字段计算"A" 中的属性到 "B"

中的结果选定记录

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

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

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

A 的格式为 TEXT

B 被格式化为 LONG

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

A 被格式化为 LONG

B 被格式化为 LONG

如果 A 的 ID 是文本整数或整数格式,我错过了什么,所以这将适用于两种潜在的输入情况?

...
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。

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

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

我确信有更有效和更简洁的方式来编写这个,但下面更新的代码似乎在两种情况下都执行了预期的结果(源字段是文本或源字段很长)所以它足以满足我的目的。

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()