自定义赋值器

自定义赋值器支持在使用 Python 脚本进行求解操作期间更改网络元素的成本、限制和描述符属性值。 可以查询元素的基值并根据需要进行更新,或者根据其他输入设置不同的值。 由此可在求解时设置属性值,而无需更新基础网络数据集或源要素。

了解有关网络属性和赋值器的详细信息

自定义赋值器可用于执行以下操作:

  • 通过查询另一个数据库中的表来调整街道的成本。
  • 根据从外部文件读取的对象标识符限制街道要素。
  • 根据一天中的时间动态调整街道成本。

要实现自定义赋值器,可创建一个从 arcpy.nax.AttributeEvaluator 类继承而来的 Python 类,并将 Python 类与特定网络数据集关联起来。 可以与成本、限制或描述符属性相关联。 可以更新启用时间的求解操作以及未启用时间的求解操作的边、交汇点或转弯。 根据所做的更改,更新可能会改变成本和分析过程中找到的路径。

单个网络属性应该仅具有与其相关联的单个自定义赋值器,但任意数量的网络属性都可以具有关联的自定义赋值器。 实现自定义赋值器时,可以使用多个对象来收集有关网络和元素的信息,例如 AttributeEdgeJunction 等。

自定义赋值器类

要创建自定义赋值器,可定义一个从 arcpy.nax.AttributeEvaluator 类继承的类,并实现至少一种元素值方法(例如 edgeValueedgeValueAtTime)。 您也可以使用自定义赋值器实现 __init__attachrefresh 方法。

自定义赋值器方法

以下小节描述了可用于在求解时设置属性值的方法。

初始化程序

可以实现初始化程序 __init__ 方法。 如果已实现,则在添加附加初始化逻辑之前必须显式调用基类的初始化程序方法。 如果未实现,则基类的初始化程序方法将自动调用。

基类初始化程序将使用传入的属性名称和源名称来设置对象上的 self.attributeNameself.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 方法。 内部代码将查询网络数据集属性以获取指定的属性名称。 如果找到属性名称,则会将 self.attribute 属性设置为该属性的索引值;否则,自定义赋值器将不会与网络数据集相关联,并且不会调用其他类方法(包括所有由用户实现的 attach 方法)。

可以使用在自定义赋值器中实现的 attach 方法检查和验证网络数据集,以确保其符合自定义赋值器代码的要求,例如检查其他属性是否存在。 如果网络数据集有效,则 attach 方法将返回 True;否则,将返回 False。 如果返回 False,则自定义赋值器将不会与网络数据集相关联,并且不会调用其他方法。

在自定义赋值器中实现 attach 方法为可选做法。

注:

可以多次打开网络数据集,具体取决于应用程序用于访问网络数据集的线程数量。

刷新

在每次求解操作开始时,在评估任何元素之前,都会调用自定义赋值器的 refresh 方法。 在每次求解时都会发生变化的任何内部状态(例如,缓存值或非网络数据集验证)都可以在此方法中设置。 self.networkQuery 属性在此方法中可用。 当 attach 方法成功完成后,将在内部设置此属性。

在自定义赋值器中实现 refresh 方法为可选项。

值方法

可以实现以下值方法:edgeValueedgeValueAtTimejunctionValuejunctionValueAtTimeturnValueturnValueAtTime。 前缀为 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 ProArcGIS Server

值得注意的是,对于持久化自定义赋值器,网络数据集方案仅包含对自定义赋值器的引用,不包含类代码。 此引用使得网络数据集在被访问时隐式查找并加载其引用的自定义赋值器。 包含类代码的文件必须位于活动 ArcGIS Pro Python 环境的站点包文件夹中,以便网络数据集可以找到它。

了解有关 Python 环境的详细信息

注:

如果自定义脚本需要使用默认 ArcGIS Pro Python 环境不包含的第三方 Python 包,则建议您在安装附加包之前克隆默认 Python 环境。 按照“软件包管理器”主题中的工作流创建默认 ArcGIS Pro Python 环境的克隆,添加包,然后激活环境。 自定义赋值器 Python 文件必须存储在活动 Python 环境的站点包目录中,在本例中,即默认 ArcGIS Pro Python 环境的克隆。

这一点同样适用于 ArcGIS Server。 如需为 ArcGIS Server 站点部署持久化自定义,并且需要使用 ArcGIS Server 默认 Python 环境不包含的第三方附加包,则请按照“为 ArcGIS Server 部署自定义 Python 包”主题中的步骤克隆默认 Python 环境,添加包,然后激活克隆环境。 向 ArcGIS Server 部署持久化自定义时,自定义必须复制到 ArcGIS Server 上的活动 Python 环境的站点包目录。

Python 脚本外部(例如在 ArcGIS ProArcGIS Server 中)执行求解操作时,在需要调用自定义赋值器时使用持久化自定义赋值器。

如果要发布为服务的网络分析图层使用具有持久化自定义赋值器的网络数据集,则必须将自定义赋值器包手动复制到 ArcGIS Server Python 环境的站点包目录。 此外,当在服务上使用自定义赋值器时,ArcGIS Server 用户应该可以访问它所使用的任何外部资源(如文件),因为这取决于服务器的配置方式。

配置持久化自定义赋值器

对网络数据集对象使用 updateNetworkDatasetSchema 方法永久更新网络数据集方案,传入用于定义要调用自定义赋值器的网络属性的字典和自定义赋值器类的路径。 该路径使用点标记来定义文件夹名称(在站点包目录中)、类所在文件的文件名以及类名。

下例显示了如何更新包含持久化自定义赋值器类的网络数据集。 此示例中的类名为 EdgeCustomizer,其代码位于名为 customization.pyPython 模块中,模块所在的文件夹名为 na_customizers,上述内容位于 ArcGIS Pro 活动 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 Pro Python 环境的站点包文件夹中查找和加载指定的包和类。 如果未找到任何属性、源名称、包或类,则不会使用自定义赋值器。 求解完成时将提示警告消息,提示使用自定义赋值器时出现问题。

当网络数据集包含持久化自定义赋值器时,这些赋值器会在网络数据集属性对话框常规窗格中的汇总部分列出。 当查看相关选项卡(例如交通流量属性选项卡上的成本选项卡)时,它们也会与引用的网络属性一同显示。 如果加载类时出现问题,则会显示警告消息。

对象生命周期

在最初构建网络数据集时,如果其具有持久化自定义赋值器,则其会实例化在其整个生命周期中引用的自定义赋值器对象。 生命周期可能因所使用的框架(例如 ArcGIS ProArcGIS ServerPython)而有所不同。

由于自定义赋值器对象的特定实例可以在多次求解操作中使用,因此管理该对象的状态非常重要,特别是要根据需要重置 refresh 方法中的变量。 例如,如果自定义赋值器需要针对每次求解记录边计数,则应在 refresh 方法中重置用于追踪此值的变量。

ArcGIS Server 环境中,每个服务器对象组件 (SOC) 进程(在启动时和循环时)将构造新的网络数据集对象,并且还将创建自定义赋值器对象的新实例。 自定义赋值器对象的这个实例将在 SOC 过程的整个生命周期中使用;只有 refreshValue 方法会在每个请求发生时运行。

局限性

以下局限性适用于自定义赋值器:

  • 自定义赋值器仅在 ArcGIS ProArcGIS Server 中可用。
  • 只能在文件或企业级地理数据库上调用自定义赋值器。
  • 仅在成本或约束属性引用描述符属性时,才会调用描述符属性。
  • 出于性能考虑,自定义赋值器不支持使用关键字作为参数。

创建并使用临时自定义赋值器

以下部分介绍了如何创建并使用临时自定义赋值器。 每个代码示例均表示完整工作流中的一个特定组件。 该工作流的组成部分如下:

  1. 求解路径分析
  2. 定义自定义赋值器类
  3. 将自定义赋值器与网络数据集相关联

最后的代码示例显示了如何将所有组件结合到一起。

下方代码示例是使用 Network Analyst 教程创建的,该教程可从数据下载页面下载。

求解路径分析

下方代码示例演示了使用 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 环境中创建一个自定义赋值器类,更新网络数据集以使用自定义赋值器,然后通过求解路径分析测试该赋值器。 该工作流的组成部分如下:

  1. 克隆默认 Python 环境(可选)
  2. 定义并保存自定义赋值器类
  3. 更新网络数据集方案
  4. 求解路径

下方代码示例是使用 Network Analyst 教程创建的,该教程可从数据下载页面下载。

克隆默认 Python 环境(可选)

此步骤是可选的。 如果自定义脚本需要使用默认 ArcGIS Pro Python 环境中不包含的第三方 Python 库,则您仅需要克隆默认 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 环境中,找到站点包文件夹。 在该目录中创建一个名为 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 Pro 中,通过 SanFrancisco_Persisted.gdb 中的网络数据集使用驾驶时间出行模式求解路径。 使用 SanFrancisco.gdb 和相同的停靠点求解第二条路径,然后比较输出路径的行驶时间。 引用 SanFrancisco_Persisted.gdb 的路径行驶时间应该是引用 SanFrancisco.gdb 的路径行驶时间的二倍,这是自定义赋值器的效果。

了解如何在 ArcGIS Pro 中求解路径分析问题

部署要在托管在 ArcGIS GIS Server 站点上的路径服务中使用的自定义赋值器

您可以发布两种类型的路径服务:标准路径服务和自定义路径服务。

标准路径服务是提供可与 ArcGIS Network Analyst extension 配合使用的即用型功能的地图和地理处理服务。 您可以使用网络数据集将标准路径服务发布到 ArcGIS GIS Server 站点,然后您将获得一组包含预定义参数和输入方案的路径服务端点。 这些服务提供完整功能和与 Esri 应用程序(例如 ArcGIS ProMap Viewer)的集成。

了解有关发布标准路径服务的详细信息

自定义路径服务是具有自定义功能的地理处理服务。 自定义路径服务可用于执行可能涉及多个网络分析求解程序或其他地理处理工具的工作流。 您还可以定义自定义参数和输入方案,以适应应用程序的要求。

了解有关发布自定义路径服务的详细信息

标准路径服务和自定义路径服务可以调用自定义赋值器。

通过标准路径服务调用自定义赋值器

要通过标准路径服务调用自定义赋值器,请完成以下步骤:

  1. 创建持久化自定义赋值器并将其与网络数据集关联。
  2. ArcGIS Pro 中测试自定义赋值器以确保其在求解路径时被调用。
  3. 在所有参与将用于托管路径服务的 ArcGIS Server 站点的计算机上,将网络数据集复制到相同的路径下。
  4. 将自定义文件夹和文件复制到所有参与 ArcGIS Server 站点的计算机上。 将文件夹和文件放置在 ArcGIS Server 活动 Python 环境的站点包文件夹中。 服务器计算机上的默认路径为:<install>\ArcGIS\Server\framework\runtime\ArcGIS\bin\Python\envs\arcgispro-py3\Lib\site-packages。 从 ArcGIS Pro Python 环境的站点包文件夹复制到 ArcGIS Server 时,请为自定义代码保留相同的文件夹结构。 例如,如果自定义代码位于 na_customizers 文件夹中的 cost_customization.py 文件中,请将 na_customizers 文件夹复制到 ArcGIS Server 上的站点包文件夹。
  5. 发布标准路径服务

使用路径服务时,会应用自定义。

通过自定义路径服务调用自定义赋值器

要通过自定义路径服务调用自定义赋值器,请完成以下步骤:

  1. 按照发布自定义路径服务主题中的步骤编写脚本工具。
  2. 将临时定制器与脚本工具中的网络数据集相关联。
  3. 按照发布自定义路径服务主题中的步骤发布服务。

使用路径服务时,会应用自定义。

代码示例:使用网络描述符访问要素类字段值

自定义赋值器作用于网络元素上(例如,边),这意味着源要素字段值无法直接访问。 但您可以在网络上创建可读取元要素字段值的描述符属性,以便间接访问这些值。

要将其用于自定义赋值器,请通过 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