Использование скриптов-посредников на Python в моделях ArcGIS
по адресу http://gis-lab.info/qa/mb-python.html
Некоторые операции в Model Builder невозможно выполнить используя только стандартные средства. Эта статья о том, как расширить функциональность Model Builder с помощью Python. Данная статья НЕ является описанием Model Builder, а только иллюстрирует одну из особенностей работы с ним.
Конструктор моделей ArcGIS (Model Builder) - мощное средство, позволяющее, с помощью построения соответствующих моделей более эффективно управлять процессами обработки данных в ArcGIS. Элементом модели может быть один из инструментов из Arctoolbox, скрипт на языке Python, VBScript и т.д. Несмотря на то, что Arctoolbox содержит инструменты почти на все случаи жизни, иногда их функциональности не хватает. Так же, часто определенные инструменты не принимают в качестве аргумента определенный параметр, чтобы обойти эту проблему, можно использовать скрипт посредник, выдающий результат в том виде, в котором ему сможет принять инструмент.
Данная статья, на конкретном примере, рассматривает, как можно использовать скрипт посредник для выполнения некоторой операции, которую сам Model Builder выполнить не в состоянии. Возможность расширение модели дополнительными скриптами превращает Model Builder в мощный инструмент, пригодный для автоматизации широкого спектра задач.
Рассмотрим следующую задачу: Имеется некий слой #1 с определенным количеством записей, у каждой записи в поле ID стоит универсальный идентификатор - номер, необходимо сделать из этого слоя выборку, причем выбрать столько записей, сколько содержится в слое #2.
То есть логика модели следующая:
- Определить сколько записей в #2
- Сделать атрибутивную выборку из #1 следующего вида: "ID" <= 123, где 123 - количество записей
На первый взгляд, ничего сложного в такой модели нет, все что нужно сделать, это создать простую модель:
Однако, как показывают перечеркнутые стрелки, ни напрямую использовать результат определения количества записей (Кол-во записей) в атрибутивной выборке (Select Layer By Attribute), ни присоединить этот результат в SQL выражение, чтобы потом использовать его, напрямую не удасться.
Чтобы решить данную задачу, можно использовать скрипт-посредник, который возьмет результат операции Get Count (или сам подсчитает количество записей), создаст из него SQL выражение и подставит его в инструмент атрибутивную выборку.
Для начала, необходимо в любом текстовом редакторе необходимо создать такой скрипт на языке Python и подключить его в новый набор инструментов:
from win32com.client import Dispatch
import sys
gp = Dispatch("esriGeoprocessing.gpDispatch.1")
layername = sys.argv[1]
gp.workspace = "c:/temp/1"
count = gp.GetCount_management(layername
layernamenew = layername.replace("_Layer", "")
outputstr = "\" + "ID" + "\"" + " <= " + str(count)
gp.AddMessage(outputstr)
gp.SetParameterAsText(2, outputstr)
Содержание скрипта достаточно просто, необходимо особо обратить внимание на следующие строки:
- layername = sys.argv[1] - получает из модели аргумент передаваемый скрипту на вход и содержащий имя слоя из которого берется количество записей
- gp.SetParameterAsText(2, outputstr) - возвращает на выход результат работы скрипта
Скрипт с таким содержанием необходимо создать в новом наборе инструментов (toolbox'e). После того, как он создан и отредактирован, необходимо задать ему следующие параметры (правая кнопка на скрипте в Arctoolbox\Parameters):
Данные параметры показывают, что скрипт обязательно (Type: Required) должен получить в качестве параметра имя файла и произвести и выдать (Type: Derived, Direction: Output ) строку, которую мы будем использовать как выражение SQL в операции атрибутивной выборки. После вставки нашего скрипта в модель, он будет отображаться как новый инструмент с выходным параметром. |
После подключения скрипта в модель и установки всех связей, она должна принять следующий вид:
Так как подсчет количества записей осуществляется в самом скрипте, инструмент Get Count можно убрать, так же как и SQL Expression, так как наш скрипт в outputstr выдает готовый SQL-запрос, который вполне подходит в качестве условия инструменту Select Layer by Attribute.