Примеры использования инструмента Вычислить значение

Инструмент Вычислить значение – универсальный инструмент ModelBuilder, возвращающий значение из выражения Python. Инструмент поддерживает простые вычисления, встроенные функции и модули Python, функции и объекты геообработки и собственный код Python.

Выражение

Выполняйте различные вычисления, используя только параметр Выражение.

Математические вычисления

Инструмент Вычислить значение может вычислять простые математические выражения в Python. Например, посмотрите следующие выражения:

ОператорОбъяснениеПримерРезультат

x + y

x плюс y

3 + 5

8

x - y

x минус y

4.3 - 2.1

2.2

x * y

x умножить на y

8 * 9

72

x / y

x разделить на y

4 / 1.25

3.2

x // y

x разделить на y (с округлением)

4 // 1.25

3

x % y

остаток x, разделенный на y

4 % 1.25

0.25

x**y

x возвести в степень y

2 ** 3

8

x < y

если x меньше y

2 < 3

1

x <= y

если x меньше или равен y

2 <=3

1

x > y

если x больше y

2 > 3

0

x >= y

если x больше или равен y

2 >= 3

0

x == y

если x равен y

2 == 3

0

x != y

если x не равен y

2 != 3

1

Инструмент Вычислить значение позволяет использовать модуль Python math для выполнения более сложных математических операций.

Возвращает квадратный корень значения.

Expression:
math.sqrt(25)

Возвращает косинус значения в радианах.

Expression:
math.cos(0.5)

Константы также поддерживаются модулем math.

Возвращает постоянное значение π.

Expression:
math.pi

Инструмент Вычислить значение позволяет использовать модуль random для генерирования произвольных чисел. Примеры использования модуля random:

Возвращает произвольное целое число от 0 до 10.

Expression:
random.randint(0, 10)

Возвращает произвольное значение из нормального распределения со средним значением 10 и стандартным отклонением 3.

Expression:
random.normalvariate(10, 3)

Пример строк

Операторы и индекс Python могут использоваться в строковых значениях.

ПримерОбъяснениеРезультат

"Input" + " " + "Name"

Конкатенация строк.

Входное имя

"Input_Name"[6:]

Седьмой символ до последнего символа.

Имя

"STREET".lower()

Конвертировать строковое значение в нижний регистр.

street

"Street Name".split()[1]

Разбить строку на несколько строк по пробелу. И получить вторую возвращаемую строку.

Имя

Инструмент Вычислить значение может заменить или удалить символы из строки. Например, если у вас имеется входное значение с десятичным числом (в данном случае – значение поля входной таблицы), и вы хотите использовать это значение в выходном имени другого инструмента посредством подстановки встроенной переменной, это десятичное число можно заменить, используя метод replace.

Expression:
"%Value%".replace(".", "")

Пример метода Python Заменить

В строке Python обрабатывает обратную косую черту (\) как символ escape. Например, в строке "C:\temp\newProjectFolder" \n представляет собой перевод строки, а \t представляет tab. Для проверки, что строка выглядит, как ожидалось, выполните одно из следующего:

  • Используйте косую черту (/) вместо обратной косой черты.
  • Используйте две обратные косые черты вместо одной.
  • Конвертируйте строку в строковой литерал, поставив букву r перед строкой.

Более подробно о путях настройки в Python

Тип данных

Параметр Тип данных указывает тип выходных данных инструмента Вычислить значение. Важно убедиться, что тип выходных данных инструмента Вычислить значение соответствует требуемому типу входных данных следующего инструмента.

Выходные данные инструмента Вычислить значение можно использовать в любых инструментах Spatial Analyst, принимающих растр или постоянное значение, например, Сложить, Больше и Меньше. Для использования выходных данных инструмента Вычислить значение измените значение Тип данных на Формализованный растр. Этот тип данных является растровой поверхностью, значения ячеек которой представлены формулой или константой.

Возвращает вычисленное значение в типе данных Формализованный растр, чтобы использовать его в качестве входных данных инструмента Больше.

Expression:
%A% + 120

Значение параметра Выражение использует подстановку встроенной переменной. При запуске инструмента %A% будет заменено значением переменной A. Значение переменной A плюс 120 будет использоваться как Входной растр или постоянное значение 1 в инструменте Больше.

Тип данных Формализованный растр

Блок кода

Для простых вычислений зачастую вам необходимо использовать только параметр Выражение. Для более сложных выражений, таких как мультилинейные вычисления или логические операции (if-else), также необходим параметр Блок кода. Параметр Блок кода необходимо использовать вместе с параметром Выражение.

На переменные, заданные в параметре Блок кода, может ссылаться параметр Выражение.

Например, size, заданный в Блоке кода, считает количество файлов в пути к папке. На него будет ссылаться параметр Выражение во время выполнения. Выходное значение инструмента Вычислить значение равно фактическому количеству файлов плюс пять.

Expression:
5 + size

Code Block:
import os
size = 0
folderpath = r"C:\temp\csvFiles"    
for ele in os.scandir(folderpath):
    size += 1

Использование Выражения и Блока кода

Также можно использовать параметр Блок кода, чтобы определить функцию и вызвать функцию из параметра Выражение. В Python функция определяется с помощью оператора def, за которым следует имя функции. В функцию могут входить обязательные и дополнительные аргументы, или их совсем не быть. Возвращает выходное значение функции, используя выражение return.

Время

Можно использовать параметр Блок кода для вызова модулей и методов Python. Следующий пример вызывает time метод ctime модуля.

В тех случаях, когда вам необходимо регулярно создавать резервные копии данных, добавление времени к имени папки помогает различать данные. Пример ниже показывает, как добавить врменную метку к имени папки. Функция time.ctime возвращает текущую дату и время в формате типа Tue Jun 22 16:24:08 2021. Это возвращенное значение нельзя использовать как имя папки в инструменте Создать папку, так как пробелы и знаки пунктуации здесь недопустимы. Для их удаления используется метод Python replace, путем стекинга метода для каждого элемента, который необходимо заменить. Итоговое имя папки в этом примере будет TueJun221622522021.

Expression:
gettime()

Code Block:
import time

def gettime():
  	 # First replace removes punctuation marks. Second replace removes spaces.
  	 return time.ctime().replace(":", "").replace(" ", "")
Пример модуля Python time

If-then-else и встроенная подстановка

Параметр Блок кода может брать значения через входные параметры функции. Число параметров в Блоке кода должно совпадать с числом параметров в Выражении. После выполнения инструмента значение параметра передается из Выражения в Блок кода. Можно передать значение переменной модели, используя встроенную переменную как параметр Выражение, как показно ниже.

В следующем примере функция getAspectDir содержит один параметр inValue. Параметр Выражение передает значение переменной Степень ввода в Блок кода.

В следующем примере вычисляется направление экспозиции склона на основании значения Входные градусы. Если значение переменной Входные градусы равно 223, будет возвращено выходное направление экспозиции Юг.

Expression:
getAspectDir("%Input Degree%")

Code Block:
def getAspectDir(inValue):
   	inValue = int(inValue)
   	if inValue >= 45 and inValue < 135:
      		return "East"
   	elif inValue >= 135 and inValue < 225:
      		return "South"
   	elif inValue >= 225 and inValue < 315:
      		return "West"
   	else:
      		return "North"
Задание функций в Блоке кода

Несколько встроенных подстановок

Параметр Блок кода также может принимать несколько значений встроенных переменных.

Блок кода проверяет, не превышает ли значение переменной Значение пользовательского ввода Значение по умолчанию. Если это так, выходное значение инструмента Вычислить значениеЗначение пользовательского ввода. В противном случае выходным значением будет Значение по умолчанию. В данном случае Выходным значением будет 10.

Expression:
fn("%User Input Value%","%Default Value%")

Code Block:
def fn(userInputValue, defaultValue):
   	if float(userInputValue) > float(defaultValue):
      		return float(userInputValue)
   	else:
      		return float(defaultValue)
Пример If-else
Внимание:

Заключите встроенную переменную типа string в кавычки ("%string variable%") в выражении. Для встроенных переменных числовых типов (double, long) кавычки не требуются (%double%).

Конкатенация пути к данным

В следующем примере демонстрируется копирование объектов по указанному пути к папке и ее имени. Параметр Блок кода принимает два значения: Путь к папке и Имя папки. Код оценивает, существует ли сочетание пути к папке и ее имени. Если такой комбинации нет, функция makedirs добавляет отсутствующие папки. Буква r в параметре Выражение предшествующая пути к папке, необходима для правильной интерпретации пути.

Expression:
getPath(r"%Folder Path%", "%Folder Name%")

Code Block:
import os

def getPath(folderPath, folderName):
   	outPath = os.path.join(folderPath, folderName)
   	if not os.path.exists(outPath):
      		os.makedirs(outPath)
   	return outPath
Пример соединения путей

Конкатенация значения расстояния и единиц измерения

Для использования инструмента Вычислить значение с инструментом, принимающим линейное расстояние, например, инструментом Буфер, выполните следующее:

  • Возвращает значение расстояния и линейные единицы в параметре Блок кода parameter.
  • Задайте значение параметра Тип данных как Линейные единицы.

Например, инструмент Вычислить значение вернет значение 12 километров при использовании с инструментом Буфер.

Expression:
fn("%A%", "%B%")

Code Block:
def fn(a, b):
   	distance = int(a) * int(b)
   	return f"{distance} Kilometers"
Использование выходных данных инструмента Вычислить значение как буферного расстояния

ArcPy

ArcPy – это пакет Esri Python который обеспечивает успешный и продуктивный анализ географических данных, конвертацию данных, управление данными и автоматизацию карт в Python. ArcPy обеспечивает доступ к инструментам геообработки, а также к дополнительным функциям, классам и модулям, которые позволяют создавать как простые, так и сложные рабочие процессы.

Курсор

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

Чтобы преобразовать код вида дерева в его обычное название, можно использовать UpdateCursor для итерации по каждому дереву в таблице. На основании значения кода дерева, назначьте ему обычное имя. Например, если код дерева PIPO, назначьте ему обычное имя ponderosa pine в поле CommonName.

Expression:
fn("%trees%")

Code Block:
def fn(trees):
   	with arcpy.da.UpdateCursor(trees, ["Code", "CommonName"]) as cursor:
      		for row in cursor:
        				if row[0] == "PIPO":
           					row[1] = "ponderosa pine"
        				elif row[0] == "BEPA":
           					row[1] = "paper birch"
        				elif row[0] == "FAGR":
           					row[1] = "American beech"
        				cursor.updateRow(row)
Использование инструмента Вычислить значение с курсором

Инструменты геообработки

ArcPy также предоставляет доступ к инструментам геообработки. Можно вызывать инструменты геообработки в параметре Блок кода.

В следующем примере инструмент Вычислить значение использует инструменты Выбрать в слое по атрибуту, Копировать объекты и Буфер. Инструменты выбирают все дороги в поле LABEL, содержащие слово HIGHWAY, создают их копию буфер вокруг дорог.

Expression:
fn("%Input Feature Class%")

Code Block:
def fn(InputFC):
	   # To allow overwriting outputs change overwriteOutput option to True.
    arcpy.env.overwriteOutput = True

    # Process: Select Layer By Attribute (Select Layer By Attribute) (management)
    InputFC_Layer, Count = arcpy.management.SelectLayerByAttribute(InputFC, "NEW_SELECTION", "LABEL LIKE '%HIGHWAY%'")

    # Process: Copy Features (Copy Features) (management)
    copyFeaturesOutput = "C:\\temp\\Output.gdb\\copyFeaturesOutput"
    arcpy.management.CopyFeatures(InputFC_Layer, copyFeaturesOutput)

    # Process: Buffer (Buffer) (analysis)
    bufferOutput = "C:\\temp\\Output.gdb\\bufferOutput"
    arcpy.analysis.Buffer(copyFeaturesOutput, bufferOutput, "1500 Feet")
    return bufferOutput
Использование инструмента Вычислить значение с инструментами геообработки