Пользовательские оценки позволяют изменять значения стоимости и ограничений для сетевых элементов во время операции расчета с помощью скрипта Python. Они могут запрашивать базовое значение элемента и обновлять его по мере необходимости или задавать другое значение на основе других входных данных. Это позволяет вам задавать значения атрибутов во время расчета без обновления базового набора сетевых данных или исходных объектов.
Более подробно о сетевых атрибутах и оценках
Пользовательскую оценку можно использовать в следующих случаях:
- Масштабирование стоимости улиц на основе запроса таблицы в другой базе данных.
- Ограничение объектов улиц на основе чтения идентификатора объекта из внешнего файла.
- Динамическое масштабирование стоимости улиц в зависимости от времени суток.
Для реализации пользовательских оценок создайте класс Python, который наследуется от класса arcpy.nax.AttributeEvaluator, и связывания класса Python с определенным набором сетевых данных. Они могут быть связаны с атрибутами стоимости, ограничения или дескриптора. Они могут обновлять ребра, соединения или повороты как для операций расчета с поддержкой времени, так и для операций расчета, для которых время не включено. В зависимости от внесенных изменений обновления могут изменить затраты и пути, обнаруженные в ходе анализа.
С отдельным сетевым атрибутом должна быть связана только одна пользовательская оценка, но любое количество сетевых атрибутов может быть связано с оценкой. При реализации пользовательской оценки ряд объектов можно использовать для сбора информации о сети и элементах, таких как Attribute, Edge, Junction и др.
Класс пользовательской оценки
Чтобы создать пользовательскую оценку, задайте класс, который наследуется от класса arcpy.nax.AttributeEvaluator и реализует по крайней мере один из методов значения элемента (например edgeValue или edgeValueAtTime). Также можно создать пользовательскую оценку для реализации методов __init__, attach и refresh.
Методы пользовательской оценки
В подразделах ниже описываются методы, которые можно использовать для задания значений атрибутов во время расчета.
Initializer
Вы можете реализовать метод initializer __init__. Если он реализован, метод initializer базового класса должен быть вызван явным способом перед добавлением логики инициализации. Иначе метод initializer базового класса вызывается автоматически.
Метод initializer базового класса будет использовать переданное имя атрибута и имена источников для задания свойств self.attributeName и self.sourceNames для объекта.
class CustomEvaluatorExample(arcpy.nax.AttributeEvaluator):
"""Example custom evaluator."""
def __init__(self, attributeName, sourceNames=None):
"""Example initializer."""
super().__init__(attributeName, sourceNames)
# Do additional custom initialization
Attach
Когда пользовательская оценка связана с сетевым набором данных, вызывается внутренний метод attach. Внутренний код запрашивает атрибуты сетевого набора данных для получения указанного имени атрибута. Если имя атрибута найдено, свойству self.attribute присваивается значение индекса атрибута; в противном случае пользовательская оценка не связывается с сетевым набором данных и никакие другие методы класса не вызываются (включая любой метод attach).
Вы можете использовать метод attach, реализованный в пользовательской оценке, для изучения и проверки набора сетевых данных, чтобы убедиться, что он соответствует требованиям кода пользовательской оценки, например, для проверки наличия других атрибутов. Если набор сетевых данных корректен, метод attach возвращает True; в противном случае он возвращает False. Когда возвращается False, пользовательская оценка не будет связана с сетевым набором данных, и никакие другие методы вызываться не будут.
Реализация метода attach в пользовательской оценке необязательна.
Примечание:
Набор сетевых данных может быть открыт несколько раз в зависимости от количества потоков, используемых приложением для доступа к нему.
Обновить
Метод refresh пользовательской оценки вызывается в начале каждой операции расчета, перед вычислением каких-либо элементов. В этом методе может быть задано любое внутреннее состояние (например, кэшированные значения или проверка несетевого набора данных), которое меняется в зависимости от расчета. Свойство self.networkQuery доступно в этом методе. Это свойство задается внутренне, после успешного завершения метода attach.
Реализация метода refresh в пользовательской оценке необязательна.
Методы значений
Могут быть реализованы следующие методы значений: edgeValue, edgeValueAtTime, junctionValue, junctionValueAtTime, turnValue и turnValueAtTime. Методы с префиксом edge влияют на значения атрибутов для источников ребер, методы с префиксом junction влияют на значения атрибутов для источников соединений и методы с префиксом turn влияют на значения атрибутов для источников поворотов. Методы с суффиксом AtTime вызываются во время операций расчета с включенным временем, а методы без этого суффикса вызываются, когда время не используется.
В общем, во время операции расчета, когда вычисляется атрибут и имеется подключенная пользовательская оценка, он переопределяет основной. Значение, возвращаемое методом связанного элемента (например, edgeValue), будет использоваться механизмом расчета в оставшейся части анализа. Используя эти методы значений, вы можете реализовать пользовательскую логику для задания конечного значения атрибута элемента.
Методы ValueAtTime предоставляют параметр datetime, который является датой и временем появления элемента на потенциальном маршруте. Эти методы вызываются для каждого элемента потенциально несколько раз во время операции расчета. Любой код в этих методах должен быть исполняемым.
Вы должны реализовать хотя бы один из этих методов значений.
Примеры
В приведенных ниже примерах показана базовая реализация класса пользовательской оценки.
Пример 1: Следующий код представляет собой класс пользовательской оценки, который удваивает стоимость указанного атрибута для всех вычисляемых ребер для расчета, не зависящего от времени, без реализации каких-либо необязательных методов:
import arcpy
class EdgeCustomizer(arcpy.nax.AttributeEvaluator):
"""Defines a custom evaluator that multiplies the edge cost by 2."""
def edgeValue(self, edge: arcpy.nax.Edge):
"""Multiplies the edge cost by 2."""
base_value = self.networkQuery.attributeValue(edge, self.attribute)
return base_value * 2
Пример 2: Следующий код представляет собой класс пользовательской оценки, который удваивает стоимость указанного атрибута для всех вычисляемых ребер как для расчета, не зависящего от времени, так и для расчета с поддержкой времени, с минимальной реализацией необязательных методов:
import datetime
from typing import Union, Optional, List
import arcpy
class EdgeCustomizer(arcpy.nax.AttributeEvaluator):
"""Defines a custom evaluator that multiplies the edge cost by 2."""
def __init__(self, attributeName: str, sourceNames: Optional[List] = None):
"""Example initializer."""
super().__init__(attributeName, sourceNames)
# Do additional custom initialization
def attach(self, network_query: arcpy.nax.NetworkQuery) -> bool:
"""Connect to and validate the network dataset."""
# Do additional validation checks before returning Boolean
return True
def refresh(self) -> None:
"""Reset internal state before solve."""
# Reset internal state in this method as needed
pass
def edgeValue(self, edge: arcpy.nax.Edge):
"""Multiplies the edge cost by 2."""
base_value = self.networkQuery.attributeValue(edge, self.attribute)
return base_value * 2
def edgeValueAtTime(
self, edge: arcpy.nax.Edge,
time: datetime.datetime, time_usage: arcpy.nax.NetworkTimeUsage
) -> Union[int, float, bool]:
"""Multiplies the edge cost by 2 when the solve uses a time of day."""
base_value_at_time = self.networkQuery.attributeValue(
edge, self.attribute, time_usage, time)
return base_value_at_time * 2
Связывание пользовательской оценки с набором сетевых данных
Существует два способа развернуть пользовательскую оценку, чтобы она была связана с набором сетевых данных, и чтобы логика настройки вызывалась во время операции расчета: временный и постоянный.
Подсказка:
Создание класса пользовательской оценки и его тестирование как временной пользовательской оценки. Затем запустите скрипт в режиме отладки в таком редакторе, как Visual Studio Code. Как только он заработает должным образом, и если необходимо, вы можете сделать его постоянной пользовательской оценкой. Затем проверьте постоянную оценку, чтобы убедиться, что все работает правильно.
Временная пользовательская оценка
Временные пользовательские оценки связаны только с объектом набора сетевых данных, созданным в скрипте; они не сохраняются постоянно в наборе сетевых данных. Временные пользовательские оценки настраиваются с использованием свойства customEvaluators объекта набора сетевых данных в сценарии, выполняющем решение.
Временную пользовательскую оценку можно использовать для приложений, в которых пользовательская оценка должна вызываться из скрипта Python. Они также могут быть полезны для разработки и отладки постоянных пользовательских оценок.
Настройка временной пользовательской оценки
Чтобы настроить временную пользовательскую оценку, создайте объект пользовательской оценки и используйте свойство customEvaluators объекта набора сетевых данных, чтобы связать с ним объект пользовательской оценки.
В приведенном ниже примере показано, как создать экземпляр пользовательского объекта оценки, который настраивает сетевой атрибут TravelTime, и связать ее с объектом набора сетевых данных. Чтобы вызвать пользовательские оценки во время расчета, создайте экземпляр объекта расчета маршрута, используя объект набора сетевых данных.
# Instantiate a custom evaluator object that will customize the
# TravelTime cost attribute
travel_time_customizer = EdgeCustomizer("TravelTime")
# Create a network dataset object
network_dataset = arcpy.nax.NetworkDataset(
r"C:\Data\Tutorial\SanFrancisco.gdb\Transportation\Streets_ND")
# Attach the custom evaluator object to the network dataset
network_dataset.customEvaluators = [travel_time_customizer]
# Instantiate a route analysis
route = arcpy.nax.Route(network_dataset)
Примечание:
При запуске пользовательской оценки вы можете предоставить список имен конкретных сетевых источников, где указываются источники, к которым будет применяться пользовательская оценка. Если список не задан, пользовательская оценка будет применена ко всем источникам. Подробнее см. документацию к AttributeEvaluator.
Постоянные пользовательские оценки
Постоянные пользовательские оценки хранят ссылку на класс пользовательских оценок как часть схемы набора сетевых данных, которая хранится в базе геоданных. Эти пользовательские оценки будут вызываться при каждом выполнении операции расчета с использованием этого набора сетевых данных. Такой вариант называется постоянным, поскольку ссылка является частью набора сетевых данных. Они настраиваются с использованием updateNetworkDatasetSchema объекта набора сетевых данных.
При открытии сети с сохраненной пользовательской оценкой, вызывается метод attach, а пользовательская оценка загружается и кэшируется. Этот кэш сохраняется в течение всего срока работы приложения. Это означает, что любые изменения, внесенные в класс постоянной пользовательской оценки, не будут прочитаны до тех пор, пока приложение, в котором открыт набор сетевых данных, не будет закрыто и перезапущено. Это применимо и к ArcGIS AllSource, и к ArcGIS Server.
Важно отметить, что для постоянных пользовательских оценок схема набора сетевых данных содержит только ссылку на пользовательскую оценку, а не код класса. Эта ссылка позволяет набору сетевых данных при доступе к нему неявно найти и загрузить соответствующую пользовательскую оценку. Файл, содержащий код класса, должен находиться в папке site-packages активной среды ArcGIS AllSource Python, чтобы набор сетевых данных мог его найти.
Более подробно о средах Python
Примечание:
Если скрипт настройки должен использовать сторонние пакеты Python, которые не включены в среду ArcGIS AllSource Python по умолчанию, рекомендуется клонировать среду Python по умолчанию перед установкой дополнительных пакетов. Следуйте инструкциям в разделе Менеджер пакетов, чтобы создать клон среды ArcGIS AllSource Python по умолчанию, добавить пакеты и активировать среду. Файл Python пользовательской оценки должен храниться в каталоге site-packages активной среды Python, в данном случае — клона среды ArcGIS AllSource Python по умолчанию.
То же самое касается ArcGIS Server. Если вам необходимо развернуть сохраненную настройку на сайте ArcGIS Server и использовать дополнительные сторонние пакеты, которые не включены в среду ArcGIS Server Python по умолчанию, следуйте инструкциям в разделе Развертывание пользовательских пакетов Python для ArcGIS Server, чтобы клонировать среду Python по умолчанию и добавить пакеты, а затем активируйте клонированную среду. При развертывании сохраненной настройки в ArcGIS Server ее необходимо скопировать в каталог site-packages активной среды Python на ArcGIS Server.
Используйте постоянную пользовательскую оценку, когда вам нужно вызвать пользовательскую оценку при выполнении операции расчета вне скрипта Python, например, в ArcGIS AllSource или ArcGIS Server.
Если слой сетевого анализа, использующий набор сетевых данных с постоянной пользовательской оценкой, публикуется как сервис, пакет пользовательской оценки должен быть вручную скопирован в каталог пакетов сайта ArcGIS Server Python. Кроме того, когда пользовательская оценка используется в сервисе, любой внешний ресурс, который он использует (например, файлы), должен быть доступен пользователю ArcGIS Server, поскольку это зависит от настройки сервера.
Настройка постоянной пользовательской оценки
Используйте метод updateNetworkDatasetSchema для объекта набора сетевых данных, чтобы постоянно обновлять схему набора сетевых данных, передавая словарь, определяющий сетевой атрибут, для которого следует вызвать пользовательскую оценку, и путь к классу пользовательской оценки. Этот путь использует точечную нотацию для определения имени папки (в каталоге site-packages), имени файла, в котором находится класс, и имени класса.
В приведенном ниже примере показано, как обновить набор сетевых данных с помощью сохраненного класса пользовательских оценок. Класс в этом примере называется EdgeCustomizer, а его код находится в модуле Python с именем customization.py в папке с именем na_customizers, которая находится в папке site-packages для ArcGIS AllSource активной среды Python.
import arcpy
# Create a network dataset object
network_dataset = arcpy.nax.NetworkDataset(
r"C:\Data\Tutorial\SanFrancisco_Persisted.gdb\Transportation\Streets_ND")
# Create a dictionary referencing the custom evaluators to apply to the
# TravelTime attribute
my_custom_evaluators = {
"TravelTime": {"class": "na_customizers.customization.EdgeCustomizer"}
}
# Update the network dataset to use the custom evaluator
network_dataset.updateNetworkDatasetSchema(custom_evaluators=my_custom_evaluators)
Примечание:
При обновлении схемы со ссылкой на пользовательская оценка вы можете предоставить список имен определенных сетевых источников, где указываются источники, к которым будет применяться пользовательская оценка. Если список не задан, пользовательская оценка будет применена ко всем источникам. Чтобы установить это, включите ключ sourceNames в список имен источников. Ниже приведен пример:{
"TravelTime": {
"class": "na_customizers.customization.EdgeCustomizer",
"sourceNames": ["Streets"]
}
}
Когда этот набор сетевых данных и назначенный атрибут используются в сетевом анализе, набор сетевых данных будет вызывать пользовательскую оценку во время расчета. Сеть проверит существование указанного атрибута и источников, а также найдет и загрузит указанный пакет и класс из папки пакетов сайта активной среды ArcGIS AllSource Python. Если атрибут, имена источников, пакет или класс не найдены, пользовательская оценка использоваться не будет. Решение завершится появлением предупреждающего сообщения о том, что при использовании пользовательской оценки возникла проблема.
Если в наборе сетевых данных сохранены пользовательские оценки, они будут перечислены в разделе Итоговая информация панели ОбщееИ диалогового окна свойств набора сетевых данных. Они также будут отображаться вместе с указанным сетевым атрибутом при просмотре соответствующей вкладки, например, вкладки Стоимость на вкладке Атрибуты передвижения. Если при загрузке класса возникла проблема, появятся предупреждающие сообщения.
Жизненный цикл объекта
Когда набор сетевых данных изначально создается и имеет постоянную пользовательскую оценку, он создает экземпляр объекта пользовательской оценки, на который ссылаются на протяжении всего его времени жизни. Время жизни может варьироваться в зависимости от используемой платформы (например, ArcGIS AllSource, ArcGIS Server или Python).
Поскольку конкретный экземпляр объекта пользовательской оценки может использоваться для нескольких решений, важно управлять состоянием этого объекта, в частности, сбрасывать переменные в методе refresh по мере необходимости. Например, если пользовательской оценке необходимо записать количество ребер для каждого расчета, сбросьте переменную, используемую для отслеживания этого значения, в методе refresh.
В контексте ArcGIS Server каждый процесс SOC (во время запуска и во время перезапуска) создаст новый объект набора сетевых данных, а также создаст новый экземпляр объекта пользовательской оценки. Этот экземпляр объекта пользовательской оценки будет использоваться на протяжении всего жизненного цикла процесса SOC; только методы refresh и Value будут запускаться для каждого запроса.
Ограничения
К пользовательским оценкам применяются следующие ограничения:
- Пользовательские оценки доступны только в ArcGIS AllSource и ArcGIS Server.
- Пользовательские оценки могут быть вызваны только для файловой или корпоративной базы геоданных.
- Атрибуты дескриптора вызываются только тогда, когда на них ссылается атрибут стоимости или ограничения.
- Из соображений производительности пользовательские оценки не поддерживают использование ключевых слов в качестве аргументов.
Создание и использование временной пользовательской оценки
В следующих разделах описывается, как создать и использовать временную пользовательскую оценку. Каждый пример кода иллюстрирует определенный компонент полного рабочего процесса. Есть следующие компоненты рабочего процесса:
- Расчет анализа маршрутов
- Настройка класса пользовательской оценки
- Связывание пользовательской оценки с набором сетевых данных
Последний пример кода показывает, как соединить все компоненты вместе.
Следующие примеры кода созданы на основе руководства по сетевому анализу, которое можно загрузить со страницы загрузки данных.
Расчет анализа маршрутов
В приведенном ниже примере кода показан рабочий процесс для анализа маршрута с использованием объекта механизма расчета arcpy.nax и печати времени передвижения по маршруту.
Примечание:
Путь к базе геоданных в приведенном ниже коде необходимо обновить, чтобы отразить расположение данных в вашей системе.
import arcpy
# Create a network dataset object
network_dataset = arcpy.nax.NetworkDataset(
r"C:\Data\Tutorial\SanFrancisco.gdb\Transportation\Streets_ND")
# Instantiate a route analysis
route = arcpy.nax.Route(network_dataset)
# Insert stops for the route
with route.insertCursor(
arcpy.nax.RouteInputDataType.Stops,
["NAME", "SHAPE@XY"]
) as cursor:
cursor.insertRow(["Stop1", (-122.501, 37.757)])
cursor.insertRow(["Stop2", (-122.445, 37.767)])
# Solve the route
result = route.solve()
# Print the total travel time for the route
for row in result.searchCursor(
arcpy.nax.RouteOutputDataType.Routes,
["Total_Minutes"]
):
print(f"Solved Total_Minutes: {row[0]}")
Настройка класса пользовательской оценки
В приведенном ниже примере кода показано определение класса пользовательских оценок. В этом примере исходную стоимость времени умножается на коэффициент 2. Время в пути по маршруту, рассчитанному с помощью этого пользовательской оценки, должно быть в два раза больше времени в пути того же маршрута, решенного без анализатора.
class EdgeCustomizer(arcpy.nax.AttributeEvaluator):
"""Defines a custom evaluator that multiplies the edge cost by 2."""
def edgeValue(self, edge: arcpy.nax.Edge):
"""Multiplies the edge cost by 2."""
base_value = self.networkQuery.attributeValue(edge, self.attribute)
return base_value * 2
Связывание пользовательской оценки с набором сетевых данных
В приведенном ниже примере кода показано создание экземпляра класса пользовательской оценки и его связывание с объектом набора сетевых данных для использования с атрибутом стоимости TravelTime. Выполните этот рабочий процесс до вызова расчета маршрута (route.solve()).
# Create a custom evaluator object that will customize the
# TravelTime cost attribute
travel_time_customizer = EdgeCustomizer("TravelTime")
# Attach the custom evaluator object to the network dataset
network_dataset.customEvaluators = [travel_time_customizer]
Сборка всех компонентов
В приведенном ниже примере кода показано, как объединить все компоненты в полный рабочий процесс, который определяет и использует временную пользовательскую оценку для рабочего процесса анализа маршрута.
import arcpy
class EdgeCustomizer(arcpy.nax.AttributeEvaluator):
"""Defines a custom evaluator that multiplies the edge cost by 2."""
def edgeValue(self, edge: arcpy.nax.Edge):
"""Multiplies the edge cost by 2."""
base_value = self.networkQuery.attributeValue(edge, self.attribute)
return base_value * 2
# Create a custom evaluator object that will customize the
# TravelTime cost attribute
travel_time_customizer = EdgeCustomizer("TravelTime")
# Create a network dataset object
network_dataset = arcpy.nax.NetworkDataset(
r"C:\Data\Tutorial\SanFrancisco.gdb\Transportation\Streets_ND")
# Attach the custom evaluator object to the network dataset
network_dataset.customEvaluators = [travel_time_customizer]
# Instantiate a route analysis
route = arcpy.nax.Route(network_dataset)
# Insert stops for the route
with route.insertCursor(
arcpy.nax.RouteInputDataType.Stops,
["NAME", "SHAPE@XY"]
) as cursor:
cursor.insertRow(["Stop1", (-122.501, 37.757)])
cursor.insertRow(["Stop2", (-122.445, 37.767)])
# Solve the route
result = route.solve()
# Print the total travel time for the route
for row in result.searchCursor(
arcpy.nax.RouteOutputDataType.Routes,
["Total_Minutes"]
):
print(f"Solved Total_Minutes: {row[0]}")
Создание и использование постоянной пользовательской оценки
В следующих разделах описывается, как создать и использовать постоянную пользовательскую оценку. В этом рабочем процессе создается собственный класс пользовательской оценки в активной среде Python, обновляется набор сетевых данных для использования пользовательской оценки и тестируется путем выполнения анализа маршрута. Есть следующие компоненты рабочего процесса:
- Клонирование среды Python по умолчанию (дополнительно)
- Настройка и сохранение класса пользовательской оценки
- Обновление схемы набора сетевых данных
- Сохранение маршрута
Следующие примеры кода созданы на основе руководства по сетевому анализу, которое можно загрузить со страницы загрузки данных.
Клонирование среды Python по умолчанию (дополнительно)
Этот шаг не является обязательным. Клонировать среду Python по умолчанию необходимо только в том случае, если скрипт настройки должен использовать сторонние библиотеки Python, которые не включены в среду ArcGIS AllSource Python по умолчанию.
Настройка и сохранение класса пользовательской оценки
В приведенном ниже примере кода показано определение класса пользовательских оценок. В этом примере исходную стоимость времени умножается на коэффициент 2. Время в пути по маршруту, рассчитанному с помощью этого пользовательской оценки, должно быть в два раза больше времени в пути того же маршрута, решенного без анализатора.import arcpy
class EdgeCustomizer(arcpy.nax.AttributeEvaluator):
"""Defines a custom evaluator that multiplies the edge cost by 2."""
def edgeValue(self, edge: arcpy.nax.Edge):
"""Multiplies the edge cost by 2."""
base_value = self.networkQuery.attributeValue(edge, self.attribute)
return base_value * 2
В активной среде Python найдите папку site-packages. В ней создайте папку с именем na_customizers. Сохраните приведенный выше код, определяющий класс пользовательской оценки, в папку na_customizers как cost_customization.py.
Примечание:
Следующие имена примеров, использованные в примере кода важны, так как в дальнейшем вы обновите схему набора сетевых данных этими значениями.
Обновление схемы набора сетевых данных
Копируйте Network Analyst\Tutorial\SanFrancisco.gdb из данных руководства в SanFrancisco_Persisted.gdb.
Используйте приведенный ниже код в автономном скрипте, чтобы постоянно обновлять набор сетевых данных SanFrancisco_Persisted.gdb, чтобы он ссылался на пользовательскую оценку атрибута стоимости TravelTime. Словарь my_custom_evaluators ссылается на имя папки, имя файла и имя класса пользовательской оценки, определенного в приведенном выше примере кода.
import arcpy
# Check out ArcGIS Network Analyst extension
arcpy.CheckOutExtension("network")
# Create a network dataset object
network_dataset = arcpy.nax.NetworkDataset(
r"C:\Data\Tutorial\SanFrancisco_Persisted.gdb\Transportation\Streets_ND")
# Create a dictionary referencing the custom evaluators to apply to the
# TravelTime attribute
my_custom_evaluators = {
"TravelTime": {"class": "na_customizers.customization.EdgeCustomizer"}
}
# Update the network dataset to use the custom evaluator
network_dataset.updateNetworkDatasetSchema(custom_evaluators=my_custom_evaluators)
Сохранение маршрута
В ArcGIS AllSource воспользуйтесь набором сетевых данных SanFrancisco_Persisted.gdb для построения маршрута с использованием режима передвижения Время в пути. Решите второй маршрут, используя SanFrancisco.gdb и те же остановки, и сравните время передвижения для выходного маршрута. Время передвижения по маршруту по SanFrancisco_Persisted.gdb должно быть в два раза больше времени поездки по SanFrancisco.gdb по тому же маршруту из-за пользовательской оценки.
Развертывание пользовательских оценок для их использования в сервисах маршрутизации, размещенных на сайте ArcGIS GIS Server
Вы можете опубликовать два типа сервисов маршрутизации: стандартные сервисы маршрутизации и пользовательские сервисы маршрутизации.
Стандартные сервисы маршрутизации — это картографические сервисы и сервисы геообработки, которые предоставляют готовые возможности, доступные в Расширение ArcGIS Network Analyst. Вы можете опубликовать стандартные сервисы маршрутизации на сайте ArcGIS GIS Server, используя набор сетевых данных, и получите набор точек доступа сервиса маршрутизации с предзаданными параметрами и схемой для входных данных. Эти сервисы маршрутизации обеспечивают полную функциональность и интеграцию с приложениями Esri, такими как ArcGIS AllSource и Map Viewer.
Подробные сведения о публикации стандартных сервисов маршрутизации
Пользовательские сервисы маршрутизации — это сервисы геообработки с настраиваемыми возможностями. Пользовательские сервисы маршрутизации позволяют вам выполнять рабочий процесс, который может содержать несколько оценок сетевого анализа или других инструментов геообработки. Он также позволяет задать пользовательские параметры и входную схему в соответствии с потребностями приложения.
Подробнее о публикации пользовательских сервисов маршрутизации
Примечание:
Как стандартные, так и пользовательские сервисы маршрутизации могут вызывать пользовательские оценки. Эта возможность была представлена в ArcGIS GIS Server 11.2
Вызов пользовательской оценки со стандартными сервисами маршрутизации
Для вызова пользовательской оценки со стандартными сервисами маршрутизации выполните следующие действия:
- Создайте постоянную пользовательскую оценку и свяжите ее с набором сетевых данных.
- Протестируйте пользовательскую оценку в ArcGIS AllSource, чтобы убедиться, что она вызывается при решении маршрута.
- Скопируйте набор сетевых данных в один и тот же каталог на всех компьютерах, участвующих в сайте ArcGIS Server, который будет использоваться для размещения сервисов маршрутизации.
- Скопируйте папку и файл настройки на все компьютеры, участвующие в сайте ArcGIS Server. Поместите папку и файл в папку site-packages активной среды ArcGIS Server Python. Путь на компьютере сервера по умолчанию - <install>\ArcGIS\Server\framework\runtime\ArcGIS\bin\Python\envs\arcgispro-py3\Lib\site-packages. При копировании из папки site-packages среды ArcGIS AllSource Python в ArcGIS Server сохраняйте ту же структуру папок для кода настройки. Например, если код настройки находится в файле cost_customization.py в папке na_customizers, скопируйте папку na_customizers в директорию site-packages ArcGIS Server.
- Опубликуйте стандартные сервисы маршрутизации.
При использовании сервисов маршрутизации применяются настройки.
Вызов пользовательской оценки с пользовательскими сервисами маршрутизации
Для вызова пользовательской оценки с пользовательскими сервисами маршрутизации выполните следующие действия:
- Создайте инструмент-скрипт, выполнив действия из раздела Публикация пользовательских сервисов маршрутизации.
- Свяжите временный настройщик с набором сетевых данных в инструменте-скрипте.
- Опубликуйте сервис, выполнив действия из раздела Публикация пользовательских сервисов маршрутизации.
При использовании сервисов маршрутизации применяются настройки.
Пример кода: использование значений в поле класса объектов с помощью сетевого дескриптора
Пользовательские оценки работают с сетевыми элементами (например, с ребрами), что означает, что к значениям полей исходных объектов нельзя получить прямой доступ. Вместо этого вы можете получить доступ к этим значениям косвенно, создав атрибут дескриптора в своей сети, который считает значения полей исходных объектов.
Чтобы использовать это в пользовательской оценке, получите атрибутивный индекс дескриптора в методе attach. В приведенном ниже примере кода выполняется поиск атрибутивного индекса RoadClass и сохранение значения в переменной экземпляра road_class. Если атрибут не будет найден, метод возвращает False, что указывает на то, что пользовательская оценка не может быть присоединена.
def attach(self, network_query: arcpy.nax.NetworkQuery) -> bool:
self.road_class_att = network_query.attribute("RoadClass")
if self.road_class_att is None:
return False
else:
return True
Затем в функциях оценки элемента код запросит значение атрибута дескриптора элемента и будет использовать его в функции по мере необходимости. В приведенном ниже примере значение RoadClass используется для определения способа изменения базового значения.
def edgeValue(self, edge: arcpy.nax.Edge) :
base_value = self.networkQuery.attributeValue(edge, self.attribute)
road_class_value = self.networkQuery.attributeValue(edge, self.road_class_att)
if road_class_value in [1,2,3]:
return base_value * 2
else:
return base_value