Использование скриптов-посредников на Python в моделях ArcGIS

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.
Эта страница опубликована в основном списке статей сайта
по адресу 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.

То есть логика модели следующая:

  1. Определить сколько записей в #2
  2. Сделать атрибутивную выборку из #1 следующего вида: "ID" <= 123, где 123 - количество записей

На первый взгляд, ничего сложного в такой модели нет, все что нужно сделать, это создать простую модель:

Mb-python-01.gif

Однако, как показывают перечеркнутые стрелки, ни напрямую использовать результат определения количества записей (Кол-во записей) в атрибутивной выборке (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" + "\"" + " &lt;= " + str(count)
gp.AddMessage(outputstr)
gp.SetParameterAsText(2, outputstr)

Содержание скрипта достаточно просто, необходимо особо обратить внимание на следующие строки:

  • layername = sys.argv[1] - получает из модели аргумент передаваемый скрипту на вход и содержащий имя слоя из которого берется количество записей
  • gp.SetParameterAsText(2, outputstr) - возвращает на выход результат работы скрипта

Скрипт с таким содержанием необходимо создать в новом наборе инструментов (toolbox'e). После того, как он создан и отредактирован, необходимо задать ему следующие параметры (правая кнопка на скрипте в Arctoolbox\Parameters):

  • layername
    Data type: Feature layer, Type: Required, Direction: Input
  • outputstr
    Data type: String, Type: Derived, Direction: Output

Данные параметры показывают, что скрипт обязательно (Type: Required) должен получить в качестве параметра имя файла и произвести и выдать (Type: Derived, Direction: Output ) строку, которую мы будем использовать как выражение SQL в операции атрибутивной выборки.

После вставки нашего скрипта в модель, он будет отображаться как новый инструмент с выходным параметром.

Mb-python-03.gif
Mb-python-02.gif

После подключения скрипта в модель и установки всех связей, она должна принять следующий вид:

Mb-python-04.gif

Так как подсчет количества записей осуществляется в самом скрипте, инструмент Get Count можно убрать, так же как и SQL Expression, так как наш скрипт в outputstr выдает готовый SQL-запрос, который вполне подходит в качестве условия инструменту Select Layer by Attribute.