Вы можете сделать это, используя инструмент Calculate Value (Data Management) и немного магии Python. Смотрите также этот связанный вопрос: Добавить произвольный код в компоновщик моделей Arcgis?
Многозначный переменная просто разделенных точкой с запятой строка значений, так что multivaluesToCsv
функция ниже делает это разделить многозначными переменные в списки и перенести их в строки , которые затем записываются в виде CSV (значения , разделенные запятыми) текстовый файл.
Итераторы модели запускают ВСЕ процессы в модели один раз за итерацию - это нежелательно для нашего инструмента Calculate Value, который мы просто хотим запустить один раз в конце. Способ, которым вы достигнете этого, - создать другую внешнюю модель, чтобы обернуть оригинальную внутреннюю модель. Это обсуждается в разделе справки « Интеграция модели в модель» .
Итак, вот что вам нужно сделать, чтобы это заработало:
Внутренняя модель - перебирает классы объектов, обрабатывает их, собирает значения:
- В вашей исходной модели, которая будет нашей «внутренней» моделью, добавьте еще один инструмент «Сбор значений» для сбора
Name
значений переменной, чтобы мы могли сопоставить значения статистики расстояний с соответствующими именами классов объектов.
- Выставьте входные и выходные переменные в качестве параметров модели (щелкните правой кнопкой мыши овал и выберите параметр модели). Сделайте это для каждого из выходов инструментов Collect Value, а также для любых необходимых вам входных параметров, таких как Рабочая область ввода.
- Сохраните и закройте внутреннюю модель.
Внешняя модель - запускает внутреннюю модель, запускает инструмент Calculate Value только один раз, когда внутренняя модель завершает:
- Создайте новую модель - это будет наша «внешняя» модель.
- Добавьте переменную типа,
Folder
чтобы вы могли указать, где создать выходной файл CSV.
- Добавьте переменную типа,
String
чтобы вы могли указать имя выходного файла CSV.
- Добавьте внутреннюю модель к новой модели (перетащите из ArcToolbox или щелкните правой кнопкой мыши и выберите «Добавить данные или инструмент», перейдите к внутренней модели и нажмите «Добавить»)
- Создайте переменные для любых параметров внутренней модели, которые вы хотите установить из внешней модели, например, Входное рабочее пространство (щелкните правой кнопкой мыши внутреннюю модель и выберите «Создать переменную из параметра»).
- Добавьте инструмент «Рассчитать стоимость» в новую модель
Вставьте следующее в соответствующие поля инструмента Рассчитать стоимость:
Выражение :
multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
- Это использует встроенную подстановку переменных для передачи переменных модели в функцию. Настройте в соответствии с именами переменных вашей модели.
- Значение
r
before "%Output CSV File Location%"
является значительным: это указывает на то, что это необработанная строка ; Поскольку пути файловой системы Windows обычно содержат обратную косую черту ( escape-символ в Python), мы должны использовать это, чтобы предотвратить неправильное истолкование Python обратной косой черты и последующих символов как последовательности специальных символов.
- Обязательно помещайте кавычки вокруг встроенных переменных, потому что без них Python будет думать, что они являются идентификаторами, а не строками.
Блок кода:
import os, csv
def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
ext = 'csv' # Define output file extension (e.g. csv or txt)
header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
# Join CSV file path and name, adding extension if necessary
csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
# Open text file for writing
with open(csvfile, 'wb') as f:
w = csv.writer(f)
w.writerow(header) # Write header row
rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
w.writerows(rows)
return csvfile
(Необязательно) Предоставьте входные и выходные переменные в качестве параметров модели, если вы хотите иметь возможность запускать их из диалогового окна инструмента модели или связывать их вместе с другими моделями / сценариями. Единственным выходом внешней модели является файл CSV.
- (Необязательно) Подключите входные переменные и внутренние выходные данные модели к инструменту Calculate Value в качестве предварительных условий. Я не думаю, что это на самом деле имеет какой-либо эффект, это только делает визуально более ясным, что происходит.
Я проверил это с ModelBuilder и получил его работать (см. Скриншоты).
Внутренняя модель :
Наружная модель:
Внутренняя модель запускает все свои процессы один раз для каждого класса пространственных объектов, а затем инструмент «Расчет значения» запускается один раз в конце, чтобы вывести файл CSV один раз и только один раз.