<?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%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B2_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%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B2_ArcGIS"/>
	<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B2_ArcGIS&amp;action=history"/>
	<updated>2026-04-28T05:15:38Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B2_ArcGIS&amp;diff=6936&amp;oldid=prev</id>
		<title>Amuriy: Новая страница: «{{Статья|Опубликована|geoproc-python-ag}} {{Аннотация|Пошаговая разработка скрипта для обработки …»</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B2_ArcGIS&amp;diff=6936&amp;oldid=prev"/>
		<updated>2012-08-05T12:43:21Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Статья|Опубликована|geoproc-python-ag}} {{Аннотация|Пошаговая разработка скрипта для обработки …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Статья|Опубликована|geoproc-python-ag}}&lt;br /&gt;
{{Аннотация|Пошаговая разработка скрипта для обработки данных использующего геопроцессинг ArcGIS}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разберем решение задачи расчета ошибок пользователя и производителя с помощью геопроцессинга ArcGIS и языка Python.&lt;br /&gt;
&lt;br /&gt;
Эта статья демонстрирует необходимые шаги для решения задачи и может служить как учебный пример использования этой технологии. Для того, чтобы разобраться с тем, зачем и как расчитываются эти ошибки, рекомендуем сначала ознакомиться со статьей &amp;quot;[error-matrix.html Матрица ошибок и расчет показателей точности тематических карт]&amp;quot;. Вкратце, эти ошибки являются интегральным показателем точности полученной тематической карты (например классификации). Для подобных расчетов берется 2 слоя, проверочный и проверяемый.&lt;br /&gt;
&lt;br /&gt;
Для начала работы понадобится (вы можете скачать примеры, или использовать свои - похожие):&lt;br /&gt;
&lt;br /&gt;
* ArcGIS с лицензией Spatial Analyst&lt;br /&gt;
* Слой границ территории исследования, вектор, lat/long WGS84 ([http://gis-lab.info/data/samples/landsat-170028-footprint-shape.zip скачать])&lt;br /&gt;
* Проверяемый слой, растровая классификация, нужный класс обозначен 1, растр, Albers-Europe ([http://gis-lab.info/data/samples/classification-170028-4class-grid.zip скачать])&lt;br /&gt;
* Проверочный слой, вектор, lat/long WGS84 ([http://gis-lab.info/data/samples/polygons-170028-shape.zip скачать])&lt;br /&gt;
* Таблица в формате dbf, поля ID, RESULT, 4 записи со значениями 1, 2, 3, 4 в поле ID ([http://gis-lab.info/data/samples/dbf-table-4classes.zip скачать])&lt;br /&gt;
&lt;br /&gt;
Наша программа будет выполнять набор пространственных операций с векторными и растровыми данными и выдавать в результате значения расчета встречаемости классов в таблицу.&lt;br /&gt;
&lt;br /&gt;
Для начала работы создадим чистый текстовый файл в кодировке UTF-8, назовем его, например, validation.py (или [http://gis-lab.info/programs/python/validation.7z скачаем готовый]). В него можно вставлять строки, как они указаны дальше, а потом выполнить его целиком. Альтернативно можно копировать и вставлять их прямо в окно Python и наблюдать за процессом исполнения и появляющимися на диске слоями.&lt;br /&gt;
&lt;br /&gt;
В статье использовался ArcGIS 9.2 build 1450, лицензия ArcInfo.&lt;br /&gt;
&lt;br /&gt;
==Подготовка==&lt;br /&gt;
&lt;br /&gt;
Начнем с подготовки, любой программе необходимо описание, кто является ее автором и что она делает. Также необходимо указать кодировку, чтобы комментарии на русском не вызывали недовольство интерпретатора языка Python. В целом, этот фрагмент является необязательным. Все комментарии начинаются со знака #, можете также добавить своих.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# -*- coding: utf-8 -*-&lt;br /&gt;
 # ---------------------------------------------------------------------------&lt;br /&gt;
 # validation.py&lt;br /&gt;
 # Получение данных для расчета ошибок производителя и пользователя для двух источников данных V1 и V2&lt;br /&gt;
 # Author: Maxim Dubinin (sim@gis-lab.info)&lt;br /&gt;
 # ---------------------------------------------------------------------------&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дальше, импортируем модуль поддержки Python ArcGIS - arcgisscripting.&lt;br /&gt;
&lt;br /&gt;
 import arcgisscripting&lt;br /&gt;
&lt;br /&gt;
Создадим основной объект геопроцессинга:&lt;br /&gt;
&lt;br /&gt;
 gp = arcgisscripting.create()&lt;br /&gt;
&lt;br /&gt;
и сразу сделаем ему общую настройку, чтобы результаты работы переписывали существующие, наверняка вероятно придется что-то повторять в процессе отладки:&lt;br /&gt;
&lt;br /&gt;
 gp.overwriteoutput = 1&lt;br /&gt;
&lt;br /&gt;
Получаем необходимые лицензии:&lt;br /&gt;
&lt;br /&gt;
 gp.CheckOutExtension(&amp;quot;spatial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Зададим также рабочу папку, где будут храниться исходные и конечные материалы:&lt;br /&gt;
&lt;br /&gt;
 wd = &amp;quot;D:\\Programming\\Python\\validation\\&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Геопроцессинг==&lt;br /&gt;
&lt;br /&gt;
Теперь начинается собственно обработка данных. Обычно схема такая, есть некоторая операция, которую нужно выполнить, для нее есть исходный и конечный слой, они задаются прямо перед операцией, для удобства. Общие обозначения, используемые в названиях слоёв:&lt;br /&gt;
&lt;br /&gt;
* sa - территория исследования (район интересов, study area)&lt;br /&gt;
* vec - вектор&lt;br /&gt;
* ras - растр&lt;br /&gt;
* v1 - проверочный набор данных&lt;br /&gt;
* v2 - набор данных который проверяют&lt;br /&gt;
* dd, alb - lat/long и Albers соответственно.&lt;br /&gt;
&lt;br /&gt;
Исходные данные (sa, v1, v2):&lt;br /&gt;
&lt;br /&gt;
[[Image:geoproc-python-ag-01.gif]] [[Image:geoproc-python-ag-02.gif]] [[Image:geoproc-python-ag-03.gif]]&lt;br /&gt;
&lt;br /&gt;
Так как вектор мы обычно храним в lat/long, а растры в проекции Albers, сначала преобразуем вектор в проекцию Albers. Небольшая хитрость, описание системы координат было бы более аккуратно назначить какой-то переменной и потом использовать в gp.Project_management как третий параметр, но почему-то это ArcGIS переварить не может, поэтому использовать длинное описание приходится в команде здесь и далее.&lt;br /&gt;
&lt;br /&gt;
 sa_dd = wd + &amp;quot;sa_dd.shp&amp;quot;&lt;br /&gt;
 sa_alb = wd + &amp;quot;sa_alb.shp&amp;quot;&lt;br /&gt;
 gp.Project_management(sa_dd, sa_alb, &amp;quot;PROJCS['Albers-Europe',GEOGCS['GCS_Pulkovo_1942',DATUM['D_Pulkovo_1942',SPHEROID['Krasovsky_1940',6378245.0,298.3]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Albers'],PARAMETER['False_Easting',8500000.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',45.0],PARAMETER['Standard_Parallel_1',52.0],PARAMETER['Standard_Parallel_2',64.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]&amp;quot;, &amp;quot;Pulkovo_1942_To_WGS_1984&amp;quot;, &amp;quot;GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Еще одна небольшая хитрость, в некоторых случаях, если перепроецируемых слой уже где-то открыт (в нашем случае он был открыт в QGIS), операция будет выдавать ошибку, пока вы его не закроете.&lt;br /&gt;
&lt;br /&gt;
Так как у нас теперь есть векторная граница территории исследования, за пределами которой нас ничего не интересует, установим ее как маску. В растровых операциях приводящих к появлению чего-либо за маской, эти значения будут сбрасываться в NODATA.&lt;br /&gt;
&lt;br /&gt;
 gp.mask = sa_alb&lt;br /&gt;
&lt;br /&gt;
Растеризуем границу территории исследования с разрешением таким же, как у растра V2 (он получен на основе Landsat, поэтому 30 метров):&lt;br /&gt;
&lt;br /&gt;
 sa_ras = wd + &amp;quot;sa_ras&amp;quot;&lt;br /&gt;
 gp.FeatureToRaster_conversion(sa_alb, &amp;quot;ID&amp;quot;, sa_ras, &amp;quot;30&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Перепроецируем V1 в ту же систему координат и проекцию:&lt;br /&gt;
&lt;br /&gt;
 v1_dd = wd + &amp;quot;v1_dd.shp&amp;quot;&lt;br /&gt;
 v1_alb = wd + &amp;quot;v1_alb.shp&amp;quot;&lt;br /&gt;
 gp.Project_management(v1_dd, v1_alb, &amp;quot;PROJCS['Albers-Europe',GEOGCS['GCS_Pulkovo_1942',DATUM['D_Pulkovo_1942',SPHEROID['Krasovsky_1940',6378245.0,298.3]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Albers'],PARAMETER['False_Easting',8500000.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',45.0],PARAMETER['Standard_Parallel_1',52.0],PARAMETER['Standard_Parallel_2',64.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]&amp;quot;, &amp;quot;Pulkovo_1942_To_WGS_1984&amp;quot;, &amp;quot;GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Проверочные данные (V1) немного выходят за границу территории исследования - обрежем их:&lt;br /&gt;
&lt;br /&gt;
 v1_alb_clip = wd + &amp;quot;v1_alb_clip.shp&amp;quot;&amp;lt;br /&amp;gt;gp.Clip_analysis(v1_alb, sa_alb, v1_alb_clip, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Растеризуем обрезанный V1:&lt;br /&gt;
&lt;br /&gt;
 v1_ras = wd + &amp;quot;v1_ras&amp;quot;&amp;lt;br /&amp;gt;gp.FeatureToRaster_conversion(v1_alb_clip, &amp;quot;ID&amp;quot;, v1_ras, &amp;quot;30&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Переклассифицируем полученный растр, чтобы все значения 1 заменились на 2, а NODATA - на 0.&lt;br /&gt;
&lt;br /&gt;
 v1_ras0 = wd + &amp;quot;v1_ras0&amp;quot;&amp;lt;br /&amp;gt;gp.Reclassify_sa(v1_ras, &amp;quot;VALUE&amp;quot;, &amp;quot;1 2;NODATA 0&amp;quot;, v1_ras0, &amp;quot;DATA&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Складываем V1 и территорию исследования, так как V1 не обязательно захватывает всю территорию, а SA это сплошные нули, то получится растр с таким же охватом как SA.&lt;br /&gt;
&lt;br /&gt;
 gp.Mosaic_management('&amp;quot;'+v1_ras0+'&amp;quot;', sa_ras, &amp;quot;LAST&amp;quot;, &amp;quot;FIRST&amp;quot;,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;NONE&amp;quot;, &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Подготавливаем V2, выбираем все значения равные 1, это класс который нам нужно проверить:&lt;br /&gt;
&lt;br /&gt;
 v2_ras = wd + &amp;quot;v2&amp;quot;&lt;br /&gt;
 con1 = wd + &amp;quot;con1&amp;quot;&lt;br /&gt;
 gp.Con_sa(v2_ras, 1, con1, 0, &amp;quot;\&amp;quot;VALUE\&amp;quot; = 1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:geoproc-python-ag-04.gif]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сглаживаем результат фильтром 3х3:&lt;br /&gt;
&lt;br /&gt;
 v2_f = wd + &amp;quot;v2_f&amp;quot;&lt;br /&gt;
 gp.FocalStatistics_sa(con1, v2_f, &amp;quot;Circle 3 CELL&amp;quot;, &amp;quot;MAJORITY&amp;quot;, &amp;quot;DATA&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:geoproc-python-ag-05.gif]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммируем V1 и V2, в результате значение 3 получится у территорий которые есть и на V1 и на V2, значение 2 - только на V1, 1 - только на V2, 0 - ни там ни там.&lt;br /&gt;
&lt;br /&gt;
 res = wd + &amp;quot;res&amp;quot;&lt;br /&gt;
 gp.SingleOutputMapAlgebra_sa(&amp;quot;sa_ras + v2_f&amp;quot;, res)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Image:geoproc-python-ag-06.gif]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это наш результат (3 - красный, 2 - желтый, 1 - голубой, 0 - синий), в принципе, все необходимые для расчетов значения можно извлечь из таблицы грида, показывающую сколько пикселей какого класса получилось, в целях иллюстрации пойдем по несколько другому пути и получим значения в таблицу.&lt;br /&gt;
&lt;br /&gt;
Для этого, сделаем вид из готовой таблицы, чтобы объединить ее с таблице результата:&lt;br /&gt;
&lt;br /&gt;
 result_dbf = wd + &amp;quot;result.dbf&amp;quot;&lt;br /&gt;
 result_view = &amp;quot;result_view&amp;quot;&lt;br /&gt;
 gp.MakeTableView_management(result_dbf, result_view)&lt;br /&gt;
&lt;br /&gt;
Объединяем таблицы по полям ID и VALUE:&lt;br /&gt;
&lt;br /&gt;
 gp.AddJoin_management(result_view, &amp;quot;ID&amp;quot;, res, &amp;quot;VALUE&amp;quot;, &amp;quot;KEEP_ALL&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Переносим значения:&lt;br /&gt;
&lt;br /&gt;
 gp.CalculateField_management(result_view, &amp;quot;RESULT&amp;quot;, &amp;quot;[&amp;quot; + resvat +&amp;quot;:COUNT]&amp;quot;, &amp;quot;VB&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Результат выглядит примерно таким образом.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;19&amp;quot; height=&amp;quot;17&amp;quot; | ID&lt;br /&gt;
| width=&amp;quot;61&amp;quot; | RESULT&lt;br /&gt;
|-&lt;br /&gt;
| height=&amp;quot;17&amp;quot; | 0&lt;br /&gt;
| 23169981&lt;br /&gt;
|-&lt;br /&gt;
| height=&amp;quot;17&amp;quot; | 1&lt;br /&gt;
| 10272529&lt;br /&gt;
|-&lt;br /&gt;
| height=&amp;quot;17&amp;quot; | 2&lt;br /&gt;
| 393835&lt;br /&gt;
|-&lt;br /&gt;
| height=&amp;quot;17&amp;quot; | 3&lt;br /&gt;
| 1138037&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Используя эти данные легко посчитать например точность производителя:&lt;br /&gt;
&lt;br /&gt;
1138037/(1138037+393835) = 0.742906 = 74%&lt;br /&gt;
&lt;br /&gt;
и пользователя:&lt;br /&gt;
&lt;br /&gt;
1138037/(1138037+10272529) = 0.099735 = 9.9%&lt;br /&gt;
&lt;br /&gt;
Действительно, как видно из рисунка выше, 3/4 территорий которые должны были попасть в нужный класс V2 - в него попали (класс 3), 1/4 - не попала (класс 2), однако в него же попало и огромное количество лишнего (класс 1).&lt;br /&gt;
&lt;br /&gt;
Подробнее о расчете точности и интерпретации можно прочитать в [error-matrix.html специальной статье].&lt;br /&gt;
&lt;br /&gt;
Осталось только прибраться за собой, отсоединить таблицу и удалить промежуточные результаты:&lt;br /&gt;
&lt;br /&gt;
 gp.RemoveJoin_management(result_view, resvat)&lt;br /&gt;
 gp.Delete_management(sa_ras, &amp;quot;&amp;quot;)&lt;br /&gt;
 gp.Delete_management(sa_alb, &amp;quot;&amp;quot;)&lt;br /&gt;
 gp.Delete_management(v1_alb, &amp;quot;&amp;quot;)&lt;br /&gt;
 gp.Delete_management(v1_alb_clip, &amp;quot;&amp;quot;)&lt;br /&gt;
 gp.Delete_management(v1_ras, &amp;quot;&amp;quot;)&lt;br /&gt;
 gp.Delete_management(v1_ras0, &amp;quot;&amp;quot;)&lt;br /&gt;
 gp.Delete_management(con1, &amp;quot;&amp;quot;)&lt;br /&gt;
 gp.Delete_management(v2_f, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==Обработка программных ошибок==&lt;br /&gt;
&lt;br /&gt;
По умолчанию, если вы ошиблись в вводе параметров для одной из операций геопроцессинга, вы будете получать маловнятные сообщения об ошибках типа такого:&lt;br /&gt;
&lt;br /&gt;
 Traceback (most recent call last):&lt;br /&gt;
   File &amp;quot;&amp;quot;, line 1, in &lt;br /&gt;
   File &amp;quot;&amp;quot;, line 2, in Select_analysis&lt;br /&gt;
 pywintypes.com_error: (-2147467259, 'Unspecified error', None, None)&lt;br /&gt;
&lt;br /&gt;
Для получения более содержательного сообщения, необходимо &amp;quot;завернуть&amp;quot; вызов команды выдающей ошибку в блок try: except pywintypes.com_error, вот таким образом:&lt;br /&gt;
&lt;br /&gt;
 try:&lt;br /&gt;
 	wrong_command_here&lt;br /&gt;
 except pywintypes.com_error:&lt;br /&gt;
 	# Получить сообщение об ошибке от геопроцессора&lt;br /&gt;
 	msgs = gp.GetMessage(0)&lt;br /&gt;
 	&lt;br /&gt;
 	# Return gp error messages for use with a script tool&lt;br /&gt;
 	gp.AddError(msgs)&lt;br /&gt;
 		&lt;br /&gt;
 	# Вывести ошибки для использования в Python/PythonWin&lt;br /&gt;
 	print msgs&lt;br /&gt;
&lt;br /&gt;
Для использования этой возможности необходимо установить [http://sourceforge.net/projects/pywin32/files/ Python for Windows extensions] для соответствующей версии Python. Если запускать строку вызывающую ошибку в этом блоке, информации будет чуть больше (хотя тоже не всегда достаточно).&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/programs/python/validation.7z Скачать] готовый скрипт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ссылки по теме'''&lt;br /&gt;
&lt;br /&gt;
* [http://gis-lab.info/qa/error-matrix.html Матрица ошибок и расчет показателей точности тематических карт]&lt;/div&gt;</summary>
		<author><name>Amuriy</name></author>
	</entry>
</feed>