Нанесение на карту самых свежих данных

Кораллам для выживания необходимы водоросли. Слишком холодные или горячие температуры океана вызывают сокращение водорослей, выцветание кораллов до белого цвета и увеличение их уровня гибели. Программа наблюдения за коралловыми рифами NOAA Coral Reef Watch предоставляет данные о риске выцветания кораллов по всему миру. Эти данные часто обновляются.

На этом уроке мы будем использовать ArcGIS Pro и Python, чтобы получить самые свежие данные по выцветанию кораллов в виде файла JSON. Затем вы создадите на основании этих данных два класса пространственных объектов, измените их символы и опубликуете. На следующих уроках вы разработаете процедуру автоматизации обновлений, чтобы эти слои и сервисы автоматически обновлялись и новые данные становились доступными.

Импорт ArcPy и ArcGIS API for Python

Сначала вы создадите новый проект в ArcGIS Pro и измените его базовую карту. Затем вы воспользуетесь Python, чтобы импортировать ArcPy и ArcGIS API for Python.

ArcPy – это готовый пакет компонентов Python. С его помощью вы можете использовать Python для запуска инструментов геообработки и прочих функций ArcGIS. ArcGIS API for Python – это библиотека Python, которая также дает возможность выполнять ГИС-задачи в Python. Позже вы будете ее использовать для подключения к ArcGIS Online или ArcGIS Enterprise.

  1. Запустите ArcGIS Pro. Если будет предложено, войдите под лицензированной учетной записью ArcGIS (или порталу ArcGIS Enterprise при помощи учетной записи именованного пользователя).
    Примечание:

    Если у вас нет ArcGIS Pro, можно подписаться на бесплатную пробную версию ArcGIS. Если вы входите под учетной записью Enterprise, убедитесь, что ArcGIS Pro настроен на использование портала вашей организации.

  2. В разделе Пустые шаблоны щелкните Карта.

    Шаблон карты

  3. В окне Создать новый проект в опции Имя введите Coral Bleaching. Щелкните OK.

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

  4. На ленте щелкните вкладку Карта. В группе Слой щелкните Базовая карта, а затем Светло-серое полотно.

    Опция Светло-серое полотно

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

  5. На панели Содержание отключите слой World Light Gray Reference.

    Слой World Light Gray Reference отключен на панели Содержание

    Далее вы откроете окно Python.

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

  6. Щелкните вкладку Анализ на ленте. В группе Геообработка щелкните Python.

    Кнопка Python на вкладке Анализ

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

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

    Подсказка:

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

  7. Щелкните строку Python (это то, где написано Введите код Python здесь), введите print('Hello World!') и нажмите Enter.

    Окно транскрипта с функцией print

    Функция print() делает так, чтобы отображался заключенный в скобки текст. В данном случае, print() – это функция, а 'Hello World!' – это аргумент (переменная или входные данные функции).

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

    Функции возвращают значение в окне транскрипта. Операторы, с другой стороны, выполняют обработку без возврата значения. Для импорта модулей (таких как ArcPy) вы будете использовать оператор вместо функции. Сначала вы импортируете модуль sys. Этот модуль предоставляет несколько функций, специфичных для вашей системы.

  8. В строке ввода Python введите import sys и нажмите клавишу Enter.

    Модуль sys импортирован. Далее вы будете использовать атрибут version, чтобы показать вашу версию Python. Атрибуты – это свойства объектов Python (функций, переменных или констант). Их можно присоединять к объектам Python при помощи точки.

  9. Введите sys.version и нажмите Enter.

    Транскрипт со строками import sys и sys.version

    В данном случае, функция sys – это объект, а version – это атрибут.

    Транскрипт возвращает информацию о вашей версии Python. В нашем примере это версия 3.6.6. У вас может быть другая версия, в зависимости от версии ArcGIS Pro.

    При помощи ArcPy вы можете запускать инструменты геообработки ArcGIS из строки Python. Далее вы импортируете модуль arcpy точно так же, как импортировали модуль sys.

  10. В строке ввода Python введите import arcpy и нажмите клавишу Enter.

    Модуль arcpy импортирован.

  11. Введите help(arcpy) и нажмите Enter.

    Транскрипт со строками import arcpy и help(arcpy)

    Функция help() предоставляет информацию о заданном аргументе (arcpy). В данном случае, было добавлено большое количество информации. Вы можете изменить размеры окна Python, чтобы ее всю просмотреть.

    Далее вы импортируете ArcGIS API for Python, используя модуль arcgis.

  12. В строке ввода Python введите import arcgis и нажмите клавишу Enter.

    ArcGIS API for Python импортирован.

    Примечание:

    Если вы получили сообщение ModuleNotFoundError в процессе импортирования модуля arcgis, ArcGIS API for Python может быть не инсталлирован в вашем экземпляре ArcGIS Pro. Чтобы его установить, щелкните вкладку Проект и перейдите на вкладку Python. Щелкните Добавить пакеты и выполните поиск arcgis. В списке результатов щелкните пакет arcgis и щелкните Установить. Руководство по установке и настройке более подробно объясняет, как установить ArcGIS API for Python.

  13. Введите help(arcgis) и нажмите Enter.

    Транскрипт со строками import arcgis и help(arcgis)

    Отобразится информация о модуле arcgis.

Загрузить файл

Далее вы скачаете пространственные данные в формате JSON с сайта программы NOAA Coral Reef Watch. Эти данные будут содержать самую свежую информацию о риске выцветания кораллов.

Нужные данные размещены на сайте Coral Reef Watch. Чтобы их получить, вы используете несколько функций. Чтобы использовать эти функции, сначала надо импортировать нужные модули.

  1. В строке Python запустите следующую строку:
    import os, tempfile

    Импортируются модули os и tempfile. Также вы импортируете подмодуль request модуля urllib.

  2. Запустите следующую строчку:
    from urllib import request

    Подмодуль request включает функцию urlretrieve, которую вы будете использовать для получения данных. Для функции urlretrieve требуются две переменные: URL расположенного онлайн файла (url) и местоположение на компьютере, куда его надо сохранить (filename).

    В Python переменные задаются и присваиваются при помощи знака равенства (=). Чтобы задать переменную filename, вы запустите функцию os.path.join() для присоединения временной директории (temp_dir) и нужного имени файла. Чтобы задать временную директорию, вы запустите функцию tempfile.mkdtemp().

    Примечание:

    Переменная filename может быть любым путем, указывающим на местоположение на вашем компьютере. Но рекомендуется сохранять файл во временную директорию. Функция os.path.join() используется потому, что работает на любой операционной системе, независимо от символа, используемого для разделения папок в пути к файлу.

  3. Запустите следующие строчки (скопируйте, вставьте и запустите их все сразу):
    url = 'https://coralreefwatch.noaa.gov/vs/vs_polygons.json'
    temp_dir = tempfile.mkdtemp()
    filename = os.path.join(temp_dir, 'latest_data.json')
    response = request.urlretrieve(url, filename)

    В этих строчках заданы все необходимые переменные. Чтобы проверить путь к полученному файлу JSON, вы запустите функцию print с filename в качестве аргумента.

  4. Запустите следующую строчку:
    print(filename)

    Транскрипт, содержащий путь к самым свежим данным

    В примере на рисунке, последняя строчка – это путь к полученному файлу latest_data.json (у вас путь может отличаться). Вы можете скопировать имя файла и вставить в файловый менеджер на своем компьютере (например, Проводник Windows), чтобы открыть файл. Файл можно открыть в любом текстовом редакторе.

    Далее вы создадите переменную data_raw, чтобы представить данные в формате JSON. Вы будете использовать эту переменную каждый раз, когда будете ссылаться на данные JSON в строках кода. Чтобы создать эту переменную, вам надо импортировать модуль json, чтобы можно было запустить функцию json.load(). Вам также надо создать промежуточную переменную под названием json_file, которая откроет ваш файл.

  5. Запустите следующие строчки:
    import json
    json_file = open(filename)
    data_raw = json.load(json_file)

    Хотя в транскрипте ничего не произойдет, переменная json_file (ваш файл JSON) откроется и с ним загрузится переменная data_raw.

    Примечание:

    Переменная json_file останется открытой, пока не будет запущена команда json_file.close(). Альтернативный способ открыть этот файл – использовать выражение with. Это автоматически закроет файл после закрытия блока кода. В следующей строчке кода показано, как переменную json_file можно открыть при помощи выражения with:

    with open(filename) as json_file:
        data_raw = json.load(json_file)    # Do something with the 'data_raw' variable
    # Do something else outside the 'with' section. The json_file variable is now closed.

    Строчки, которые начинаются со знаков номера (#), это комментарии, которые не влияют на код, но предоставляюn пользователю информацию.

Создание слоев из файла

Чтобы визуализировать загруженные вами данные (и познакомиться с тем, как вы можете использовать Python для взаимодействия с пространственными данными), вы создадите два класса пространственных объектов на основе файла JSON.

Сначала вы создадите новую файловую базу геоданных, которая будет содержать классы пространственных объектов. Файл содержит данные для точечных и полигональных объектов, поэтому вы разделите его на два файла JSON, по одному для каждого типа объектов. Затем вы создадите класс пространственных объектов для каждого файла JSON и сохраните их в базе геоданных.

Как и функция urlretrieve, функция для создания базы геоданных (arcpy.management.CreateFileGDB) требует путь и имя. Вы также запустите функцию arcpy.env.workspace, чтобы установить базу геоданных в качестве рабочей области по умолчанию.

  1. На диске C вашего компьютера создайте папку с именем Temp.
  2. В строке Python запустите следующие строки:
    arcpy.management.CreateFileGDB(r'C:\Temp', 'Live.gdb')
    arcpy.env.workspace = os.path.join(r'C:\Temp', 'Live.gdb')

    База геоданных Live создается в папке Temp (вы можете открыть папку, чтобы убедиться). Затем вы создадите два словаря: один для точечных объектов (станций) и один для полигонов (области интереса, определенные NOAA).

    В Python словари – это совокупности неупорядоченных индексированных элементов. У создаваемых вами словарей будет по два элемента, как и требуется для формата файла GeoJSON. Элемент type будет относиться к типу геометрии в переменной data_raw (ваш JSON). Элемент features будет списком пространственных объектов. Сейчас список пуст, на что указывает пара квадратных скобок.

  3. Запустите следующие строчки:
    data_stations = dict(type=data_raw['type'], features=[])
    data_areas = dict(type=data_raw['type'], features=[])

    Транскрипт содержит строчки для создания словарей

    Словари созданы. Далее вы загрузите пространственные объекты в переменную data_raw в библиотеку data_stations или data_areas, в зависимости от типа геометрии.

    Теперь вы создадите цикл for. Цикл for выполняет функцию или выражение для каждого элемента в списке. Вы создадите циклов, проходящий через все пространственные объекты в переменной data_raw. Создав утверждение условия if, вы зададите тип геометрии для каждого пространственного объекта. Затем при помощи метода append() вы присоедините пространственные объекты с определенным типом геометрии к списку пространственных объектов соответствующей библиотеки.

  4. Запустите следующие строчки:
    for feat in data_raw['features']:
        if feat['geometry']['type'] == 'Point':
            data_stations['features'].append(feat)
        else: # elif feat['geometry']['type'] in ['MultiPolygon', 'Polygon']:        
            data_areas['features'].append(feat)
    Внимание:

    Организация Python Software Foundation рекомендует использовать пробелы вместо табуляторов в качестве отступов в начале строк кода. Не смешивайте табуляторы и пробелы в качестве отступов, иначе ваш код не будет работать правильно.

    Для каждого объекта в данных JSON, если тип геометрии – точка, объект будет добавлен в библиотеку data_stations. Если тип геометрии – полигон или мультиполигон, объект будет добавлен в библиотеку data_areas.

    Вы запустите функцию len(), используя список data_stations['features'], чтобы проверить, сколько объектов было загружено в список.

  5. Запустите следующую строчку:
    len(data_stations['features'])

    Транскрипт показывает функцию len() для подсчета станций

    Строчка возвращает число 213, указывающее, что там 213 точечных объектов. Полигональные объекты в JSON соответствуют областям интереса, определенным NOAA. Эти области периодически меняются, поэтому вы не сможете проверить их так же легко, как станции.

    Вместо этого вы получите доступ к названию и координатам десятого объекта в списке. В Python списки начинаются с 0 вместо 1, поэтому десятым объектом будет объект под номером 9.

  6. Запустите следующую строчку:
    data_areas['features'][9]['properties']['name']

    Транскрипт вернул имя десятого объекта.

  7. Запустите следующую строчку:
    data_areas['features'][9]['geometry']['coordinates']

    Транскрипт возвращает длинный список координат, соответствующий каждой из вершин полигона.

    Примечание:

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

    Транскрипт показывает имя и координаты объекта Beagle Gulf

    Далее вы сохраните словари как файлы JSON в той же временной директории, где и исходный файл JSON (temp_dir). Вы запустите функцию os.path.join(), которая создаст файловые пути к каждому новому JSON. Затем вы создадите выражения with и воспользуетесь функцией json.dump() для сохранения словарей как файлов JSON.

  8. Запустите следующие строчки: (комментарии добавлять не обязательно):
    # Filenames of temp json files 
    stations_json_path = os.path.join(temp_dir, 'points.json')
    areas_json_path = os.path.join(temp_dir, 'polygons.json')
    # Save dictionaries into json files
    with open(stations_json_path, 'w') as point_json_file:
        json.dump(data_stations, point_json_file, indent=4)
    with open(areas_json_path, 'w') as poly_json_file:
        json.dump(data_areas, poly_json_file, indent=4)

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

  9. Запустите следующую строчку:
    print(stations_json_path)
  10. Запустите следующую строчку:
    print(areas_json_path)
    Примечание:

    Ваш путь к файлу будет отличаться от нашего примера.

    Транскрипт с функциями print() для каждого файла JSON

    Каждый путь ведет в вашу папку Temp. Имена файлов points.json и polygons.json, как вы указали при запуске функции os.path.join(). Если хотите, можете скопировать каждый путь и открыть файлы в любом текстовом редакторе.

    Теперь файлы JSON созданы и вы запустите функцию arcpy.conversion.JSONToFeatures(), чтобы конвертировать их в классы пространственных объектов. Функции требуется путь к файлу JSON и имя создаваемого класса пространственных объектов.

  11. Запустите следующие строчки:
    # Convert JSON files to features
    arcpy.conversion.JSONToFeatures(stations_json_path, 'alert_stations') 
    arcpy.conversion.JSONToFeatures(areas_json_path, 'alert_areas')

    Классы пространственных объектов сохраняются в рабочей области по умолчанию, которую вы ранее указали как базу геоданных Live. Два слоя, alert_stations и alert_areas, добавляются на карту.

    Карта с указанием станций и районов

Изменение условных обозначений

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

Вы будете устанавливать символы слоев на основе уровня опасности, который варьируется от 0 до 4 в зависимости от зарегистрированного теплового стресса. Более низкие уровни опасности будут показаны синим, а более высокие – красным. Слои содержат текстовые поля для уровня опасности, но чтобы дать им градуированные символы, поля должны быть числовыми.

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

  1. В строке Python запустите следующие строки:
    # Add alert_level field
    arcpy.management.AddField('alert_stations', 'alert_level', 'SHORT', field_alias='Alert Level')
    arcpy.management.AddField('alert_areas', 'alert_level', 'SHORT', field_alias='Alert Level')

    К обоим слоям alert_stations и alert_areas добавлено поле alert_level. У обоих полей тип данных короткое целое число (числовой тип данных) и псевдоним Alert Level.

    Далее вы вычислите новые поля с помощью функции arcpy.management.CalculateField. Эта функция также принимает имя слоя и имя поля в качестве аргументов, как и выражение для вычисления поля. Ваше выражение будет использовать функцию int() для преобразования значений текстового поля alert в целые числа.

  2. Запустите следующие строчки:
    # Calculate alert_level field
    arcpy.management.CalculateField('alert_stations', 'alert_level', "int(!alert!)")
    arcpy.management.CalculateField('alert_areas', 'alert_level', "int(!alert!)")

    Поля будут вычислены.

    Подсказка:

    Если вы хотите убедиться, что поля были рассчитаны правильно, щелкните правой кнопкой мыши слой alert_stations или alert_areas и выберите Таблица атрибутов. Прокрутите до конца таблицы и убедитесь, что было добавлено поле Alert Level со значениями в диапазоне от 0 до 4.

    Далее вы измените символы для слоя alert_stations на основе нового поля. Сначала вы создадите переменные для представления текущего проекта (p) и карты (m). Вы также создадите переменные для слоя alert_stations (points_lyr) и его символов (points_sym).

  3. Запустите следующие строчки:
    # Symbology
    p = arcpy.mp.ArcGISProject("CURRENT")
    m = p.listMaps('Map')[0]
    # Points
    points_lyr = m.listLayers('alert_*')[0]
    points_sym = points_lyr.symbology

    Далее вы замените стандартную классификацию. В настоящее время символы отображаются на основании типа SimpleRenderer (единый символ). Чтобы установить другие символы на основании поля, вы измените способ отображения на GraduatedSymbolsRenderer (градуированные символы).

    Вы также настроите, чтобы использовать поле alert_level в качестве поля классификации и рассортировать данные по четырем классам (от 0 до 1, от 1 до 2, от 2 до 3 и от 3 до 4). Для каждого класса вы установите размер и цвет так, чтобы размеры увеличивались с повышением уровня опасности, а цвета менялись с синего на красный.

  4. Запустите следующие строчки:
    # Always change to the GraduatedSymbolsRenderer from the SimpleRenderer
    if points_sym.renderer.type != 'SimpleRenderer':
        points_sym.updateRenderer('SimpleRenderer')
    points_sym.updateRenderer('GraduatedSymbolsRenderer')
    points_sym.renderer.classificationField = 'alert_level'
    points_sym.renderer.breakCount = 4
    points_labels = ['0 - 1', '> 1 - 2', '> 2 - 3', '> 3 - 4']
    points_upperBounds = [1, 2, 3, 4]
    points_sizes = [6, 16.50, 27, 37.50] 
    layers_colors = [{'RGB': [5, 113, 176, 40]}, {'RGB': [146, 197, 222, 50]},
                       {'RGB': [244, 165, 130, 50]}, {'RGB': [202, 0, 32, 30]}]

    Далее вы создадите цикл for, чтобы применить заданные размеры и цвета для каждого класса. Ваши классы содержатся в числовом списке от 1 до 4. Вы будете использовать i (для целых чисел) в качестве переменной-заполнителя, представляющей перенумерованные классы.

  5. Запустите следующие строчки:
    for i in range(4):
        item = points_sym.renderer.classBreaks[i]
        item.symbol.applySymbolFromGallery('Circle', 1)
        item.label = points_labels[i]
        item.upperBound = points_upperBounds[i]
        item.symbol.size = points_sizes[i]
        item.symbol.color = layers_colors[i]

    Этот цикл будет перебирать все целые числа в указанном диапазоне (4). Для первого целого числа будут использоваться первая надпись, верхняя граница, размер и цвет в ранее созданных списках. Для второго целого числа будет использоваться вторая серия значений и так далее до конца диапазона.

    Наконец, вы запустите строку, чтобы обновить символы слоя на основе строк, которые вы запускали ранее.

  6. Запустите следующие строчки:
    # Update
    points_lyr.symbology = points_sym

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

    Карта с обновленными символами точек

    Используйте аналогичный код, чтобы изменить символы слоя alert_areas. Сначала вы создадите переменные для слоя (polygons_lyr) и его символов (polygons_sym).

  7. Запустите следующие строчки:
    # Polygons
    polygons_lyr = m.listLayers('alert_*')[1]
    polygons_sym = polygons_lyr.symbology

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

  8. Запустите следующие строчки:
    # Always change to the GraduatedSymbolsRenderer from the SimpleRenderer
    if polygons_sym.renderer.type != 'SimpleRenderer':
        polygons_sym.updateRenderer('SimpleRenderer') 
    polygons_sym.updateRenderer('GraduatedColorsRenderer')
    polygons_sym.renderer.classificationField = 'alert_level'
    polygons_sym.renderer.breakCount = 4
    polygons_labels = ['0 - 1', '> 1 - 2', '> 2 - 3', '> 3 - 4']
    polygons_upperBounds = [1, 2, 3, 4]
    layers_colors = [{'RGB': [5, 113, 176, 40]}, {'RGB': [146, 197, 222, 50]},
                       {'RGB': [244, 165, 130, 50]}, {'RGB': [202, 0, 32, 30]}]

    Наконец, вы создадите цикл, чтобы изменить надписи, размеры и цвета для каждого класса и обновить символы слоя.

  9. Запустите следующие строчки:
    for i in range(4):
        item = polygons_sym.renderer.classBreaks[i]
        item.label = polygons_labels[i]
        item.upperBound = polygons_upperBounds[i]
        item.symbol.color = layers_colors[i]
    # Update
    polygons_lyr.symbology = polygons_sym

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

    Карта с обновленными символами полигонов

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

Публикация слоев

Далее вы опубликуете слои в ArcGIS Online или на портале ArcGIS Enterprise.

  1. Убедитесь, что вы выполнили вход в свою учетную запись ArcGIS Online (или портал ArcGIS Enterprise с использованием учетной записи именованного пользователя).
    Примечание:

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

  2. На ленте щелкните вкладку Общий доступ. В группе Опубликовать как щелкните Веб-слой.

    Кнопка Веб-слой в группе Опубликовать как

  3. На панели Опубликовать как веб-слой установите следующие параметры:
    • В опции Имя введите Coral Reef Watch.
    • В опции Краткая информация введите NOAA's latest data for risk of coral bleaching.
    • В опции Теги введитеNOAA, Coral Bleaching и Alert Levels, нажимая Enter после каждого тега.
    • В поле Тип слоя убедитесь, что выбрана опция Объекты.

    Параметры информации об элементе и типа слоя

  4. Щелкните Анализировать.

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

  5. Щелкните Опубликовать.

    Инструмент запустится. В нижней части панели появится сообщение, что веб-слой успешно опубликован.

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

    Далее вы убедитесь, что слой успешно опубликован, добавив его на веб-карту.

  7. Выполните вход в свою учетную запись организации ArcGIS или на портал ArcGIS Enterprise.
  8. На ленте щелкните Ресурсы.

    Опция Ресурсы на ленте

    Два новых элемента появились у вас на странице Ресурсы: векторный слой и определение сервиса Coral Reef Watch.

  9. Для векторного слоя Coral Reef Watch щелкните кнопку опций (три точки) и выберите Открыть во вьюере карт.

    Опция Открыть во вьюере карт

    Откроется веб-карта с созданными слоями.

На этом уроке вы использовали Python для извлечения самых свежих данных программы Coral Reef Watch, преобразовали их в два класса пространственных объектов и настроили их символы. Затем вы опубликовали слои как сервис объектов. На следующем уроке вы разработаете подпрограмму автоматизации обновлений для автоматической загрузки самых свежих данных Coral Reef Watch, как только они станут доступны.


Создание подпрограммы автоматизации обновлений

На предыдущем уроке вы получили, нанесли на карту и опубликовали самые свежие данные из программы NOAA Coral Reef Watch. Эти данные показывают информацию об обесцвечивании кораллов в определенный момент времени, но данные часто обновляются. Как вы можете быстро обновлять карту каждый раз, как только NOAA обновляет свои данные?

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

Создать автономный скрипт

Вместо того, чтобы запускать ваш скрипт в ArcGIS Pro, как вы это делали на предыдущем уроке, вы создадите автономный скрипт в текстовом редакторе, который можно сохранить и запустить с помощью одной команды. Этот скрипт будет содержать вашу процедуру автоматизации обновлений и следовать методическим рекомендациям Aggregated Live Feed (ALF).

Методология ALF – это набор руководств, инструментов и функций, используемых для развертывания подпрограммы Live Feed в производственной среде. Его инструменты позволяют автоматизировать развертывание процедуры с минимальным контролем. Методология ALF включает этапы процедуры Live Feed и добавляет компоненты для улучшения общего рабочего процесса. Эти компоненты добавляют функциональные возможности для записи каждого шага в журнале, эффективного распаковывания файлов и автоматической отправки электронных писем в случае сбоя.

Примечание:

Чтобы более подробно узнать о методологии ALF, вы можете присоединиться к группе Aggregated Live Feed Community. Вы также можете скачать и просмотреть документ Aggregated Live Feed Methodologies.

  1. В простом текстовом редакторе откройте новый файл.
    Примечание:

    Если у вас нет простого текстового редактора, можете скачать Notepad++ бесплатно. Также вы можете использовать такие интегрированные среды разработки (integrated development environments – IDEs) для Python, как PyCharm, PyScripter, или Spyder. В примерах на рисунках к этому уроку использовался Notepad++.

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

  2. На ленте щелкните Файл и выберите Сохранить или Сохранить как. Сохраните файл на своем компьютере с именем coral_reef_exercise.py.
    Примечание:

    Процесс сохранения файла в формате Python (.py) может отличаться, в зависимости от используемой программы.

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

  3. В текстовом редакторе создайте строку import sys.

    Вы также определите новую функцию под названием feedRoutine, которая требует аргументы url (URL-адрес данных) и workGDB (путь к файловой базе геоданных, которую вы создали ранее). Позже вы определите эту функцию так, чтобы она выполняла шаги для извлечения и сопоставления данных, но сейчас вы будете использовать значение заполнителя pass вместо этих шагов.

    Кроме того, вы добавите выражение __name__ = "__main__", который позволяет запускать скрипт как отдельную подпрограмму (например, запустив его в командной строке). В этом случае автономный скрипт запустит функцию feedRoutine, передав ей аргументы url и workGDB из командной строки через выражение sys.argv[1:].

  4. Дважды нажмите Enter. Скопируйте и вставьте следующие строки, начиная со строки 3:
    def feedRoutine (url, workGDB):
        pass
    if __name__ == "__main__":
    	[url, workGDB] = sys.argv[1:]
    	feedRoutine (url, workGDB)
    Примечание:

    Отступы важны для правильной работы скрипта. Обязательно сохраните все отступы в скрипте. Не добавляйте ненужные отступы.

    Подпрограмма автоматизации обновлений с начальными выражениями

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

  5. Измените строку 1 (import sys) на import sys, arcpy, os, tempfile, json. Нажмите Enter и создайте строку from urllib import request в строке 2.

    Полностью строки должны выглядеть так:

    import sys, arcpy, os, tempfile, json
    from urllib import request

    Подпрограмма автоматизации обновлений со всеми модулями

    Далее вы начнете заменять заполнитель pass на шаги, необходимые для извлечения данных и создания слоев. Сначала вы зададите workGDB как базу геоданных по умолчанию (arpy.env.workspace) и создадите базу геоданных с помощью функции arcpy.management.CreateFileGDB.

  6. Замените строку 5 (pass) следующими строками:
    # workGDB and default workspace
        arcpy.env.workspace = workGDB 
        arcpy.management.CreateFileGDB(os.path.dirname(workGDB), os.path.basename(workGDB))
    Примечание:

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

    Подпрограмма автоматизации обновлений с заданной базой геоданных по умолчанию

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

  7. После строки 7 дважды нажмите Enter и удалите все отступы. Начиная со строки 9, скопируйте и вставьте следующие строки (включая отступы):
    ### Placeholder for retrieving and mapping data ###
        # Deployment Logic
        deployLogic()
        # Return
        return True
    def deployLogic():
        pass

    Подпрограмма автоматизации обновлений с логикой развертывания

    Примечание:

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

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

    Этот код не будет содержать код для изменения символов. Символы для слоев уже сохранены как в вашем проекте ArcGIS Pro, так и на веб-карте, поэтому вам не нужно будет снова менять символы. (Код для добавления и вычисления полей alert_level останется, потому что эти поля необходимы для существующих символов.)

    Кроме того, этот код будет включать несколько функций print(), которые включают выражения, которые будут держать вас в курсе, какие строки выполняются.

  8. Замените строку 9 (### Placeholder for retrieving and mapping data ###) следующими строками:
    # Download and split json file
        print("Downloading data...")
        temp_dir = tempfile.mkdtemp()
        filename = os.path.join(temp_dir, 'latest_data.json')
        response = request.urlretrieve(url, filename)
        with open(filename) as json_file:
            data_raw = json.load(json_file)
            data_stations = dict(type=data_raw['type'], features=[])
            data_areas = dict(type=data_raw['type'], features=[])
        for feat in data_raw['features']:
            if feat['geometry']['type'] == 'Point':
                data_stations['features'].append(feat)
            else:
                data_areas['features'].append(feat)
        # Filenames of temp json files
        stations_json_path = os.path.join(temp_dir, 'points.json')
        areas_json_path = os.path.join(temp_dir, 'polygons.json')
        # Save dictionaries into json files
        with open(stations_json_path, 'w') as point_json_file:
            json.dump(data_stations, point_json_file, indent=4)
        with open(areas_json_path, 'w') as poly_json_file:
            json.dump(data_areas, poly_json_file, indent=4)
        # Convert json files to features
        print("Creating feature classes...")
        arcpy.conversion.JSONToFeatures(stations_json_path, 'alert_stations') 
        arcpy.conversion.JSONToFeatures(areas_json_path, 'alert_areas')
        # Add 'alert_level ' field
        arcpy.management.AddField('alert_stations', 'alert_level', 'SHORT', field_alias='Alert Level')
        arcpy.management.AddField('alert_areas', 'alert_level', 'SHORT', field_alias='Alert Level')
        # Calculate 'alert_level ' field
        arcpy.management.CalculateField('alert_stations', 'alert_level', "int(!alert!)")
        arcpy.management.CalculateField('alert_areas', 'alert_level', "int(!alert!)")

    Далее вы добавите еще три функции print() в другие части скрипта, в том числе ту, которая информирует вас о завершении работы скрипта.

  9. После строки 5 (# workGDB and default workspace) нажмите Enter. В строке 6 удалите все имеющиеся отступы и создайте следующую строку:
    print("Creating workGDB...")

    Подпрограмма автоматизации обновлений с функцией print(), добавленной в блок workGDB

  10. После строки 43 (# Deployment Logic) нажмите Enter. В строке 44 удалите все имеющиеся отступы и создайте следующую строку:
    print("Deploying...")
  11. После строки 47 (# Return) нажмите Enter. В строке 48 удалите все имеющиеся отступы и создайте следующую строку:
    print("Done!")

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

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

    Если вы используете Notepad ++, вы можете автоматически преобразовывать табуляторы в пробелы. На ленте щелкните Редактировать, укажите Пакетные операции и выберите TAB to Space.

  13. Сохраните скрипт.
    Примечание:

    Если вы хотите проверить, что написали свой скрипт правильно, можете сравнить его с примером скрипта.

    Далее вы протестируете скрипт.

  14. Откройте меню Пуск Windows. Найдите и откройте командную строку Python.

    Сначала вы перейдете в каталог, в котором вы сохранили свой файл coral_reef_exercise.py.

    Примечание:

    В нашем примере файл coral_reef_exercise.py был сохранен в папке Documents (C:\Users\Documents). Вы можете получить путь к вашему файлу, перейдя к нему в файловом менеджере, таком как Проводник Windows, и скопировав путь из верхней части окна.

  15. В командной строке Python введите cd и нажмите пробел. Вставьте путь к директории, где сохранили файл Python. Если путь содержит пробелы, заключите его в кавычки.

    Командная строка Python с командой для изменения директории

  16. Нажмите Enter.

    Директория изменится. Далее вы запустите скрипт. Вы будете использовать команду python и включите имя файла, URL-адрес веб-сайта с данными о коралловых рифах, а также путь и имя базы геоданных.

  17. Запустите следующую команду:

    python coral_reef_exercise.py https://coralreefwatch.noaa.gov/vs/vs_polygons.json C:\Temp\Work.gdb

    Выполнение команды занимает несколько секунд. По мере выполнения вы будете получать информацию о его продвижении по функциям print().

    Командная строка Python с автономным скриптом

    Слои в базе геоданных Work обновляются с использованием самых свежих данных (которые, вероятно, совпадают с данными, которые вы использовали в предыдущем уроке). Сейчас скрипт не обновляет слои, которые появляются на карте в вашем проекте ArcGIS Pro или на веб-карте. Вы добавите эту функциональность позже, используя функцию deployLogic().

Добавить расширенную функциональность скрипта

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

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

  1. Если надо, откройте свой скрипт coral_reef_exercise в текстовом редакторе.
  2. Замените строки с 5 по 8 (строки для создания рабочего пространства по умолчанию) следующими строками:
    # Create workGDB and default workspace
        print("Starting workGDB...")
        arcpy.env.workspace = workGDB
        if arcpy.Exists(arcpy.env.workspace):
            for feat in arcpy.ListFeatureClasses ("alert_*"):   
                arcpy.management.Delete(feat)
        else:
            arcpy.management.CreateFileGDB(os.path.dirname(workGDB), os.path.basename(workGDB))

    Расширенный скрипт для проверки существующей workGDB

    Если скрипт выполняется на компьютере без доступа к Интернету, он не сможет загрузить онлайн-файл JSON. Чтобы поймать эту распространенную ошибку, вы вызовете стандартное исключение URLError, которое информирует пользователя о том, что URL недоступен.

  3. Замените строку 18 (response = request.urlretrieve(url, filename)) следующими строками:
    try:
            response = request.urlretrieve(url, filename)
        except URLError:
            raise Exception("{0} not available. Check internet connection or url address".format(url))

    Расширенный скрипт для вызова URLError

    Далее вы запишете шаги выполнения в файл журнала. Вы уже печатаете сообщения о каждой части скрипта в командной строке, поэтому вы добавиете функцию logging.info() после каждой функции print(). Эта функция регистрирует сообщения, которые могут быть полезны для отладки, если в скрипте возникают ошибки. Сообщения, которые вы регистрируете, будут содержать дату и время регистрации сообщения.

    Сначала вы измените свой скрипт, чтобы импортировать модули logging и datetime. Вы также импортируете исключение URLError, которое использовали ранее.

  4. Замените строки 1 и 2 (строки импорта) следующими строками:
    import sys, os, tempfile, json, logging, arcpy
    import datetime as dt
    from urllib import request
    from urllib.error import URLError

    Далее вы будете использовать функцию logging.basicConfig() для настройки файла журнала, в который будут записываться сообщения. Вы также установите переменную log_format, определяющую как будут отображаться дата и время.

  5. После строки 6 (def feedRoutine) добавьте следующие строки:
    # Log file
        logging.basicConfig(filename="coral_reef_exercise.log", level=logging.INFO)
        log_format = "%Y-%m-%d %H:%M:%S"

    Расширенный скрипт для конфигурирования журнала

    Далее вы добавите функции logging.info(), которые добавляют сообщения в журнал. Эти функции будут записывать дату и время с помощью функции dt.datetime.now() и форматировать дату и время, используя переменную log_format, которую вы ранее создали. Вы добавите эти функции после каждой функции print().

  6. После строки 11 (print("Starting workGDB...")) добавьте следующую строку:
    logging.info("Starting workGDB... {0}".format(dt.datetime.now().strftime(log_format)))
  7. После строки 21 (print("Downloading data...")) добавьте следующую строку:
    logging.info("Downloading data... {0}".format(dt.datetime.now().strftime(log_format)))
  8. После строки 47 (print("Creating feature classes...")) добавьте следующую строку:
    logging.info("Creating feature classes... {0}".format(dt.datetime.now().strftime(log_format)))
  9. После строки 59 (print("Deploying...")) добавьте следующую строку:
    logging.info("Deploying... {0}".format(dt.datetime.now().strftime(log_format)))
  10. После строки 64 (print("Done!")) добавьте следующую строку:
    logging.info("Done! {0}".format(dt.datetime.now().strftime(log_format)))

    Вы также запишете в журнал исключение URLError при помощи функции logging.exception().

  11. После строки 27 (except URLError) добавьте следующие строки:
    logging.exception("Failed on: request.urlretrieve(url, filename) {0}".format(
                              dt.datetime.now().strftime(log_format)))

    Наконец, вы закроете файл журнала в конце скрипта с помощью функции logging.shutdown().

  12. В конце строки 63 дважды нажмите Enter и удалите все отступы в новых строках. В строке 65 добавьте следующие строки:
    # Close Log File
        logging.shutdown()

    Расширенный скрипт для закрытия файла журнала

  13. Убедитесь, что ваш скрипт не содержит знаков табуляции в качестве отступов. Сохраните скрипт.
    Примечание:

    Если вы хотите проверить, что написали свой скрипт правильно, можете сравнить его с примером скрипта.

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


Обновление локальных классов пространственных объектов

На предыдущем уроке вы создали подпрограмму автоматизации обновлений. После запуска эта подпрограмма автоматизации обновлений скачивает самые свежие данные по выцветанию кораллов с сайта NOAA и создает два класса пространственных объектов: один для точечных, а другой для полигональных данных. Эти классы объектов находятся в базе геоданных Work. Но этот скрипт не обновляет слои в проекте ArcGIS Pro, которые находятся в базе геоданных Live.

На этом уроке вы адаптируете подпрограмму автоматизации обновлений так, чтобы она автоматически обновляла слои alert_stations и alert_areas в проекте ArcGIS Pro.

Определите функцию логики развертывания

Ваша подпрограмма автоматизации обновлений содержит скрипт-заполнитель для логической функции развертывания под именем deployLogic(). В методологии ALF логический процесс развертывания является частью подпрограммы автоматизации обновлений, которая берет последнюю информацию, полученную из Интернета (в вашем случае, это данные, расположенные в базе геоданных Work) и перезаписывает на живые данные (классы объектов, хранящиеся в базе геоданных Live).

  1. Создайте копию своего скрипта coral_reef_exercise.py под названием coral_reef_exercise_online.py. Откройте эту копию в текстовом редакторе или Python IDE.

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

  2. В скрипте coral_reef_exercise_local.py в строке 1 добавьте shutil в список модулей.

    Функция импорта с модулем shutil

    Далее вы добавите третий аргумент в подпрограмму автоматизации обновлений под именем liveGDB, которая будет представлять базу геоданных Live, в которой хранятся слои вашего проекта.

  3. В строке 6 добавьте liveGDB в список аргументов feedRoutine.

    Подпрограмма автоматизации обновлений с аргументом liveGDB

    Вы также добавите этот аргумент в команду sys.argv[1:] в конце скрипта. Таким образом, пользователи смогут указать путь и имя базы геоданных Live при запуске скрипта в командной строке.

  4. В строке 77 добавьте liveGDB в список аргументов в квадратных скобках. В строке 78 добавьте liveGDB в список аргументов feedRoutine.

    Подпрограмма автоматизации обновлений с дополнительными аргументами liveGDB

    Функция deployLogic() будет принимать два аргумента, workGDB и liveGDB, поэтому вы добавите эти аргументы туда, где функция вызывается и где она определена.

  5. В строках 63 и 73 замените deployLogic() на deployLogic(workGDB, liveGDB).

    Подпрограмма автоматизации обновлений с аргументами deployLogic()

    Далее вы зададите функцию deployLogic(). Вы будете использовать цикл for, чтобы скопировать все элементы в аргументе workGDB и использовать их для замены элементов в аргументе liveGDB. Вы будете использовать функцию os.walk() для вывода списка файлов и функцию shutil.copy2() для их копирования и замены. В соответствии с методологией ALF, у вас также будет скрипт, чтобы игнорировать все файлы .lock.

  6. В строке 74 замените pass (заполнитель) следующими строками:
    for root, dirs, files in os.walk(workGDB, topdown=False):
    	    files = [f for f in files if '.lock' not in f]
    	    for f in files:
    	        shutil.copy2(os.path.join(workGDB, f), os.path.join(liveGDB, f))

    Скрипт, задающий функцию deployLogic()

    Примечание:

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

  7. Убедитесь, что ваш скрипт не содержит знаков табуляции в качестве отступов. Сохраните скрипт.
    Примечание:

    Если вы хотите проверить, что написали свой скрипт правильно, можете сравнить его с примером скрипта.

Запуск автономного скрипта

Далее вы запустите адаптированную подпрограмму автоматизации обновлений и обновите свой проект ArcGIS Pro.

Скорее всего, NOAA не обновляло данные после того, так как вы отобразили последние данные в своем проекте. Если вы запустите скрипт сейчас, то, вероятно, не увидите никаких изменений в данных. Чтобы проверить правильность работы скрипта, вы обновите данные, используя исторический файл, размещенный в Learn ArcGIS.

  1. Если необходимо, откройте ваш проект Coral Bleaching в ArcGIS Pro.
  2. Если надо, откройте командную строку Python и используйте команду cd, чтобы перейти в каталог, в котором сохранен файл coral_reef_exercise_local.py.
  3. В командной строке запустите следующую команду:

    python coral_reef_exercise_local.py https://downloads.esri.com/LearnArcGIS/update-real-time-data-with-python/vs_polygons.json C:\Temp\Work.gdb C:\Temp\Live.gdb

    Команда запустится.

    Командная строка Python с запущенной командой

    Примечание:

    Когда программа NOAA Coral Reef Watch обновит свои данные, вы сможете заменить этот URL к историческому файлу (https://downloads.esri.com/LearnArcGIS/update-real-time-data-with-python/vs_polygons.json) на URL к данным NOAA (https://coralreefwatch.noaa.gov/vs/vs_polygons.json).

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

  4. Закройте ArcGIS Pro (сохраните, если будет предложено). Снова откройте свой проект Coral Bleaching.

    Перезапуск ArcGIS Pro также мог обновить отображение карты. Если этого не произошло, вы можете обновить отображение вручную.

  5. Если надо, в правом нижнем углу представления Карта щелкните кнопку Обновить.

    Кнопка Обновить

    Карта обновится и отобразит исторические данные (за 19 февраля 2019 г.).

    Карта с историческими данными

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

  6. На карте щелкните любую станцию ​​или область.

    Откроется всплывающее окно объекта. В поле date написано 2019-02-19, дата исторических данных.

    Всплывающее окно с исторической датой

  7. Закройте всплывающее окно.

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


Обновление онлайн-сервиса объектов

На предыдущем уроке вы разработали и запустили подпрограмму автоматизации обновлений для обновления локальных классов объектов в вашем проекте ArcGIS Pro. На этом уроке вы выполните аналогичный процесс, чтобы разработать и запустить подпрограмму автоматизации обновлений, которая будет обновлять онлайн-сервис объектов на веб-карте.

Получить определение сервиса и ID

При обновлении локального класса пространственных объектов вы использовали базу геоданных Live в качестве места, в которое будут скопированы новые данные. Онлайн-сервисы объектов не хранятся в базах геоданных, поэтому вместо этого вам понадобится файл определения сервиса и идентификатор элемента для запроса и замены сервиса объектов при помощи ArcGIS API for Python.

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

  1. Если надо, выполните вход в свою учетную запись организации ArcGIS или на портал ArcGIS Enterprise.
  2. Перейдите на страницу Ресурсы и перейдите в папку, где находится векторный слой Coral Reef Watch и файл определения сервиса.
    Примечание:

    Файл определения сервиса был создан при публикации слоя. Поскольку вы будете использовать этот файл для обновления сервиса объектов, при обновлении будут потеряны все изменения, внесенные в сервис объектов после его публикации (например, метаданные или изменения символов). Это также повлияет на все веб-карты или приложения, использующие этот сервис объектов.

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

  3. Для файла определения сервиса Coral Reef Watch щелкните кнопку с опциями (три точки) и выберите Загрузить.

    Загрузить файл определения сервиса

    Файл определения сервиса (.sd) загрузится на ваш компьютер.

  4. Скопируйте файл определения сервиса в папку Temp на диске C.

    Далее вы скопируете идентификатор элемента слоя.

  5. Для векторного слоя Coral Reef Watch щелкните кнопку опций и выберите Просмотр информации об элементе.

    Откроется страница информации об элементе векторного слоя. Идентификатор находится в URL.

  6. В URL-адресе страницы информации скопируйте последовательность цифр и букв, следующую после id= (в примере изображения это строка 2dcf249f5cd54a609d51acba6e0ba029).
    Примечание:

    Идентификатор вашего векторного слоя будет отличаться.

    Идентификатор элемента для векторного слоя

  7. Вставьте идентификатор в пустой текстовый файл или куда-нибудь, где вы его легко сможете найти.

Определите функцию логики развертывания

Далее вы сделаете еще одну копию вашей исходной программы автоматизации обновлений. Затем вы определите функцию deployLogic() с помощью скрипта, который заменяет онлайн-сервис объектов загруженными данными из базы геоданных Work.

  1. Создайте копию вашего исходного скрипта coral_reef_exercise.py под именем coral_reef_exercise_online.py. Откройте эту копию в текстовом редакторе или Python IDE.

    Для создания скрипта вам понадобятся модули fnmatch, shutil, subprocess и arcgis, а также подмодуль GIS.

  2. В скрипте coral_reef_exercise_online.py в строке 1 добавьте в список модулей fnmatch, shutil, subprocess и arcgis. Нажмите Enter и добавьте строку from arcgis.gis import GIS в строке 2.

    Полностью строки читаются следующим образом:

    import sys, os, tempfile, json, logging, arcpy, fnmatch, shutil, subprocess, arcgis
    from arcgis.gis import GIS

    Подпрограмма автоматизации обновлений со строками для импорта модулей и подмодулей

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

  3. В строке 7 добавьте itemid, original_sd_file и service_name в список аргументов feedRoutine.

    Полностью строка читается следующим образом:

    def feedRoutine (url, workGDB, itemid, original_sd_file, service_name):

    Аргументы добавлены в функцию feedRoutine

    Вы также добавите эти параметры в команду sys.argv[1:] в конце скрипта.

  4. В строках 78 и 79 добавьте itemid, original_sd_file и service_name в оба списка аргументов.

    Полностью строки читаются следующим образом:

    [url, workGDB, itemid, original_sd_file, service_name] = sys.argv[1:]
        feedRoutine (url, workGDB, itemid, original_sd_file, service_name)

    Аргументы добавлены в команду sys.argv[1:]

    Вы также добавите эти аргументы (и аргумент workGDB) в функцию deployLogic(), где они определяются и вызываются.

  5. В строках 64 и 74 замените deployLogic() на deployLogic(workGDB, itemid, original_sd_file, service_name).

    Аргументы для функции deployLogic, где они определяются и вызываются.

    Далее вы зададите функцию deployLogic(). Эта функция будет выполнять несколько задач. Сначала она получит элемент сервиса объектов из ArcGIS Online или вашего портала ArcGIS Enterprise (представлено аргументом itemid) при помощи функции gis.content.get().

    Вы также создадите переменную gis, заданную функцией GIS(). Аргументы этой функции будут включать URL-адрес портала вашей организации (для ArcGIS Online URL-адрес будет https://arcgis.com), имя пользователя и пароль вашей учетной записи.

  6. В строке 75 замените заполнитель (pass) следующими строками:
    # Get item from ArcGIS Online
        gis = GIS(url='https://arcgis.com', username='your_username', password='your_password')
        item = gis.content.get(itemid)
        sd_file_name = os.path.basename(original_sd_file)
        if sd_file_name != item.related_items("Service2Data")[0].name:
            raise Exception('Erroneous itemid, service name, or original sd file'.format(itemid))
    Примечание:

    Если вы используете учетную запись ArcGIS Online, параметр url является необязательным.

  7. В строке 76 замените параметры username и password на имя пользователя и пароль вашей учетной записи ArcGIS. Если используется учетная запись портала ArcGIS Enterprise, замените параметр url URL-адресом вашего портала.
    Внимание:

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

    Далее функция deployLogic() распакует содержимое файла определения сервиса (original_sd_file). Это будет сделано с помощью 7-Zip, программы, которая поставляется по умолчанию со многими компьютерами Windows. Прежде чем добавить скрипт, который будет использовать 7-Zip для распаковки файла, убедитесь, что он есть у вас на компьютере, и добавьте его в параметр среды Path в Windows. Добавив его в эту параметр среды, вы сможете вызывать программу, используя свой скрипт.

  8. Если надо, скачайте соответствующую версию 7-Zip для вашего компьютера и установите ее.

    Процесс редактирования параметров среды зависит от вашей операционной системы, но обычно это можно сделать через окно Параметры среды.

  9. Откройте на вашем компьютере Панель управления. Щелкните Система и безопасность, затем Система и Расширенные параметры системы. В окне Свойства системы щелкните Переменные среды. (Точный путь может немного отличаться, в зависимости от вашей операционной системы.)
  10. В окне Переменные среды для Переменные системы выберите переменную Путь и щелкните Редактировать.

    В зависимости от операционной системы, откроется окно Edit environment variable или Edit System Variable. Процесс добавления новых переменных отличается для каждого окна.

  11. Если откроется окно Edit environment variable, щелкните Новый и добавьте C:\Program Files\7-Zip в качестве новой переменной. Если откроется окно Edit System Variable, прокрутите до конца параметра Variable value и вставьте ;C:\Program Files\7-Zip в конце (убедитесь, что вы не удалили никакой имеющийся там текст).
  12. Щелкните OK. В окне Environment Variables щелкните OK.

    Далее вы создадите скрипт. Он будет содержать сообщение об ошибке, которое возникает, если 7-Zip не будет найден в переменной среды Path.

  13. В скрипте coral_reef_exercise_online.py после строки 80 добавьте следующие строки:
    # Unpack original_sd_file using 7-zip
        path_7z = fnmatch.filter(os.environ['path'].split(';'), '*7-Zip')
        temp_dir = tempfile.mkdtemp()
        if len(path_7z):
            exe_7z = os.path.join(path_7z[0], '7z.exe')
            call_unzip = '{0} x {1} -o{2}'.format(exe_7z, original_sd_file, temp_dir)
        else:
            raise Exception('7-Zip could not be found in the PATH environment variable')
        subprocess.call(call_unzip)

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

    Ваш скрипт будет использовать функцию shutil.rmtree() для удаления Live.gdb и функцию os.mkdir() для его повторного создания, удаляя все существующее в базе геоданных содержимое.

  14. После строки 89 добавьте следующие строки:
    # Replace Live.gdb content
        liveGDB = os.path.join(temp_dir, 'p20', 'live.gdb')
        shutil.rmtree(liveGDB)
        os.mkdir(liveGDB)
        for root, dirs, files in os.walk(workGDB):
            files = [f for f in files if '.lock' not in f]
            for f in files:
                shutil.copy2(os.path.join(workGDB, f), os.path.join(liveGDB, f))

    Затем скрипт заархивирует Live.gdb в новый файл определения сервиса под названием updated_sd.

  15. После строки 97 добавьте следующие строки:
    # Zip file
        os.chdir(temp_dir)
        updated_sd = os.path.join(temp_dir, sd_file_name)
        call_zip = '{0} a {1} -m1=LZMA'.format(exe_7z, updated_sd)
        subprocess.call(call_zip)

    Наконец, скрипт будет использовать метод элемента manager (arcgis.features.FeatureLayerCollection.fromitem(item).manager), чтобы перезаписать сервис объектов с новыми данными.

  16. После строки 102 добавьте следующие строки:
    # Replace file
        manager = arcgis.features.FeatureLayerCollection.fromitem(item).manager
        status = manager.overwrite(updated_sd)
        # Return
        return True
  17. Убедитесь, что ваш скрипт не содержит знаков табуляции в качестве отступов. Сохраните скрипт.
    Примечание:

    Если вы хотите проверить, что вы написали свой скрипт правильно, вы можете сравнить его с примером скрипта.

Запуск автономного скрипта

Далее вы запустите подпрограмму автоматизации обновлений в командной строке Python и обновите онлайн-сервис объектов Coral Reef Watch. Как и в предыдущем уроке, для целей этого упражнения вы обновите сервис объектов, используя исторические данные.

  1. Если надо, в ArcGIS Online или на портале ArcGIS Enterprise откройте в Map Viewer векторный слой Coral Reef Watch.
  2. Если надо, откройте командную строку Python и используйте команду cd, чтобы перейти в каталог, в котором сохранен файл coral_reef_exercise_local.py.
    Примечание:

    Если вы добавили 7-Zip в переменную среды Path, вам может потребоваться перезапустить командную строку Python.

  3. Вставьте следующую команду (пока не запускайте ее):

    python coral_reef_exercise_online.py https://downloads.esri.com/LearnArcGIS/update-real-time-data-with-python/vs_polygons.json C:\Temp\Work.gdb

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

  4. В конце команды нажмите пробел и вставьте идентификатор элемента для векторного сервиса.
    Примечание:

    Идентификатор элемента представляет собой строку букв и цифр, находящуюся в URL-адресе векторного сервиса, например 2dcf249f5cd54a609d51acba6e0ba029.

    Ранее вы загрузили исходный файл определения сервиса и скопировали его в папку Temp. Имя сервиса – Coral_Reef_Watch.

  5. Нажмите пробел и вставьте C:\Temp\Coral_Reef_Watch.sd Coral_Reef_Watch.

    Полностью ваша команда должна иметь следующий формат (но с другим идентификатором элемента):

    python coral_reef_exercise_online.py https://downloads.esri.com/LearnArcGIS/update-real-time-data-with-python/vs_polygons.json C:\Temp\Work.gdb 2dcf249f5cd54a609d51acba6e0ba029 C:\Temp\Coral_Reef_Watch.sd Coral_Reef_Watch

    Пример команды в Командной строке Python

  6. Запустите команду.

    Команда запустится. Командная строка возвращает много информации о 7-Zip и извлекаемых данных. По завершении выполнения команды, командная строка возвращает строку Done.

    Командная строка возвращает Готово

    Далее вы визуализируете изменения на своей веб-карте.

  7. Обновите веб-карту с помощью кнопки Обновить в браузере или команды Обновить в интерфейсе.

    Карта обновлена ​​данными за 19 февраля 2019 года.

    Готовая карта с данными за 19 февраля 2019 года

  8. Щелкните какую-нибудь станцию или область, чтобы открыть всплывающее окно.

    Поле date показывает 2019-02-19, значит данные были обновлены правильно.

    Поле даты во всплывающем окне

  9. Закройте всплывающее окно. Закройте веб-карту без сохранения изменений. (Либо сохраните веб-карту, если хотите.)

На этом уроке вы создали подпрограммы автоматизации обновлений для автоматического обновления локальных и веб-слоев с использованием самых свежих данных NOAA. На уроке также были представлены как простые, так и продвинутые, темы по Python и использовалась методология ALF для разработки и реализации подпрограммы автоматизации обновлений. Для целей урока вы использовали исторические данные для обновления слоев, но вы можете запустить этот же скрипт, используя URL-адрес данных NOAA.

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

Еще больше уроков вы найдете в Галерее уроков Learn ArcGIS.