Ультимативно быстрое введение в Python и ArcPy

Перед тем как начать, я хочу пояснить, что нахожусь на самом низшем уровне подготовки в разработке скриптов на Python для ArcGIS. И по сути статья – это не только моя попытка сократить время изучения огромного массива информации для только начинающих «питонистов», но и способ сохранить для себя же накопленные знания. Поэтому опытные программисты запросто могут поймать меня на некорректных фразах, терминах или неверных методах.

Общая информация

Для начала давайте разберемся о чем мы вообще. У нас есть язык программирования Python. Самое главное, что нам нужно знать – в нем можно удобно и быстро создавать скрипты для ГИС. А для ArcGIS есть мощная библиотека ArcPy.

Если вы только начинаете ваш путь в разработке то вас может смутить слово библиотека (как и меня когда-то). По сути это набор маленьких подпрограмм, которые мы можем запускать в коде. То есть какие-то действия нам не нужно прописывать самим — за нас уже это сделали.

А чтобы разобраться с библиотекой ArcPy, достаточно знать что такое инструменты геообработки в ArcGIS. Все инструменты, которыми мы пользуемся в ГИС мы можем активировать в скриптах.

Для ясности зайдем на страницу документации инструмента геообработки ArcGIS «Буфер».

Там мы увидим, что помимо описания работы инструмента есть описание параметров и примеры на Python. Вот этим всем мы будем и должны пользоваться.

Какие еще библиотеки вам могут пригодиться, ведь их очень много? Библиотека os – работает с системными командами, например, удалить файл. Shutil – что-то похожее и тоже для работы с файлами. Glob и pathlib – работа с путями данных. Pandas – мощная библиотека для работы с таблицами. NumPy — один из самых фундаментальных пакетов в Python — универсальный пакет для обработки массивов. А еще есть Requests — это для парсинга. Keras — для создания и обучения кода глубоких нейронных сетей….Пожалуй хватит пока.

Теория

Синтаксис языка программирования – это некий свод правил написания и формирования структуры кода, чтобы программа могла понять где команды к действию, а где нет. Синтаксис Python на самом деле очень прост, но есть пара основных моментов:

  • Конец строки является концом инструкции. Проще говоря одна строка — одно действие
  • Вложенные инструкции объединяются в блоки по величине отступов. Или если нам необходимо одно действие вложить в другое, то нужно сделать отступ.
Основная инструкция:
    Вложенный блок инструкций

В любом языке программирования у нас будут переменные — объекты, в которых можно сохранять различные (числовые, строковые и прочие) значения. Сама процедура сохранения называется задать переменную, которой присваивается какое-либо значение. В Python это делается знаком равенства. И если вы хотите, чтобы ваша переменная содержала цифру – то просто пишем ее. Если текст – то значение берем в кавычки.

Переменные можно складывать (a + b), вычитать (a — b), умножать (a*b), сравнивать (a > b) и так далее.

Помимо чисел и текста есть еще:

Списки (или массивы) – несколько значений, записанных подряд. Значения в списках записываются через запятую и заключаются в квадратные скобки.

a = [10, 20, 30]

#или

b = ['Ваня', 'Саша', 'Миша']

Кортежи, тоже самое, что и списки, но без возможности изменить значения.

a = (10, 20, 30)

Словари – чуть сложнее и состоят из ключа (key) и значения (value). Если очень грубо провести аналогию, то это множество переменных, внутри переменной.

a = {'Ваня': 10, 'Саша': 20, 'Миша': 30}

Важно знать, что к каждому элементу списка, кортежа и словаря можно обратиться отдельно. А еще важно знать, что для работы со списками, кортежами и словарями есть отдельные методы. Например, если мы хотим получить количество элементов в списке, то пропишем следующий код:

list.count(x)

Условный оператор if

Не всегда наша задача выполняется однозначно. Иногда нужно проверить какое-либо условие. В этом случае помогает условная инструкция if-elif-else (или на русском “А что если?»). Сначала записывается часть if с условным выражением, далее могут следовать одна или более необязательных частей elif, и, наконец, необязательная часть else.

a = int(input())
if a < -5:
    print('Low')
elif -5 <= a <= 5:
    print('Mid')
else:
    print('High')

Циклы

И пара слов про циклы. Говоря простым языком цикл – это повторение какого-то действия. В python основными являются while и for. Первый повторяет действие, пока выполняется какое-либо условие.

i = 0
while i <= 15:
     print(i)
     i = i + 5


В этом примере программа нам будет выводить на экран число, затем прибавлять к числу 5 до тех пор, пока оно не станет равно или больше 15.

Второй цикл чуть посложнее. Он проходится по любому итерируемому объекту (например строке или списку), и во время каждого прохода выполняет тело цикла.

list = (0, 1, 2, 3, 4)

for i in list:

     print(i)

Если попробовать описать простыми словами этот цикл, то он будет выполнять действие print(i) до тех пор, пока не закончится кортеж list. И в данном случае у нас поочередно выведутся на экран числа от 0 до 4.

На этом теория по Python завершена. Разумеется это далеко не все, но для начала работы нам пока хватит. Но я крайне рекомендую вам для наилучшего понимания синтаксиса и работы базовых структур языка самостоятельно изучить теорию, например, на этом ресурсе.

Подготовка

Начнем потихоньку создавать первую программу. Сначала нам нужно выбрать в какой среде мы будем писать наш код. Мы можем писать код прямо в ArcMap или ArcGIS Pro, используя Окно Python.

Но зачастую код пишется в сторонних IDE – интегрированной среде разработки…Нет, звучит сложно…В сторонних интерфейсах специально созданных для программирования. Их много, поэтому вот хорошая статья, которая описывает наиболее популярные среды для python-разработки. Важный момент, если у вас не установлен ArcGIS на компьютере, то вы не сможете работать с библиотекой ArcPy.

Мы будем писать код в PyCharm. Но прежде чем вы сможете приступить к написанию скрипта, вам нужно связать ArcGIS Pro с выбранной вами IDE. Если вы откроете ArcGIS Pro и перейдете к Python, вы увидите arcgispro-py3 и список модулей, уже включенных в эту среду.

Примечание: эту среду нельзя изменить, но можно ее клонировать и уже изменять.

Запомните путь к среде и откройте PyCharm. Чтобы настроить PyCharm, вы начинаете работу с File => New Project =>

Затем выберите папку своего проекта и нажмите «Previously configured interpreter» , «…» справа и поскольку мы предусмотрительно записали путь к среде ArcPy, то сможем быстро найти его и щелкнуть по python.exe .

Проект создан, осталось нажать File => New… => Python File. Теперь вы готовы начать использовать ArcPy.

Кодинг

Все, мы готовы погрузиться в чудесный мир программирования. Давайте же в первой строчке напишем:

import arcpy

Если мы это не сделаем, то все, что мы напишем дальше, не будет иметь смысла. Этой строчкой мы подгружаем библиотеки. Если помимо ArcPy нам нужна, например, библиотека os, то дописываем ее через запятую.

Теперь сворачиваем PyCharm, заходим в Проводник и создаем папку, допустим, С:\LearnPython\ — она нам понадобится.

Еще нужно пояснить логику работы Python и ArcPy в частности. Импорт arcpy позволяет нам получить доступ ко всему в модуле ArcPy. Если мы хотим запустить какой-то процесс из доступных в ArcPy, то выглядеть это будет примерно вот так:

переменная = arcpy.функция(параметры)

Любая функция либо возвращает какое-то значение, либо просто что-то делает в памяти или диске компьютера и возвращает None. Вместо ArcPy, можете поставить любую другую библиотеку. А вот доступные в библиотеке функции и их методы уже придется искать в документации. Без этого никак.

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

arcpy.env.workspace = r"C:\LearnPython\"
arcpy.env.overwriteOutput = True

Немного разберем. В этих двух строчках мы прописали, так называемые, атрибуты. Они хранят состояние объекта. В первой строчке мы обратились в библиотеке ArcPy секции env, функции workspace и задали значение ранее созданной папки. Иными словами мы сказали нашей программе, что рабочей областью теперь является эта папка.

Вторая строчка просто полезная вещь, которую я рекомендую запомнить. Она разрешает перезаписывать созданные скриптом данные (если мы будем запускать скрипт более одного раза).

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

workspace = arcpy.env.workspace

Теперь мы готовы заняться чем-то поинтереснее, например, создать базу геоданных (GDB).

arcpy.CreateFileGDB_management(workspace, "wonders")
arcpy.env.workspace = f"{workspace}\wonders.gdb"

Мы создали базу геоданных в каталоге workspace и с названием wonders. И вы могли заметить, что перед путями я ставил буквы r и f. Конструкция r’…’ — это сырые строки (необработанные) строки, необходимые, чтобы символ «\» не вызывал экранирование символов.

f-строки — это форматирование строк , которое появилось в Python 3.6 и схожее с методом format().

Ничего не понятно, да?…Если да, то предлагаю пока просто запомнить, что пути к папкам/файлам лучше заключать в конструкцию r’, чтобы пути корректно обрабатывались.

Далее давайте создадим новый словарь, в котором ключом будет название нового чуда света, а в значениях будут координаты х и у.

NewWonders = {"Великая Китайская стена": [40.676735, 117.232209],
              "Чичен-Ица": [20.683618, -88.569096],
              "Петра": [30.328983, 35.447629],
              "Мачу Пикчу": [-13.163244, -72.545143],
              "Статуя Христа-Искупителя": [-22.950829, -43.210255],
              "Коллизей": [41.891003, 12.492376]
              "Тадж-Махал": [27.175126, 78.042130]}

Уверен, что ГИС-специалисты сразу уловили связь ключа в словаре с уникальным идентификатором объекта (ID) — так и есть!

Следующим шагом зададим проекцию, так как без нее наши данные не смогут стать пространственными.

WGS84 = arcpy.SpatialReference(4326)

Теперь пришло время создать в базе геоданных точечный класс пространственных объектов. Но одного класса мало — этот класс пока что пустой. Поэтому необходимо наполнить его данными. Они хранятся в нашем словаре. Но код можно легко изменить, чтобы он извлекал данные из другого источника, например текстового файла или электронной таблицы.

arcpy.CreateFeatureclass_management(arcpy.env.workspace,
"NewWonders", "POINT", spatial_reference = WGS84)

Если мы сейчас попробуем добавить данные из словаря в наш точечный класс пространственных данных, то у нас ничего не выйдет. Хотя бы потому что, у него нет необходимых полей. Поэтому также, как и в настольной ArcGIS, воспользуемся инструментом «Создать поле» или AddFields_management.

arcpy.AddFields_management("NewWonders",
                          [["Name", "Text", "Name", 35],
                          ["Lat", "Float", "Lat", 10],
                          ["Lon", "Float", "Lon", 10]])

Внимание! Заключительная часть для новичков будет очень тяжелой, но ее освоение гарантирует некий очень базовый уровень навыков по созданию скриптов для ArcGIS.

Итак, в ГИС данные хранятся в виде геометрии и атрибутов. Атрибуты хранятся в таблице. И когда встает задача работы с атрибутами более чем одного объекта, то курсоры становятся практически незаменимы.

Курсор – это объект доступа к данным, который может использоваться как для итерации по набору строк в таблице, так и для вставки новых строк в таблицу. Курсоры могут быть трех форм: поискавставки или обновления. Как правило, курсоры используются для считывания и обновления атрибутов.

Давайте напишем следующий код и разберем его построчно.

cursor = arcpy.da.InsertCursor("NewWonders", ["Shape@", "Name", "Lat", "Lon"])
     for key,value in NewWondersDict.items():
          pGeom = arcpy.PointGeometry(arcpy.Point(value[1], value[0]), spatial_reference=WGS84)
          row = (pGeom, key, value[0], value[1])
          cursor.insertRow(row)
del cursor

Так как курсор — это объект, для него надо создать переменную или инициализировать.

cursor = arcpy.da.InsertCursor("NewWonders", ["Shape@", "Name", "Lat", "Lon"])

Здесь мы задали переменную cursor и она будет использоваться для вставки новых строк в таблицу «NewWonders» и полей «Shape@», «Name», «Lat», «Lon». Shape@ — это служебное поле, без которого ArcGIS не сможет корректно добавить наши точки на карту.

Далее мы запускаем цикл, который будет работать, пока не пройдется по всем ключам и значениями в нашем словаре. Фактически, в строчке for указывается сколько раз проделать действие и у нас оно равно количеству новых чудес света.

А в теле цикла у нас 3 действия.

pGeom = arcpy.PointGeometry(arcpy.Point(value[1], value[0]), spatial_reference=WGS84)
    row = (pGeom, key, value[0], value[1])
    cursor.insertRow(row)

В первой строчке мы создаем геометрию объектов с помощью PointGeometry, а Point используются для получения долготы (значение [1]) и широты (значение [2]) из нашего словаря. Если вы ничего не поняли — это нормально! Просто обратите внимание, что один метод «вложен» в другой — так тоже можно делать!

Вторая строчка — это кортеж, в котором мы через запятую записали значения для полей в строке таблицы. pGeom — геометрия для поля Shape, key — это имя для поля «Name», value 1 и 2 — широта и долгота.

Третья строчка вставляет в таблицу строчку с атрибутами из row и переносит курсор на строчку ниже.

Все эти действия повторяются пока в словаре не закончатся значения. В конце курсор с помощью del удаляется.

Запуск и отладка

Запустить наш код можно прямо в интерфейсе PyCharm, нажав комбинацию горячих клавиш Alt+Shift+F10. Либо открыв вкладку Run наверху.

Другой способ я описывал в этой статье — через командную строку: нажимаем Win+R => Вводим cmd => в открытой Командной строке мы должны сначала активировать нашу среду, которую мы предусмотрительно запомнили. Далее необходимо прописать Python.exe и через пробел прописать путь к нашему .py файлу вместе с расширением.

Если мы все сделали правильно, то сможем насладиться в ArcGIS нанесенными на карту точками расположения новых чудес света!

Отладка кода — это не менее важная часть написания кода, как и само его написание. Она подразумевает поиск ошибок и оптимизацию работы программы. Практически невозможно с первого раза написать корректно рабочую программу. Но сегодня мы не будем затрагивать эту тему, так как она заслуживает отдельного рассмотрения.

Заключение

Написанный нами скрипт вы можете скачать, а можете попробовать воссоздать сами. Могу еще порекомендовать пройти бесплатный и очень полезный курс Python for Everyone. Если тема вам показалась интересна, то напишите об этом в комментариях. Буду стараться развить эту тему и будем вместе совершенствовать наши навыки программирования!