创建最近设施点分析图层 (Network Analyst)

摘要

创建最近设施点网络分析图层并设置其分析属性。 最近设施点分析图层对于根据指定的出行模式确定与事件点距离最近的设施点十分有用。 该图层可通过本地网络数据集进行创建,也可通过在线托管服务或门户托管服务进行创建。

使用情况

  • 通过此工具创建分析图层后,您可以使用添加位置工具向图层中添加网络分析对象;使用求解工具来求解分析;以及使用保存至图层文件工具将结果保存到磁盘中。

  • 在地理处理模型中使用此工具时,如果模型作为工具来运行,则必须将输出网络分析图层创建为模型参数;否则,输出图层将无法添加到地图内容中。

  • ArcGIS AllSource 中,网络分析图层数据存储在文件地理数据库要素类中的磁盘上。 在工程中创建网络分析图层时,将在当前工作空间环境的新要素数据集中创建图层数据。 在 Python 脚本中创建网络分析图层时,您必须首先使用 arcpy.env.workspace = "<path to file gdb>" 将工作空间环境显式地设置到想要存储图层数据的文件地理数据库。 创建图层后,将向该文件地理数据库添加一个包含相应子图层要素类的新要素数据集。

参数

标注说明数据类型
网络数据源

将对其执行网络分析的网络数据集或服务。 将门户 URL 用于服务。

Network Dataset Layer;String
图层名称
(可选)

要创建的网络分析图层的名称。

String
出行模式
(可选)

分析中使用的出行模式名称。 出行模式为一组网络设置(例如行驶限制和 U 形转弯),用于确定行人、车辆、卡车或其他交通媒介在网络中的移动方式。 出行模式在网络数据源中进行定义。

arcpy.na.TravelMode 对象和包含出行模式有效 JSON 表示的字符串也可用作参数的输入。

String
行驶方向
(可选)

指定设施点与事件点之间的行驶方向。

如果网络包含基于出行方向的单行道或抗阻,则出行方向可能会影响找到的设施点。 例如,从特定事件点到特定设施点驾车可能需要 10 分钟,但是从另一个方向,即设施点到时间点可能需要 15 分钟,因为存在单行线或交通状况不同。

  • 朝向设施点行驶方向 - 从事件点到设施点。 零售店通常使用该设置,因为他们需要关注购物者(事件点)到达商店(设施点)所需的时间。 这是默认设置。
  • 远离设施点行驶方向 - 从设施点到事件点。 消防部门通常使用该设置,因为他们需要关注从消防站(设施点)行驶到紧急救援位置(事件点)所需的时间。
String
中断
(可选)

抗阻值到达该值后将停止搜索指定事件点的设施点(以出行模式值使用的抗阻属性为单位)。 当将行驶方向参数设置为朝向设施点时,在事件点子图层中指定单个中断值可按事件点覆盖中断,当将行驶方向参数设置为远离设施点时,在事件点子图层中指定单个中断值可按设施点覆盖中断。 默认情况下分析不使用中断。

Double
要查找的设施点数
(可选)

要按事件点查找的最近设施点数。 可通过在事件点子图层中指定 TargetFacilityCount 属性的各个值来覆盖此默认值。 要查找的设施点默认数量为一。

Long
时间
(可选)

路径开始或结束的时间和日期。 对该值的解释取决于是将时间用法设置为路径的起始时间还是终止时间。

如果您选择基于流量的阻抗属性,将会根据特定的某天某时的动态交通状况来生成解决方案。 日期和时间可被指定为 5/14/2012 10:30 AM。

将您的分析配置为使用以下特殊日期之一来模拟一周中的某天或当前日期,而不是特定的静态日期:

  • 今天 - 12/30/1899
  • 星期日 - 12/31/1899
  • 星期一 - 1/1/1900
  • 星期二 - 1/2/1900
  • 星期三 - 1/3/1900
  • 星期四 - 1/4/1900
  • 星期五 - 1/5/1900
  • 星期六 - 1/6/1900

了解如何在网络分析中使用和解释日期和时间的详细细腻

Date
时区
(可选)

时间参数的时区。

  • 各位置的本地时间时间参数采用设施点或事件点所处的时区。 这是默认设置。
    • 如果将时间用法设置为起始时间出行方向设置为远离设施点,则为设施点所在时区。
    • 如果将时间用法设置为起始时间出行方向设置为朝向设施点,则为事件点所在时区。
    • 如果将时间用法设置为结束时间出行方向设置为远离设施点,则为事件点所在时区。
    • 如果将时间用法设置为结束时间出行方向设置为朝向设施点,则为设施点所在时区。
  • UTC时间参数是指协调世界时间 (UTC)。 如果您想要在指定时间内(如现在)找到最近位置,但不确定设施点或事件点所在的时区,请选择此选项。
String
时间用法
(可选)

指定时间参数值是表示路径的到达时间还是出发时间。

  • 开始时间时间参数值可理解为从设施点或事件点出发的时间。 这是默认设置。当选择此设置时,时间参数表示求解程序将基于给定离开时间找到最佳路径。
  • 结束时间时间参数值可理解为到达设施点或事件点的时间。如果您想知道从一个地点的出发时间,从而能在时间参数中所指定的时间到达目的地,此选项将十分有用。
String
线状
(可选)

为分析所输出的路径要素指定要使用的形状类型。

无论选择何种输出 shape 类型,最佳路径始终由网络阻抗(而非欧氏距离)决定。 这表示只是路径形状不同,而对网络进行的基础遍历则相同。

  • 沿网络输出路径将具有基础网络源的精确形状。 输出包括线性参考的路径测量值。 测量值从第一个停靠点增加并将记录到达指定位置的累积阻抗。
  • 无线将不会为输出路径生成任何形状。
  • 直线输出路径形状为两个停靠点之间的一条直线。
String
累积属性
(可选)

分析过程中要累积的成本属性的列表。 这些累积属性仅供参考;求解程序仅使用求解分析时指定的出行模式所使用的成本属性。

对于每个累积的成本属性,会在网络分析输出要素中填充 Total_[阻抗] 属性。

如果网络数据源为 ArcGIS Online 服务,或如果网络数据源是不支持累积的 Portal for ArcGIS 版本上的服务,则此参数不可用。

String
根据求解生成方向
(可选)

指定是否将生成方向。

  • 选中 - 求解时会生成转向指示。
  • 未选中 - 求解时不会生成转向指示。 这是默认设置。

对于不需要生成转向指示的分析,保持此选项的未选中状态可以减少求解分析的时间。

Boolean
忽略求解时无效的位置
(可选)

指定是否忽略无效的输入位置。 通常,如果无法在网络上定位,则位置无效。 当无效位置被忽略时,求解器将跳过它们并尝试使用剩余位置执行分析。

  • 选中 - 将忽略无效的输入位置,并且仅使用有效的位置。 这是默认设置。
  • 未选中 - 将使用所有输入位置。 无效的位置将导致分析失败。
Boolean

派生输出

标注说明数据类型
网络分析图层

新创建的网络分析图层。

Network Analyst Layer

arcpy.management.MakeClosestFacilityAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {travel_direction}, {cutoff}, {number_of_facilities_to_find}, {time_of_day}, {time_zone}, {time_of_day_usage}, {line_shape}, {accumulate_attributes}, {generate_directions_on_solve}, {ignore_invalid_locations})
名称说明数据类型
network_data_source

将对其执行网络分析的网络数据集或服务。 将门户 URL 用于服务。

Network Dataset Layer;String
layer_name
(可选)

要创建的网络分析图层的名称。

String
travel_mode
(可选)

分析中使用的出行模式名称。 出行模式为一组网络设置(例如行驶限制和 U 形转弯),用于确定行人、车辆、卡车或其他交通媒介在网络中的移动方式。 出行模式在网络数据源中进行定义。

arcpy.na.TravelMode 对象和包含出行模式有效 JSON 表示的字符串也可用作参数的输入。

String
travel_direction
(可选)

指定设施点与事件点之间的行驶方向。

  • TO_FACILITIES行驶方向 - 从事件点到设施点。 零售店通常使用该设置,因为他们需要关注购物者(事件点)到达商店(设施点)所需的时间。 这是默认设置。
  • FROM_FACILITIES行驶方向 - 从设施点到事件点。 消防部门通常使用该设置,因为他们需要关注从消防站(设施点)行驶到紧急救援位置(事件点)所需的时间。

如果网络包含基于出行方向的单行道或抗阻,则出行方向可能会影响找到的设施点。 例如,从特定事件点到特定设施点驾车可能需要 10 分钟,但是从另一个方向,即设施点到时间点可能需要 15 分钟,因为存在单行线或交通状况不同。

String
cutoff
(可选)

抗阻值到达该值后将停止搜索指定事件点的设施点(以 travel_mode 值使用的抗阻属性为单位)。 travel_direction = 'TO_FACILITIES' 时,可在事件点子图层中指定各个中断值以按事件点覆盖中断,travel_direction = 'FROM_FACILITIES' 时,可在设施点子图层中指定各个中断值以按设施点覆盖中断。默认情况下,分析不使用中断。

Double
number_of_facilities_to_find
(可选)

要按事件点查找的最近设施点数。 可通过在事件点子图层中指定 TargetFacilityCount 属性的各个值来覆盖此默认值。 要查找的设施点默认数量为一。

Long
time_of_day
(可选)

路径开始或结束的时间和日期。 对该值的解释取决于是将 time_of_day_usage 设置为路径的起始时间还是终止时间。

如果您选择基于流量的阻抗属性,将会根据特定的某天某时的动态交通状况来生成解决方案。 日期和时间可被指定为 5/14/2012 10:30 AM。

将您的分析配置为使用以下特殊日期之一来模拟一周中的某天或当前日期,而不是特定的静态日期:

  • 今天 - 12/30/1899
  • 星期日 - 12/31/1899
  • 星期一 - 1/1/1900
  • 星期二 - 1/2/1900
  • 星期三 - 1/3/1900
  • 星期四 - 1/4/1900
  • 星期五 - 1/5/1900
  • 星期六 - 1/6/1900

了解如何在网络分析中使用和解释日期和时间的详细细腻

Date
time_zone
(可选)

指定 time_of_day 参数的时区。

  • LOCAL_TIME_AT_LOCATIONStime_of_day 参数采用设施点或事件点所处的时区。 这是默认设置。
    • 如果将 time_of_day_usage 设置为 START_TIMEtravel_direction 设置为 FROM_FACILITIES,则为设施点所在时区。
    • 如果将 time_of_day_usage 设置为 START_TIMEtravel_direction 设置为 TO_FACILITIES,则为事件点所在时区。
    • 如果将 time_of_day_usage 设置为 END_TIMEtravel_direction 设置为 FROM_FACILITIES,则为事件点所在时区。
    • 如果将 time_of_day_usage 设置为 END_TIMEtravel_direction 设置为 TO_FACILITIES,则为设施点所在时区。
  • UTCtime_of_day 参数采用协调世界时间 (UTC)。 如果您想要在指定时间内(如现在)找到最近位置,但不确定设施点或事件点所在的时区,请选择此选项。
String
time_of_day_usage
(可选)

指定 time_of_day 参数值是表示路径的到达时间还是出发时间。

  • START_TIMEtime_of_day 参数值可理解为从设施点或事件点出发的时间。 这是默认设置。当选择此设置时,time_of_day 参数表示求解程序将基于给定离开时间找到最佳路径。
  • END_TIMEtime_of_day 参数值可理解为到达设施点或事件点的时间。如果您想知道从一个地点的出发时间,从而能在 time_of_day 参数所指定的时间到达目的地,该选项将十分有用。
String
line_shape
(可选)

为分析所输出的路径要素指定要使用的形状类型。

无论选择何种输出 shape 类型,最佳路径始终由网络阻抗(而非欧氏距离)决定。 这表示只是路径形状不同,而对网络进行的基础遍历则相同。

  • ALONG_NETWORK输出路径将具有基础网络源的精确形状。 输出包括线性参考的路径测量值。 测量值从第一个停靠点增加并将记录到达指定位置的累积阻抗。
  • NO_LINES将不会为输出路径生成任何形状。
  • STRAIGHT_LINES输出路径形状为两个停靠点之间的一条直线。
String
accumulate_attributes
[accumulate_attributes,...]
(可选)

分析过程中要累积的成本属性的列表。 这些累积属性仅供参考;求解程序仅使用求解分析时指定的出行模式所使用的成本属性。

对于每个累积的成本属性,会在网络分析输出要素中填充 Total_[阻抗] 属性。

如果网络数据源为 ArcGIS Online 服务,或如果网络数据源是不支持累积的 Portal for ArcGIS 版本上的服务,则此参数不可用。

String
generate_directions_on_solve
(可选)

指定运行分析时是否生成方向。

  • DIRECTIONS求解时会生成转向指示。
  • NO_DIRECTIONS求解时不会生成转向指示。 这是默认设置。

对于不需要生成转向指示的分析,请使用默认选项 NO_DIRECTIONS 以减少求解分析的时间。

Boolean
ignore_invalid_locations
(可选)

指定是否忽略无效的输入位置。 通常,如果无法在网络上定位,则位置无效。 当无效位置被忽略时,求解器将跳过它们并尝试使用剩余位置执行分析。

  • SKIP无效的输入位置将被忽略,只使用有效的位置。 这是默认设置。
  • HALT将使用所有输入位置。 无效的位置将导致分析失败。
Boolean

派生输出

名称说明数据类型
out_network_analysis_layer

新创建的网络分析图层。

Network Analyst Layer

代码示例

MakeClosestFacilityAnalysisLayer 示例 1(Python 窗口)

仅使用必需参数运行此工具。

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeClosestFacilityAnalysisLayer(network, "ClosestFireStations")
MakeClosestFacilityAnalysisLayer 示例 2(Python 窗口)

使用所有参数运行此工具

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeClosestFacilityAnalysisLayer(network, "ClosestHospitals",
                                "Driving Time", "TO_FACILITIES", 5, 3,
                                "1/1/1900 9:00 AM", "UTC", "START_TIME",
                                "ALONG_NETWORK", ["Meters", "TravelTime"])
MakeClosestFacilityAnalysisLayer 示例 3(独立脚本)

以下独立 Python 脚本演示了如何使用 MakeClosestFacilityAnalysisLayer 函数查找距商店位置最近的仓库。

# Name: MakeClosestFacilityAnalysisLayer_Workflow.py
# Description: Find the closest warehouse from the store locations and save the
#              results to a layer file on disk.
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import os

try:
    #Check out Network Analyst license if available. Fail if the Network Analyst license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")
    
    #Set environment settings
    output_dir = "C:/Data"
    #The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    env.overwriteOutput = True

    #Set local variables
    input_gdb = "C:/Data/Paris.gdb"
    network = os.path.join(input_gdb, "Transportation", "ParisMultimodal_ND")
    layer_name = "ClosestWarehouse"
    travel_mode = "Driving Time"
    facilities = os.path.join(input_gdb, "Analysis", "Warehouses")
    incidents = os.path.join(input_gdb, "Analysis", "Stores")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new closest facility analysis layer. 
    result_object = arcpy.na.MakeClosestFacilityAnalysisLayer(network,
                                    layer_name, travel_mode, "TO_FACILITIES",
                                    number_of_facilities_to_find=1)

    #Get the layer object from the result object. The closest facility layer can
    #now be referenced using the layer object.
    layer_object = result_object.getOutput(0)

    #Get the names of all the sublayers within the closest facility layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    facilities_layer_name = sublayer_names["Facilities"]
    incidents_layer_name = sublayer_names["Incidents"]

    #Load the warehouses as Facilities using the default field mappings and
    #search tolerance
    arcpy.na.AddLocations(layer_object, facilities_layer_name,
                            facilities, "", "")

    #Load the stores as Incidents. Map the Name property from the NOM field
    #using field mappings
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                    incidents_layer_name)
    field_mappings["Name"].mappedFieldName = "NOM"
    arcpy.na.AddLocations(layer_object, incidents_layer_name, incidents,
                          field_mappings, "")

    #Solve the closest facility layer
    arcpy.na.Solve(layer_object)

    #Save the solved closest facility layer as a layer file on disk
    layer_object.saveACopy(output_layer_file)

    print("Script completed successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback, sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))