Arcpy не может вычислить целочисленное значение источника в поле LONG - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над сценарием, который перебирает записи «класса объектов A», выполняет пространственный выбор (отслеживание потока) для каждой отдельной записи «A» в «классе объектов B», а затем поле вычисляет атрибут из «A "в результирующих выбранных записях в" B "

В основном для каждого самого нижестоящего узла в сети канализационных трубопроводов проследить восходящий и назначить идентификатор этого нисходящего узла всем вышестоящим функциям.

Значение атрибута всегда будет целым числом, но иногда поле в A форматируется как текст, а иногда как число.

Я могу успешно выполнить это вычисление, если:

A отформатирован как TEXT

, а

B отформатирован как LONG

операция не может вычислить что-либо, если:

A отформатирован как LONG

, а

B отформатирован как LONG

Чего мне не хватает, чтобы это работало для обоих возможных вариантов вводаесли идентификатор для Aлибо текстовое целое число, либо целочисленное целое число?

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

1 Ответ

0 голосов
/ 31 октября 2019

Кажется, проблема в том, как был проанализирован и выполнен запрос выбора. Для одного из типов полей он возвратил пустой выбор, поэтому не было сгенерировано никаких флагов трассировки, из которых можно было бы выполнить выборку восходящей трассы. это вернуло пустой результат трассировки, поэтому не было записи для вычисления идентификатора.

добавление теста для типа поля источника, похоже, решило проблему.

Яположительно, что есть более эффективный и чистый способ написания этого , но обновленный код ниже ДОЛЖЕН выполнять желаемые результаты в обоих случаях (исходное поле - 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...