Примеры вычислителей скриптов

Доступно с лицензией Network Analyst.

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

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

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

Более подробно о типах вычислителей, используемых сетью

Примеры вычислителей Скрипт поля

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

Диалоговое окно Вычислитель Скрипт поля

При построении вычислителей Скрипт поля с помощью Python на поля следует ссылаться с использованием их имен (не псевдонимов) и кодировать с помощью ! в скобки вокруг имени. Например, при использовании поля с именем RoadClassзакодируйте поле как !RoadClass! в Python.

Геометрию объекта можно использовать для расчетов, включающих длину формы. Объект геометрии формы рассчитывается на основе пропорциональной геодезической длины исходного сегмента в единицах системы координат исходного класса объектов. Например, если поле формы класса пространственных объектов называется Shape, закодируйте его как !Shape! в Python. При использовании !Shape! в качестве части атрибута стоимости, основанного на расстоянии, будет использоваться пропорциональная длина исходного сегмента, а единицы системы координат будут преобразованы в единицы атрибута стоимости. Свойства и методы объекта геометрии, такие как !Shape!.length или !Shape!.getLength(), не поддерживаются. В вычислителях Скрипт поляt поддерживается только база !Shape!.

Поле !Shape_Length!, содержащее плоскую длину объекта, также может использоваться для расчета длины, но оно будет рассматриваться как число без учета системы координат или пропорциональной длины объекта. Внутри вычислителя его единицы измерения будут интерпретироваться как те же единицы измерения, что и единицы измерения атрибута, а не единицы измерения системы координат. По этой причине рекомендуется использовать поле !Shape!

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

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

Value:
calc_time(!RoadClass!, !Miles!)

Code Block:
def calc_time(rc, d):
    # This example assumes that the speed limit is in miles per hour
    # and that the distance field is in miles
    if rc == 1:  # Local roads
        speed_limit = 30
    elif rc == 6:  # Major roads
        speed_limit = 55
    elif rc == 2:  # Highways
        speed_limit = 70
    else:  # Set a default speed limit if RoadClass does not match any other option
        speed_limit = 45   
    return 60 * d / speed_limit

Примеры вычислителей Скрипт элемента

Диалоговое окно Вычислитель Скрипт элемента

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

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

Использование атрибутов и параметров сети

Метод AttributeValueByName() может использовать значения из других сетевых атрибутов, в то время как метод ParameterValueByName() использует значения параметров из атрибута контекста, того же атрибута, для которого работает вычислитель.

МетодОписание

AttributeValueByName

Используйте значение другого атрибута элемента контекстной сети.

Этот метод принимает в качестве входной строки имя сетевого атрибута.

Примеры:

Edge.AttributeValueByName("OtherCost")

Junction.AttributeValueByName("OtherRestriction")

Turn.AttributeValueByName("OtherRestriction")

ParameterValueByName

Используйте значение указанного параметра сетевого атрибута контекстного сетевого атрибута.

Этот метод принимает в качестве входной строки имя параметра атрибута контекстной сети.

Пример:

ParameterValueByName("OtherParamName")

Более подробно об атрибутах сети

Более подробно о параметрах сети

В следующем примере определяет импеданс пересечения участка дороги для атрибута стоимости, называемого CostAdjustedforSlope, где временные затраты на езду на велосипеде по дороге изменяются в зависимости от уклона участка дороги. Сеть содержит атрибут дескриптора под названием AverageSlope, который вычисляет средний уклон участка дороги. Сеть содержит стоимостной атрибут под названием Минуты, который вычисляет, сколько времени в минутах потребуется для прохождения участка дороги. Для CostAdjustedforSlope настроены два параметра: один называется SteepUpFactor, а другой — SteepDownFactor. Они представляют собой коэффициент изменения для подъема или спуска по крутому склону соответственно. Если AverageSlope меньше -0,05, что указывает на крутой спуск по дороге, это сокращает время проезда по дороге. Значение AverageSlope выше 0,075 увеличивает временные затраты.

Value:
cost_adjusted_for_slope("Minutes", "AverageSlope", "SteepUpFactor", "SteepDownFactor")

Code Block:
def cost_adjusted_for_slope(
    time_cost_attr_name, slope_attr_name,
    up_factor_param_name, down_factor_param_name
):
    # Retrieve the values of other attributes for this road
    time_cost = Edge.AttributeValueByName(time_cost_attr_name)
    slope = Edge.AttributeValueByName(slope_attr_name)

    # Retrieve the value of parameters for this attribute
    up_factor = ParameterValueByName(up_factor_param_name)
    down_factor = ParameterValueByName(down_factor_param_name)

    # Set default values in case the parameter values are null
    if up_factor is None: 
        up_factor = 1.25
    if down_factor is None: 
        down_factor = 0.80

    # Calculate the modified travel time cost based on slope
    factor = 1
    if slope < -0.05:  # Steep downhill
        factor = down_factor
    elif slope > 0.075: # Steep uphill
        factor = up_factor
    modified_cost = factor * time_cost

    return modified_cost

В следующем примере скрипт оценки элемента предназначен для ограничения, называемого ClosedForEvent, которое ограничивает соединения на основе логического параметра MarketEvent. Атрибут дескриптора MarketIntersection содержит логическое значение, определяющее, повлияет ли событие на данное соединение. Если оба параметра - MarketEvent и MarketIntersection - равны true, соединение будет ограничено; в противном случае оно будет проходимым.

Value:
is_closed_for_event("MarketIntersection", "MarketEvent")

Code Block:
def is_closed_for_event(is_conditionally_open_attr_name, event_closure_bool_param_name):
    is_affected_by_event = Junction.AttributeValueByName(is_conditionally_open_attr_name)
    is_closed_for_event_param = ParameterValueByName(event_closure_bool_param_name)
    return is_affected_by_event and is_closed_for_event_param

Использование свойств элемента сети

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

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

Value:
no_backwards_turn(Turn.Angle)

Code Block:
def no_backwards_turn(angle):
    if angle >= 135 and angle <= 225:
        # Restrict turns with sharp angles
        return True
    return False