<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.gis-lab.info/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2-%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_%D0%BD%D0%B0_Python_%D0%B2_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8F%D1%85_ArcGIS</id>
	<title>Использование скриптов-посредников на Python в моделях ArcGIS - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gis-lab.info/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2-%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_%D0%BD%D0%B0_Python_%D0%B2_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8F%D1%85_ArcGIS"/>
	<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2-%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_%D0%BD%D0%B0_Python_%D0%B2_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8F%D1%85_ArcGIS&amp;action=history"/>
	<updated>2026-04-04T18:16:38Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2-%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_%D0%BD%D0%B0_Python_%D0%B2_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8F%D1%85_ArcGIS&amp;diff=6943&amp;oldid=prev</id>
		<title>Bolotoved: Новая страница: «{{Статья|Опубликована|mb-python}} {{Аннотация|Некоторые операции в Model Builder невозможно выполни…»</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2-%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_%D0%BD%D0%B0_Python_%D0%B2_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8F%D1%85_ArcGIS&amp;diff=6943&amp;oldid=prev"/>
		<updated>2012-08-05T17:10:14Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Статья|Опубликована|mb-python}} {{Аннотация|Некоторые операции в Model Builder невозможно выполни…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Статья|Опубликована|mb-python}}&lt;br /&gt;
{{Аннотация|Некоторые операции в Model Builder невозможно выполнить используя только стандартные средства. Эта статья о том, как расширить функциональность Model Builder с помощью Python. Данная статья НЕ является описанием Model Builder, а только иллюстрирует одну из особенностей работы с ним.}}&lt;br /&gt;
&lt;br /&gt;
Конструктор моделей ArcGIS (Model Builder) - мощное средство, позволяющее, с помощью построения соответствующих моделей более эффективно управлять процессами обработки данных в ArcGIS. Элементом модели может быть один из инструментов из Arctoolbox, скрипт на языке Python, VBScript и т.д. Несмотря на то, что Arctoolbox содержит инструменты почти на все случаи жизни, иногда их функциональности не хватает. Так же, часто определенные инструменты не принимают в качестве аргумента определенный параметр, чтобы обойти эту проблему, можно использовать скрипт посредник, выдающий результат в том виде, в котором ему сможет принять инструмент.&lt;br /&gt;
&lt;br /&gt;
Данная статья, на конкретном примере, рассматривает, как можно использовать скрипт посредник для выполнения некоторой операции, которую сам Model Builder выполнить не в состоянии. Возможность расширение модели дополнительными скриптами превращает Model Builder в мощный инструмент, пригодный для автоматизации широкого спектра задач.&lt;br /&gt;
&lt;br /&gt;
'''Рассмотрим следующую задачу:''' Имеется некий слой #1 с определенным количеством записей, у каждой записи в поле ID стоит универсальный идентификатор - номер, необходимо сделать из этого слоя выборку, причем выбрать столько записей, сколько содержится в слое #2.&lt;br /&gt;
&lt;br /&gt;
То есть логика модели следующая:&lt;br /&gt;
&lt;br /&gt;
# Определить сколько записей в #2&lt;br /&gt;
# Сделать атрибутивную выборку из #1 следующего вида: '''&amp;quot;ID&amp;quot; &amp;amp;lt;= 123''', где 123 - количество записей&lt;br /&gt;
&lt;br /&gt;
На первый взгляд, ничего сложного в такой модели нет, все что нужно сделать, это создать простую модель:&lt;br /&gt;
&lt;br /&gt;
[[Image:mb-python-01.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Однако, как показывают перечеркнутые стрелки, ни напрямую использовать результат определения количества записей ('''Кол-во записей''') в атрибутивной выборке (Select Layer By Attribute), ни присоединить этот результат в SQL выражение, чтобы потом использовать его, напрямую не удасться.&lt;br /&gt;
&lt;br /&gt;
Чтобы решить данную задачу, можно использовать скрипт-посредник, который возьмет результат операции Get Count (или сам подсчитает количество записей), создаст из него SQL выражение и подставит его в инструмент атрибутивную выборку.&lt;br /&gt;
&lt;br /&gt;
Для начала, необходимо в любом текстовом редакторе необходимо создать такой скрипт на языке Python и подключить его в новый набор инструментов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from win32com.client import Dispatch &lt;br /&gt;
import sys&lt;br /&gt;
gp = Dispatch(&amp;quot;esriGeoprocessing.gpDispatch.1&amp;quot;)&lt;br /&gt;
layername = sys.argv[1]&lt;br /&gt;
gp.workspace = &amp;quot;c:/temp/1&amp;quot;&lt;br /&gt;
count = gp.GetCount_management(layername&lt;br /&gt;
layernamenew = layername.replace(&amp;quot;_Layer&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
outputstr = &amp;quot;\&amp;quot; + &amp;quot;ID&amp;quot; + &amp;quot;\&amp;quot;&amp;quot; + &amp;quot; &amp;amp;lt;= &amp;quot; + str(count)&lt;br /&gt;
gp.AddMessage(outputstr)&lt;br /&gt;
gp.SetParameterAsText(2, outputstr)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Содержание скрипта достаточно просто, необходимо особо обратить внимание на следующие строки:&lt;br /&gt;
&lt;br /&gt;
* '''layername = sys.argv[1]''' - получает из модели аргумент передаваемый скрипту на вход и содержащий имя слоя из которого берется количество записей&lt;br /&gt;
* '''gp.SetParameterAsText(2, outputstr)''' - возвращает на выход результат работы скрипта&lt;br /&gt;
&lt;br /&gt;
Скрипт с таким содержанием необходимо создать в новом наборе инструментов (toolbox'e). После того, как он создан и отредактирован, необходимо задать ему следующие параметры (правая кнопка на скрипте в Arctoolbox\Parameters):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;40%&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
* layername&amp;lt;br /&amp;gt; Data type: Feature layer, Type: Required, Direction: Input&lt;br /&gt;
* outputstr&amp;lt;br /&amp;gt; Data type: String, Type: Derived, Direction: Output&lt;br /&gt;
&lt;br /&gt;
Данные параметры показывают, что скрипт обязательно (Type: Required) должен получить в качестве параметра имя файла и произвести и выдать (Type: Derived, Direction: Output ) строку, которую мы будем использовать как выражение SQL в операции атрибутивной выборки.&lt;br /&gt;
&lt;br /&gt;
После вставки нашего скрипта в модель, он будет отображаться как новый инструмент с выходным параметром.&lt;br /&gt;
[[Image:mb-python-03.gif|center]]&lt;br /&gt;
|&lt;br /&gt;
[[Image:mb-python-02.gif|center]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
После подключения скрипта в модель и установки всех связей, она должна принять следующий вид:&lt;br /&gt;
&lt;br /&gt;
[[Image:mb-python-04.gif|center]]&lt;br /&gt;
&lt;br /&gt;
Так как подсчет количества записей осуществляется в самом скрипте, инструмент Get Count можно убрать, так же как и SQL Expression, так как наш скрипт в outputstr выдает готовый SQL-запрос, который вполне подходит в качестве условия инструменту Select Layer by Attribute.&lt;/div&gt;</summary>
		<author><name>Bolotoved</name></author>
	</entry>
</feed>