Сетевой анализ

В Python вы можете выполнять сетевой анализ с помощью модуля Network Analyst, arcpy.nax. Этот модуль позволяет применять 6 типов анализа. Для каждого типа анализа (также называемого расчетом) вы работаете с двумя объектами, определенными для этого анализа: объект, который позволяет инициализировать анализ, задавать параметры анализа, загружать входные данные и выполнять анализ, и другой объект, который позволяет работать с результатами анализа после его выполнения.

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

См. полный список свойств и методов для объекта анализа ServiceArea и объекта результата ServiceAreaResult.

Примечание:

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

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

  1. Инициализация анализа.
  2. Настройка свойств для анализа.
  3. Загрузка входных данных.
  4. Расчет анализа.
  5. Работа с результатами.

Инициализация анализа

Для запуска анализа вы должны указать дорожную сеть. Ниже перечислены опции для дорожной сети:

  • Набор сетевых данных - для этой опции необходим дополнительный модуль ArcGIS Network Analyst extension и набор сетевых данных. Вы можете указать набор сетевых данных, используя его полный путь к каталогу или имя слоя набора сетевых данных, созданного из набора сетевых данных с помощью функции MakeNetworkDatasetLayer.
  • Сервис портала - для этой опции требуется учетная запись ArcGIS Online с правами на построение маршрутов и достаточным количеством кредитов или портал с настроенным сервисом построения маршрутов ArcGIS Enterprise. Перед запуском скрипта необходимо войти на портал.
Подсказка:

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

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

import arcpy
nd_path = "C:/data/NorthAmerica.gdb/Routing/Routing_ND"
nd_layer_name = "NorthAmerica"

# Create a network dataset layer. The layer will be referenced using its name.
arcpy.nax.MakeNetworkDatasetLayer(nd_path, nd_layer_name)

# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea(nd_layer_name)

В следующем фрагменте кода показано, как инициализировать анализ области обслуживания с использованием ArcGIS Online:

import arcpy

# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea("https://www.arcgis.com/")

В следующем фрагменте кода показано, как инициализировать анализ области обслуживания с использованием портала с настроенным ArcGIS Enterprise routing services:

import arcpy

# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea("https://myportal.mysite.com/portal/")

Настройка свойств для анализа

После инициализации анализа необходимо задать свойства для анализа. Чтобы определить свойства, поддерживаемые объектом анализа, и понять, как данное свойство может влиять на анализ, см. раздел справки по конкретному объекту (доступен в категории Классы справки). Многие свойства задаются с помощью объектов перечисления Python, набора символических имен, представляющих некоторые постоянные значения. Например, единицы времени для анализа могут быть установлены как минуты с помощью элемента Minutes из перечисления arcpy.nax.TimeUnits. В разделе справки для объекта описывается, должно ли свойство быть задано как перечисление. Также указывается имя используемого перечисления.

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

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

# Get the desired travel mode for the analysis.
nd_travel_modes = arcpy.nax.GetTravelModes(nd_layer_name)
travel_mode = nd_travel_modes["Driving Time"]

# Set properties.
service_area.timeUnits = arcpy.nax.TimeUnits.Minutes
service_area.defaultImpedanceCutoffs = [5, 10, 15]
service_area.travelMode = travel_mode
service_area.outputType = arcpy.nax.ServiceAreaOutputType.Polygons
service_area.geometryAtOverlap = arcpy.nax.ServiceAreaOverlapGeometry.Split

Загрузка входных данных

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

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

Узнать больше о загрузке входных данных для анализа

Расчет анализа

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

Если анализ не нашел никаких результатов, например, если маршрут не может быть найден между входными остановками, метод solve не вызывает исключение Python. Чтобы определить, дал ли анализ допустимый результат, используйте свойство solveSucceeded объекта результата.

Лицензия:

Если источник сетевых данных представляет собой локальный набор сетевых данных, а не URL-адрес сервиса, для успешной работы solve требуется лицензия ArcGIS Network Analyst extension. Проверьте эту лицензию до вызова метода solve.

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

# Check out the Network Analyst extension license.
arcpy.CheckOutExtension("network")

# Solve the analysis.
result = service_area.solve()

Работа с результатами

После выполнения анализа для работы с результатами используется объект результата, полученный из метода solve. Объект результата позволяет определить, был ли анализ успешным или неудачным (с использованием свойства solveSucceeded), а также было ли получено частичное решение (с использованием свойства isPartialSolution). Если анализ не удался, можно определить причину с помощью метода solverMessages.

В следующем фрагменте кода показано, как выполнить анализ и экспортировать результаты в класс пространственных объектов:

# Solve the analysis.
result = service_area.solve()

# Export the results to a feature class. If the analysis failed print all the 
# messages.
if result.solveSucceeded:
    result.export(arcpy.nax.ServiceAreaOutputDataType.Polygons, output_polygons)
else:
    arcpy.AddError("Analysis failed")
    # Print all the warning messages.
    for message in result.solverMessages(arcpy.nax.MessageSeverity.Warning):
        arcpy.AddWarning(message[-1])
    # Print all the error messages.
    for message in result.solverMessages(arcpy.nax.MessageSeverity.Error):
        arcpy.AddError(message[-1])

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

Узнать больше о доступе к результатам анализа