Открытие проекта и обзор наборов данных

Прежде чем вы начнете использовать Python для запуска инструментов геообработки, вы загрузите и просмотрите наборы данных в ArcGIS Pro.

  1. Загрузите данные для этого руководства и извлеките содержимое в папку на своем компьютере.

    Файл .zip содержит папку с именем PythonWorkflow.

    В этом руководстве данные находятся в папке C:\Lessons\PythonWorkflow\. Можно использовать другую папку, но тогда необходимо изменить пути в последующих инструкциях и в коде.

  2. В папке C:\Lessons\PythonWorkflow\ дважды щелкните Workflow.aprx.

    Проект Workflow откроется в ArcGIS Pro.

  3. Если панель Каталог не видна, на вкладке Вид щелкните Панель Каталог.
  4. На панели Каталог разверните Папки и PythonWorkflow.
  5. Разверните Transportation.gdb.

    База геоданных Transportation развернута для отображения классов пространственных объектов.

    Классы объектов в этой базе геоданных связаны с транспортом. Предположим, что вам нужно построить сеть из этих классов объектов. Чтобы сделать это возможным, они должны храниться в одном и том же наборе данных объектов и иметь одинаковые системы координат. В настоящее время это не так.

    В этом руководстве вы будете использовать код Python для проверки системы координат классов пространственных объектов и использовать инструмент Проецировать для преобразования любых наборов данных, которые еще не находятся в правильной системе координат, копируя их в новую базу геоданных и набор данных объектов. Это позволит вам создать сеть, хотя в этом руководстве создавать ее вы не будете.

    Перед началом работы над кодом Python вы просмотрите систему координат выбранных наборов данных и запустите инструмент Проецировать вручную. Это даст вам информацию, необходимую для использования кода Python для автоматизации процесса.

  6. Щелкните правой кнопкой bike_racks и выберите Добавить в текущую карту.

    Щелкните правой кнопкой мыши класс объектов bike_racks и добавьте к текущей карте.

  7. Используйте тот же метод, чтобы добавить на карту класс объектов roads.

    Эти классы объектов представляют собой стойки для парковки велосипедов и дороги в Вашингтоне, округ Колумбия.

    Далее вы изучите системы координат двух классов объектов.

  8. На панели Содержание щелкните правой кнопкой Карта и щелкните Свойства.

    Откройте панель Свойства этой карты.

  9. В окне Свойства карты: Карта щелкните Система координат.

    Щёлкните Системы координат.

  10. Разверните Слои и разверните записи систем координат WGS 1984 и NAD 1983 StatePlane Maryland FIPS 1900 (US Feet).

    Разверните записи двух систем координат.

    Класс объектов bike_racks использует географическую систему координат WGS 1984, а классы road и boundary - систему координат проекции State Plane for Maryland, NAD 1983 StatePlane Maryland FIPS 1900 (US Feet).

    Ваша цель - поместить все классы пространственных объектов в набор данных с системой координат проекции.

  11. Щелкните OK, чтобы закрыть окно Map Свойства.

    Вы изучили базу геоданных и определили две системы координат, используемые классами пространственных объектов. Далее вы будете проецировать один из классов объектов.

Проецирование класса объектов

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

  1. На ленте щелкните Анализ и в разделе Геообработка щелкните Инструменты.

    Щелкните Анализ и в разделе Геообработка щелкните Инструменты.

    Откроется панель Геообработка.

  2. На панели Геообработка щелкните в поле поиска и введите Проецировать.
  3. В результатах поиска щелкните Проецировать (Инструменты управления данными).
  4. На панели инструмента Проецировать для параметра Входной набор данных или класс объектов выберите bike_racks.
  5. Для выбора имени Выходного набора данных или класса объектов щелкните кнопку обзора и перейдите к базе геоданных Transportation. Разверните базу геоданных и в поле Имя введите bike_racks_sp. Щелкните Сохранить.
  6. Для Выходной системы координат щелкните раскрывающийся список и выберите пункт roads.

    Инструмент Проецировать с заданными параметрами.

    Выбор roads задает значение для Выходной системы координат в соответствии с системой координат класса объектов roads, State Plane Maryland.

    Параметру Географическое преобразование присвоено значение WGS_1984_(ITRF00) To_NAD_1983, потому что географические системы координат входных и выходных данных различны.

    Примечание:

    Географическое преобразование необходимо, когда географические системы координат входного класса объектов и выходного класса объектов отличаются. Если географические системы координат идентичны, список значений для этого параметра не отображается. Если преобразование необходимо, появится раскрывающийся список, содержащий входные и выходные географические системы координат, и будет выбрано преобразование по умолчанию. В этом руководстве вы будете полагаться на это преобразование по умолчанию.

  7. Щелкните Запустить.

    Инструмент Проецировать запустится, и проецированный класс пространственных объектов будет добавлен на активную карту.

    Чтобы подготовить данные для использования в сети, вам нужно будет повторить этот процесс для каждого класса объектов в базе геоданных: проверьте систему координат и решите, нужно ли вам запускать инструмент Проецировать. Проецируйте класс пространственных объектов, который должен быть проецирован. Скопируйте другие классы объектов без проецирования.

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

  8. Закройте инструмент Проецировать.
  9. На панели Каталог щелкните правой кнопкой мыши класс объектов bike_racks_sp, щелкните Удалить и нажмите Да, чтобы окончательно удалить класс объектов.

    Теперь вы готовы начать рабочий процесс, использующий код Python.

Использование Python для описания класса пространственных объектов

Первым шагом в рабочем процессе является изучение системы координат классов пространственных объектов. Вы сделаете это с помощью кода Python в окне Python.

  1. На ленте щелкните вкладку Анализ и в разделе Геообработка щелкните стрелку ниспадающего списка у кнопки Python и щелкните Окно Python.

    Откройте окно Python.

  2. Щелкните командную строку в нижней части окна Python, введите следующий код и нажмите Enter:

    desc = arcpy.da.Describe("bike_racks")

    Добавьте код для описания класса объектов bike_racks.

    Когда вы нажимаете Enter, код выполняется немедленно. Он не выводит никакой информации, но создает переменную с именем desc и задает ее равной результату выполнения функции Describe в классе объектов bike_racks.

    Функция Describe возвращает словарь, содержащий свойства набора данных. Это дает вам доступ к пространственной привязке, среди прочих свойств.

  3. В командной строке введите следующий код и нажмите Enter.

    sr = desc["spatialReference"]

    Это добавляет новую переменную с именем sr к значению, хранящемуся в ключе SpatialReference словаря свойств набора данных. Объект SpatialReference содержит всю соответствующую информацию о системе координат набора данных. Это позволяет проверить определенные свойства.

  4. В командной строке введите следующий код и нажмите Enter.

    print(sr.name)

    При этом выводится имя объекта пространственной привязки.

    Выведите имя объекта пространственной привязки.

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

Составление списка классов объектов и их описание

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

  1. В командной строке введите следующий код и нажмите Enter.

    fcs = arcpy.ListFeatureClasses()

    Это создает переменную с именем fcs и задает ее равной результату выполнения функции ListFeatureClasses в текущей рабочей области. Вы не задали рабочую область в явном виде, но для этого проекта Transportation.gdb является рабочей областью по умолчанию. Функция возвращает список классов объектов в Transportation.gdb.

  2. В командной строке введите следующий код и нажмите Enter.

    print(fcs)

    Результатом является список Python имен классов объектов. Он заключен в квадратные скобки, а имена классов объектов представляют собой строки Python, разделенные запятыми.

    ['bus_lines', 'boundary', 'street_lights', 'roads', 'traffic_analysis_zones', 'bike_routes', 'bike_racks', 'parking_zones', 'intersections', 'station_entrances']

    Затем вы используете цикл for для обработки каждого элемента в списке.

  3. В командной строке введите следующий код:

    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        print(f"{fc}: {sr.name}")

    Цикл for для обработки списка классов объектов

    Первая строка задает цикл for. Он создает временную переменную с именем fc, которой будет присваиваться имя каждого класса объектов из списка fcs. Строка заканчивается двоеточием, указывающим на то, что далее следует блок кода, который будет выполняться для каждого элемента в списке. Следующие три строки имеют отступ в четыре пробела, это показывает, что они принадлежат блоку кода. Первая строка в блоке кода создает переменную с именем desc и задает ее равной результату выполнения функции Describe для текущего значения класса объектов, хранящегося в переменной fc. Вторая строка создает переменную sr и присваивает ей значение объекта spatialReference, хранящегося в desc. В третьей строке выводится форматированная строка, содержащая имя класса пространственных объектов, двоеточие и название пространственной привязки.

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

  4. Дважды нажмите Enter, чтобы запустить цикл for и его блок кода.

    Сообщение о пространственной привязки для каждого класса объектов в списке.

    Половина классов объектов находится в одной системе координат, а вторая половина - в другой.

    Следующим шагом является написание кода для создания базы геоданных и использования инструментов Проецировать и Копировать объекты для объединения классов пространственных объектов в один набор данных с общей системой координат проекции. Вы экспортируете проделанную работу и используете ее в качестве основы для скрипта.

Создание скрипта

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

  1. Щелкните правой кнопкой мыши в разделе транскрипции в окне Python и щелкните Сохранить запись.

    Щелкните правой кнопкой мыши в окне Python и сохраните запись.

  2. В окне Сохранить запись перейдите в папку PythonWorkflow, в которую вы извлекли данные, назовите запись workflow_project.py, и щелкните Сохранить.

    При этом запись сохраняется в виде файла скрипта Python, который вы можете открыть в редакторе Python.

  3. Запустите Microsoft File Explorer и перейдите в папку PythonWorkflow.
  4. Щелкните правой кнопкой workflow_project.py и выберите Редактировать в IDLE (ArcGIS Pro).

    Щелкните правой кнопкой скрипт workflow_project.py и выберите Редактировать в IDLE (ArcGIS Pro).

    Примечание:
    Если у вас также установлен ArcGIS Desktop 10.х (ArcMap), в контекстном меню будет отображаться ярлык Редактировать в IDLE. Не используйте этот ярлык, он открывает более старую версию Python.

    Примечание:
    Если Редактировать в IDLE (ArcGIS Pro) не появляется в контекстном меню, щелкните Пуск, разверните ArcGIS и щелкните Командная строка Python. В окне Командная строка Python введите idle и нажмите Enter. Откроется окно IDLE (Python 3.9 Shell). Щелкните Файл и щелкните Открыть. Найдите и откройте файл workflow_project.py.

    Скрипт откроется в IDLE, редакторе Python по умолчанию. Скрипт включает весь код из раздела записи окна Python, включая любые сообщения, которые отображаются в виде комментариев с символом хэша в начале строки.

    Запись откроется в редакторе IDLE Python.

  5. В окне редактора IDLE удалите весь код перед строкой fcs = arcpy.ListFeatureClasses().
  6. Удалите все строки комментариев.
  7. Удалите строку print(fcs).

    Ниже приведен оставшийся код:

    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        print(f"{fc}: {sr.name}")

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

  8. Добавьте новую строку перед строкой fcs = arcpy.ListFeatureClasses() и добавьте следующие строки в начале скрипта.

    import arcpy
    import os

    Первая строка кода импортирует пакет ArcPy, чтобы гарантировать, что функциональность ArcPy доступна в скрипте, когда он запускается вне ArcGIS Pro. Вторая строка импортирует модуль os, используемый для обработки путей к файлам.

  9. Добавьте новую строку после первых двух, затем добавьте следующие строки кода:
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    arcpy.env.workspace = os.path.join(mypath, gdb)

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

    В пути используется один прямой слэш (/) вместо одного обратного (\). Единственная обратная косая черта в Python используется в качестве escape-символа и может иметь непредвиденные последствия. Вместо одного прямого слэша можно также использовать букву r перед строкой (например, r"C:\Lessons\PythonWorkflow") или использовать двойной обратный слэш ("C:\\Lessons\\PythonWorkflow"). Все три обозначения считаются правильными и могут использоваться взаимозаменяемо.

    В следующей строке переменная gdb задается равной имени базы геоданных, в которой хранятся интересующие вас классы объектов.

    Последняя строка задает рабочую область, объединяя папку, в которой находятся данные (mypath), и имя базы геоданных (gdb). Функция os.path.join() используется для объединения этих двух строк в новую строку пути для рабочей области. Рекомендуется использовать для этого os.path.join(), поскольку это позволяет создавать более надежные строки пути без использования одиночного обратного слэша (\). Они считываются в Python как escape-символы и могут привести к ошибкам.

    Ниже показан полный скрипт:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        print(f"{fc}: {sr.name}")

    Скрипт в первой точке проверки

    Теперь можно протестировать скрипт, чтобы убедиться, что он работает.

  10. Нажмите Файл и нажмите Сохранить.

    Это позволяет сохранить внесенные вами в скрипт изменения. Также можно использовать сочетание клавиш Ctrl+S в IDLE, чтобы сохранить работу.

  11. Нажмите Запустить и нажмите Запустить модуль.

    Запустить модуль для запуска кода скрипта

    Это запускает скрипт. Также для запуска скрипта можно использовать клавишу F5.

    Появится окно IDLE Shell, и после короткой паузы, во время которой импортируется модуль ArcPy, будут выведены имена классов объектов и названия пространственных привязок.

    Результаты первого теста, названия классов объектов и пространственные привязки

    Чтобы завершить скрипт для автоматизации этого рабочего процесса, вам нужно будет добавить следующие возможности: 1) создать базу геоданных; 2) создать набор данных объектов; 3) скопировать классы объектов, которые уже спроецированы; и 4) спроецировать классы объектов, которые находятся в географической системе координат. Вы напишете код для каждого элемента, протестируете код, а затем продолжите работу со следующим элементом.

Использование кода для создания базы геоданных

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

  1. После строки, начинающейся с arcpy.env.workspace, добавьте строку и введите следующий код:

    arcpy.env.overwriteOutput = True

    Далее вы создадите переменные для хранения имен новой базы геоданных и нового набора классов объектов.

  2. После строки gdb = "Transportation.gdb" добавьте строку и введите следующий код:

    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"

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

    Затем добавьте код для создания базы геоданных.

  3. После строки, начинающейся с arcpy.env.overwriteOutput, введите следующий код:

    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)

    Это строка вызывает инструмент Создать файловую базу геоданных. В скобках вы указываете, что первый обязательный параметр, местоположение новой базы геоданных, устанавливается согласно переменной mypath, которая содержит заданное вами значение пути. После запятой вы задаете другой обязательный параметр инструмента - имя файловой базы геоданных. Переменная new_gdb содержит имя новой базы геоданных.

    Строка также присвоила переменной результат создания базы геоданных. Переменная new_gdb_path содержит путь и имя только что созданной базы геоданных. Это упрощает обращение к этой новой базе геоданных в скрипте.

    Прежде чем протестировать скрипт, вы закомментируете некоторый код, который не нуждается в тестировании.

  4. Выделите все строки кода после строки new_gdb_path.

    Выберите строки, которые не нужно тестировать.

  5. Щелкните Формат, затем щелкните Закомментировать область.

    Закомментированные строки.

    Это добавляет два хэш-символа в начало каждой из выбранных строк кода. Python интерпретирует строки, начинающиеся со знака хэша, как комментарии, поэтому они не будут выполняться. Вы могли бы удалить эти строки, но часть кода будет использована снова. Закомментировав эти строки, вы можете оставить код в скрипте для последующего использования, но предотвратить его запуск.

    Некоторые строки закомментированы.

    Ниже показан код на данный момент:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    ##fcs = arcpy.ListFeatureClasses()
    ##for fc in fcs:
    ##    desc = arcpy.da.Describe(fc)
    ##    sr = desc["spatialReference"]
    ##    print(f"{fc}: {sr.name}")

  6. Сохраните и запустите скрипт.

    Окно IDLE Shell перезапускается, и через несколько мгновений возвращается приглашение ввода, >>>. В настоящее время в коде нет работающих строк, которые выводят информацию в оболочку, поэтому трудно сказать, сработал ли код. Выполните проверку в ArcGIS Pro.

  7. В ArcGIS Pro, на панели Каталог, в разделе Папки щелкните правой кнопкой мыши папку PythonWorkflow и выберите Обновить.

    Обновите папку PythonWorkflow на панели Каталог.

  8. Разверните папку PythonWorkflow.

    В папке находится новая база геоданных.

    В папке находится новая база геоданных. В настоящее время она пуста.

  9. Щелкните правой кнопкой мыши Metro_Transport.gdb, выберите Удалить и нажмите Да, чтобы окончательно удалить базу геоданных.

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

    Еще один индикатор работы скрипта, который вы можете использовать, - это добавление сообщений о событиях. Вы можете добавить инструкции print в свой код, чтобы отслеживать происходящее.

  10. В окне IDLE Editor после строки, начинающейся с new_gdb_path = arcpy.CreateFileGDB, добавьте новую строку и введите следующий код:

    print(f"The geodatabase {new_gdb} has been created.")

    Добавьте строку для вывода сообщения о создании базы геоданных.

    Эта инструкция print выводит форматированную строку, содержащую значение переменной new_gdb. Инструкции print не являются необходимыми для запуска скрипта, но помогают отслеживать, что делает скрипт. Они также могут быть очень полезны при отладке ошибок в длинных сценариях. Вы можете добавить несколько инструкций print, показывающих статус скрипта в разных точках, и когда вы видите каждое сообщение, вы понимаете, что скрипт перешел к этой точке. Вы также можете использовать форматированные строки для вывода значений переменных в скрипте; это может быть очень полезно при отладке ошибок.

  11. Сохраните скрипт.

Использование кода для создания набора классов объектов

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

Для этого набора данных вы будете использовать систему координат State Plane Maryland. Хотя при настройке системы координат в Python можно использовать ее имя, проще использовать короткий код, известный как WKID, или общеизвестный идентификатор.

  1. В ArcGIS Pro на панели Содержание щелкните правой кнопкой мыши слой roads и выберите Свойства.
  2. На панели Свойства слоя выберите вкладку Источник.

    Щелкните вкладку Источник на панели Свойства слоя.

  3. Щелкните Источник данных, чтобы свернуть раздел Источник данных.

    Сверните раздел Источник данных.

  4. Щелкните Пространственная привязка, чтобы развернуть раздел.

    Щелкните Пространственная привязка, чтобы развернуть раздел Пространственная привязка.

    Код WKID для этой системы координат - 2248.

    Код WKID - 2248.

  5. Нажмите Отмена, чтобы закрыть панель Свойства слоя.

    Теперь вы будете использовать этот код WKID для задания пространственной привязки для набора классов объектов.

  6. В IDLE, после строки, начинающейся с print(f"The geodatabase, введите следующие строки кода:

    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")

    Добавлены строки для создания набора классов объектов и вывода отчета об этом.

    В первой строке запускается инструмент Создать набор классов объектов и задаются три необходимых параметра. Первый параметр - это местоположение базы геоданных, в которой создается набор классов объектов, второй - это имя набора классов, а третий - WKID системы координат для него. Переменная new_gdb_path включает полный путь к базе данных. Имя набора классов объектов было ранее присвоено переменной fds.

    Другой способ задать систему координат - указать путь к существующему классу пространственных объектов, например, указав путь к классу пространственных объектов roads в базе геоданных Transportation.gdb.

    Во второй строке выводится форматированная строка, сообщающая о создании нового набора данных.

    Ниже показан полный код:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    ##fcs = arcpy.ListFeatureClasses()
    ##for fc in fcs:
    ##    desc = arcpy.da.Describe(fc)
    ##    sr = desc["spatialReference"]
    ##    print(f"{fc}: {sr.name}")

  7. Сохраните и запустите код.

    Код запускается, и через несколько мгновений два сообщения о состоянии выводятся в оболочку IDLE.

    Код запускается и выводятся сообщения о состоянии.

  8. В ArcGIS Pro, на панели Каталог, щелкните правой кнопкой мыши папку PythonWorkflow и выберите Обновить.

    База геоданных Metro_Transport создана.

  9. Разверните базу геоданных Metro_Transport.

    Набор классов объектов Metro_Transport создан.

  10. Удалите базу геоданных Metro_Transport.

Использование кода для условного копирования классов объектов

Далее вы будете использовать часть ранее закомментированного кода для составления списка классов объектов в базе геоданных Transportation.gdb. Вы добавите в него логику, чтобы проверить, является ли WKID пространственной привязки каждого класса объектов 2248, и код для копирования класса объектов в новую базу геоданных при выполнении этого условия.

  1. В IDLE выберите строки кода, которые вы закомментировали ранее.
  2. Щелкните Формат, затем щелкните Раскомментировать область.

    Раскомментируйте код.

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

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

    Инструмент Копировать объекты, как и инструмент Проецировать, принимают входной класс объектов и создают выходной класс объектов. Хотя имена классов пространственных объектов можно сохранить прежними, пути для выходных данных будут другими, поскольку новые классы пространственных объектов будут находиться в новой базе геоданных.

    Входные классы объектов представлены переменной fc. Значения fc - это имена классов пространственных объектов, полученные из списка классов объектов в текущей рабочей области.

    Например, полный путь к одному из входных классов объектов это: C:\Lessons\PythonWorkflow\Transportation.gdb\roads

    Поскольку рабочая область задана, имена классов объектов, например roads, могут использоваться непосредственно в инструментах. При работе с классами пространственных объектов в текущей рабочей области полный путь не требуется. Вот почему desc = arcpy.da.Describe(fc) или desc = arcpy.da.Describe("roads") работают.

    Однако вы должны указать в параметрах выходного класса объектов полный путь для новых классов объектов в новой рабочей области. Этот путь может быть создан с использованием os.path.join(), как и ранее в скрипте, где была задана среда.

  3. Выберите строку кода, которая начинается с print(f"{fc}: и замените ее следующей строкой кода:

    new_fc = os.path.join(mypath, new_gdb, fds, fc)

    Эта строка должна находиться на том же уровне отступа, внутри блока кода цикла for fc in fcs:.

    В этой строке новая переменная, new_fc, устанавливается равной пути, созданному объединением папки, в которой находятся данные (mypath), новой базы геоданных (new_gdb) и нового набора классов объектов (fds). Последняя часть пути - это имя нового класса объектов, которое совпадает с именем входного класса (значение переменной fc). Эта часть пути изменяется с каждой итерацией цикла по списку классов объектов.

    Создав полный путь для выходных классов объектов, вы готовы добавить код, определяющий, копировать или проецировать каждый класс объектов, в зависимости от системы координат. В Python, вы можете протестировать различные условия с помощью инструкций if и запустить разные блоки кода в зависимости от того, является ли условие в инструкции истинным.

  4. После строки new_fc = os.path.join, добавьте следующую строку кода на том же уровне отступа (внутри цикла for):

    if sr.factoryCode == 2248:

    Этот код проверяет, соответствует ли WKID класса пространственных объектов, сохраненный в объекте sr в качестве его значения factoryCode, WKID системы координат State Plane Maryland - 2248.

    Он использует оператор if и выражение и заканчивается двоеточием, которое показывает, что за ним следует блок кода, выполняющийся, если выражение имеет значение true.

    В инструкции используется двойной знак равенства. В Python одиночный знак равенства используется для присвоения значения переменной, а двойной знак равенства используется для проверки равенства.

  5. Щелкните в конце строки кода и нажмите Enter.

    Это приводит к правильному отступу для следующей строки кода с отступом в четыре пробела относительно строки инструкции if. Это начало нового блока кода, который будет выполняться только в том случае, если sr.factoryCode равно значению 2248.

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

  6. В новой строке с отступом добавьте следующие строки кода:

    arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")

    В первой строке запускается инструмент Копировать объекты, копирующий текущий класс объектов в новую базу геоданных.

    Во второй строке выводится форматированная строка, сообщающая о создании нового набора данных.

    Ниже показан полный код:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        new_fc = os.path.join(mypath, new_gdb, fds, fc)
        if sr.factoryCode == 2248:
            arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")

    В скрипт добавлена логика копирования класса объектов между базами геоданных при WKID равном 2248

  7. Сохраните и запустите код.

    Совпадающие классы пространственных объектов копируются.

    Код запускается. Он создает базу геоданных и набор классов объектов, а также копирует пять слоев, которые находились в системе координат State Plane Maryland.

  8. В ArcGIS Pro, на панели Каталог, обновите папку PythonWorkflow.
  9. Обновите базу геоданных Metro_Transport и разверните ее.
  10. Обновите набор классов объектов Metro_Network и разверните его.

    Пять классов объектов скопированы в новую базу геоданных.

    База геоданных и набор данных содержат классы пространственных объектов, которые соответствуют системе координат набора данных.

Добавление кода для условного проецирования классов объектов

Последним шагом для завершения скрипта является добавление логики для использования инструмента Проецировать, чтобы спроецировать классы объектов, которые не находятся в системе координат State Plane Maryland, и записать результаты в набор классов объектов в новой базе геоданных.

  1. В IDLE щелкните в конце строки кода, который начинается с print(f"The feature class, и нажмите Enter.
  2. Нажмите клавишу Backspace, чтобы уменьшить отступ на один уровень.

    Вы добавите оператор else, который должен иметь тот же уровень отступа, что и предыдущий if.

    else используется для запуска другого блока кода, когда if имеет значение false.

  3. В новой строке с меньшим отступом добавьте следующие строки кода:

    else:
            arcpy.Project_management(fc, new_fc, 2248)
            print(f"The feature class {fc} has been projected.")

    Операторы if и else имеют одинаковый уровень отступа.

    Оператор else создает логическую ветвь с блоком кода, который будет выполняться после проверки оператора if для случаев, когда его значение не true. Логика такова: если WKID равен 2284, класс объектов копируется, если нет - класс объектов проецируется.

    Вторая из этих строк имеет отступ в четыре пробела, поскольку она принадлежит блоку кода, который выполняется в условии else. Инструмент Проецировать проецирует входной класс объектов в систему координат State Plane Maryland, а выходной класс объектов сохраняется в новой базе геоданных. Параметрами инструмента Проецировать являются входной класс объектов, выходной класс объектов и выходная система координат (для этого параметра используется WKID 2248).

    Примечание:
    Существует четвертый параметр инструмента Проецировать, который является необязательным преобразованием. Когда вы ранее запускали инструмент Проецировать, вы видели, что требуется преобразование между географической системой координат NAD 1983 и географической системой координат WGS 1984, но по умолчанию при запуске инструмента выбирается соответствующее преобразование. Это означает, что нет необходимости указывать преобразование в коде.

    Основываясь на более ранних результатах проверки системы координат всех классов пространственных объектов, вы знаете, что классы пространственных объектов, которые не используют систему координат State Plane Maryland, находятся в одной определенной географической системе координат. Однако нет необходимости указывать эту определенную систему координат. При использовании оператора else, инструмент Проецировать запускается для всех классов пространственных объектов, где if имеет значение false, независимо от системы координат.

    Ниже показан полный код:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        new_fc = os.path.join(mypath, new_gdb, fds, fc)
        if sr.factoryCode == 2248:
            arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")
        else:
            arcpy.Project_management(fc, new_fc, 2248)
            print(f"The feature class {fc} has been projected.")

    Полный код скрипта

  4. Сохраните и запустите скрипт.

    Код запускается. Он создает базу геоданных и набор классов объектов, копирует пять слоев, которые находились в системе координат State Plane Maryland, и проецирует пять слоев, которые были в системе координат WGS84.

    Результаты последнего запуска кода

  5. В ArcGIS Pro, на панели Каталог обновите набор классов Metro_Network.

    Набор данных содержит все классы пространственных объектов, все в правильной системе координат.

    Итоговая база геоданных во всеми классами пространственных объектов

    Ваш код работает, и теперь вы сможете создать геометрическую сеть.

Добавление комментариев в скрипт

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

Комментарии начинаются с одного или нескольких хэш-символов. Комментарии могут начинаться с начала строки или могут быть добавлены в конце строки кода.

  1. В IDLE добавьте новую строку в начало скрипта.
  2. Скопируйте и вставьте следующие комментарии в новую строку:

    # Author: your name
    # Date: the date
    # Purpose: This script reads all the feature classes in a
    # geodatabase and copies them to a new feature dataset in
    # a new geodatabase. Feature classes not already in the
    # target coordinate system are projected.

  3. Отредактируйте строки Author и Date, чтобы включить ваше имя и текущую дату.
  4. Перед строкой import arcpy добавьте две новые строки, и во второй строке добавьте следующий комментарий:

    # Imports

    Пустая строка не повлияет на код и сделает его более понятным. В комментарии указано, что этот раздел импортирует библиотеки, необходимые для кода. Импорт обычно помещается в верхней части скрипта.

  5. Добавьте две новые строки после строки import os и введите следующий комментарий:

    # Variables for paths, outputs, workspaces

    Этот комментарий показывает, где эти переменные задаются впервые.

  6. Добавьте две новые строки после строки arcpy.env.overwriteOutput = True и введите следующий комментарий:

    # Create a new geodatabase and dataset

  7. Добавьте две новые строки перед строкой fcs = arcpy.ListFeatureClasses() и введите следующий комментарий:

    # Create a list of feature classes in the workspace

  8. После строки if sr.factoryCode == 2248: добавьте следующий комментарий в ту же строку:

     # WKID of target coordinate system

    Вы добавили комментарии для описания кода.

    Ниже показан полный код:

    # Author: your name
    # Date: the date
    # Purpose: This script reads all the feature classes in a
    # geodatabase and copies them to a new feature dataset in
    # a new geodatabase. Feature classes not already in the
    # target coordinate system are projected.
    
    # Imports
    import arcpy
    import os
    
    # Variables for paths, outputs, workspaces
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    
    # Create a new geodatabase and dataset
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    
    # Create a list of feature classes in the workspace
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        new_fc = os.path.join(mypath, new_gdb, fds, fc)
        if sr.factoryCode == 2248: # WKID of target coordinate system
            arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")
        else:
            arcpy.Project_management(fc, new_fc, 2248)
            print(f"The feature class {fc} has been projected.")

    Итоговый скрипт с комментариями

  9. Сохраните скрипт.

В этом руководстве вы узнали следующее:

  • Скрипты Python могут использоваться для автоматизации повторяющихся задач в рабочих процессах ГИС.
  • ArcPy содержит несколько функций для создания списков наборов данных.
  • Перечисляя и описывая наборы данных с помощью кода Python, вы можете создать подробный перечень наборов данных ГИС в рабочей области. Затем вы сможете обрабатывать каждый набор данных по-своему в зависимости от его характеристик.
  • Для обеспечения правильных выходных данных необходима тщательная работа с путями и именами файлов.

Вас также могут заинтересовать книги Python Scripting for ArcGIS Pro и Advanced Python Scripting for ArcGIS Pro автора Dr. Paul A. Zandbergen, опубликованные в Esri Press.