Реализация логического выражения "if field exists" в моделбилдере ArcMap

0 голосов
спросил 22 Июнь от vsgeo (120 баллов) в категории Программные продукты Esri
редактировать 23 Июнь от vsgeo

Здравствуйте. Стоит задача проитерировать базу геоданных и просчитать определённое поле по определённому выражению. Если поле не существует в классе объектов, который берётся в процессе итерации - скипнуть его (в смысле класс объектов). Попробовал построить модель:

В блоке "Calculate Value"  составил выражение:

#Expression:

hasField(r"%Name%")

#Code Block:

import arcpy,os
def hasField(fc):
  arcpy.env.workspace = os.path.dirname(fc)
  fieldList = [field.name for field in arcpy.ListFields(fc)]
  if "GLOBALID" in fieldList:
    b = False
  else:
    b = True
  return b

#Data type:

Boolean

GLOBALID - желаемое поле.

В блоке "Calculate Field" прописано выражение:

#Expression:

ID()

#Code Block:

def ID():
  import uuid
  return '{' + str(uuid.uuid4()) + '}'

Иными словами нужно посчитать поле GLOBALID значением UUID (ИДЕНТИФИКАТОР) в каждом классе объектов, где это поле встречается.

Если запустить модель как есть, то выдаст 539 ошибку (класса не существует). Если в окне  "Expression" прописать путь к первому по списку итерируемому feature dataset (hasField(r"C:\Users\Vadim\Downloads\GML\esri\test.gdb\Adme\%Name%")), в окне после запуска модели появляется ошибка "The process did not execute because the precondition is false" и  "A column was specified that does not exist. Failed to execute (Calculate Field)" - т.е. наткнулся на класс объектов, не содержащий запрашиваемое поле. Все классы объектов расположены в нескольких датасетах в БГД.

Подскажите, пожалуйста, как я должен изменить код в блоке "Calculate value" , и каким образом нужно соединить блоки в этой модели между собой.

ПО: ArcGIS 10.3.1, Basic

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

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