创建路径分析图层 (Network Analyst)

描述

创建路径网络分析图层并设置其分析属性。路径分析图层可用于根据指定的网络成本确定一组网络位置之间的最佳路径。该图层可通过本地网络数据集进行创建,也可通过在线托管路径服务或门户托管路径服务进行创建。

使用方法

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

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

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

语法

MakeRouteAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {sequence}, {time_of_day}, {time_zone}, {line_shape}, {accumulate_attributes}, {generate_directions_on_solve}, {time_zone_for_time_fields})
参数说明数据类型
network_data_source

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

Network Dataset Layer;String
layer_name
(可选)

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

String
travel_mode
(可选)

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

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

String
sequence
(可选)

指定在计算最佳路径时是否必须以特定顺序访问输入停靠点。此选项将路径分析由最短路径问题变为流动推销员问题 (TSP)。

  • USE_CURRENT_ORDER将按照输入顺序访问停靠点。这是默认设置。
  • FIND_BEST_ORDER将重新排序停靠点以查找最佳路径。此选项将路径分析由最短路径问题变为流动推销员问题 (TSP)。
  • PRESERVE_BOTH按输入顺序保留第一个停靠点和最后一个停靠点。将重新排序其余的停靠点以查找最佳路径。
  • PRESERVE_FIRST按输入顺序保留第一个停靠点。将重新排序其余的停靠点以查找最佳路径。
  • PRESERVE_LAST按输入顺序保留最后一个停靠点。将重新排序其余的停靠点以查找最佳路径。
String
time_of_day
(可选)

路径的开始日期和时间。路径开始时间通常用于查找阻抗属性随当日时间变化的路径。例如,开始时间 7:00 a.m. 可用于查找被认为是高峰时段流量的路径。此参数的默认值为 8:00 a.m.。可将日期和时间指定为 10/21/05 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

例如,要指定行程从星期二 5:00 p.m. 开始,则请将该参数值指定为 1/2/1900 5:00 PM。

求解结束后,在输出路径中填充路径的开始时间与结束时间。也会在生成方向时使用这些开始时间和结束时间。

Date
time_zone
(可选)

指定 time_of_day 参数的时区。

  • LOCAL_TIME_AT_LOCATIONStime_of_day 参数采用路径的第一个停靠点处的时区。这是默认设置。如果生成开始于多个时区的多个路径,则开始时间会采用协调世界时间 (UTC) 交错。例如,time_of_day 值为 10:00 a.m., 2 January 表示始于东部时区的路径的开始时间为东部标准时间 10:00 a.m. (UTC 为 3:00 p.m.),始于中部时区的路径的开始时间为中部标准时间 10:00 a.m. (UTC 为 4:00 p.m.)。开始时间偏差一小时(UTC 时间)。输出停靠点要素类中记录的到达与离开的时间和日期将采用每个路径第一个停靠点的本地时区。
  • UTCtime_of_day 参数采用协调世界时间 (UTC)。如果您想要在特定的时间(如现在)生成路径,但不确定第一个停靠点所在的时区,请选择此选项。如果您生成跨越多个时区的多个路径,以 UTC 表示的开始时间将发生同步。例如,time_of_day 值为 10:00 a.m., 2 January 表示始于东部时区的路径的开始时间为东部标准时间 5:00 a.m. (UTC 为 10:00 a.m.),始于中部时区的路径的开始时间为中部标准时间 4:00 a.m. (UTC 为 10:00 a.m.)。这两个路径均于 10:00 a.m. UTC 开始。输出停靠点要素类中记录的到达与离开的时间和日期将采用 UTC 时间。
String
line_shape
(可选)

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

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

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

String
accumulate_attributes
[accumulate_attributes,...]
(可选)

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

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

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

String
generate_directions_on_solve
(可选)

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

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

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

Boolean
time_zone_for_time_fields
(可选)

指定将用于解释输入表中包括的时间字段(例如用于时间窗口的字段)的时区。

  • LOCAL_TIME_AT_LOCATIONS停靠点时间字段中的日期和时间将根据停靠点所在的时区进行解释。这是默认设置。
  • UTC停靠点时间字段中的日期和时间采用协调世界时间 (UTC)。
String

派生输出

名称说明数据类型
out_network_analysis_layer

输出网络分析图层。

网络分析图层

代码示例

MakeRouteAnalysisLayer 示例 1(Python 窗口)

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

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

使用所有参数执行此工具。

network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeRouteAnalysisLayer(network, "InspectionRoute", "Driving Time",
                        "FIND_BEST_ORDER", "1/1/1900 9:00 AM", "UTC",
                        "ALONG_NETWORK", ["Meters", "TravelTime"])
MakeRouteAnalysisLayer 示例 3(工作流)

以下独立 Python 脚本演示了如何使用 MakeRouteAnalysisLayer 工具查找访问地理编码停靠点位置的最佳路径。

# Name: MakeRouteAnalysisLayer_Workflow.py
# Description: Find a best route to visit the stop locations and save the
#              route to a layer file. The stop locations are geocoded from a
#              text file containing the addresses.
# 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/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "BestRoute"
    travel_mode = "Driving Time"
    address_locator = "C:/Data/SanFranciscoLocator"
    address_table = "C:/Data/StopAddresses.csv"
    address_fields = "Street Address;City City;State State;ZIP <None>"
    out_stops = "GeocodedStops"
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    #Create a new Route layer. For this scenario, the default values for all the
    #remaining parameters statisfy the analysis requirements
    result_object = arcpy.na.MakeRouteAnalysisLayer(network, layer_name,
                                                                    travel_mode)

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

    #Get the names of all the sublayers within the route layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    stops_layer_name = sublayer_names["Stops"]

    #Geocode the stop locations from a csv file containing the addresses.
    #The Geocode Addresses tool can use a text or csv file as input table
    #as long as the first line in the file contains the field names.
    arcpy.geocoding.GeocodeAddresses(address_table, address_locator,
                                     address_fields, out_stops)

    #Load the geocoded address locations as stops mapping the address field from
    #geocoded stop features as Name property using field mappings.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
                                                            stops_layer_name)
    field_mappings["Name"].mappedFieldName = "Address"
    arcpy.na.AddLocations(layer_object, stops_layer_name, out_stops,
                            field_mappings, "")

    #Solve the route layer, ignoring any invalid locations such as those that
    #cannot be geocoded
    arcpy.na.Solve(layer_object, "SKIP")

    #Save the solved route 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))
MakeRouteAnalysisLayer 示例 4(工作流)

本示例展示如何在单次求解中创建多条路径,这种方法可用于计算起始点-目的地对间的距离或行驶时间。

# Name: MakeRouteAnalysisLayer_MultiRouteWorkflow.py
# Description: Calculate the home-work commutes for a set of people and save
#              the output to a feature class
# Requirements: Network Analyst Extension

#Import system modules
import arcpy
from arcpy import env
import datetime
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/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    stops_home = os.path.join(input_gdb, "Analysis", "Commuters_Home")
    stops_work = os.path.join(input_gdb, "Analysis", "Commuters_Work")
    layer_name = "Commuters"
    out_routes_featureclass = "Commuter_Routes"
    travel_mode = "Driving Time"

    #Set the time of day for the analysis to 8AM on a generic Monday.
    start_time = datetime.datetime(1900, 1, 1, 8, 0, 0)

    #Create a new Route layer.  Optimize on driving time, but compute the
    #distance traveled by accumulating the Meters attribute.
    result_object = arcpy.na.MakeRouteAnalysisLayer(network, layer_name,
                                        travel_mode, time_of_day=start_time,
                                        accumulate_attributes=["Meters"])

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

    #Get the names of all the sublayers within the route layer.
    sublayer_names = arcpy.na.GetNAClassNames(layer_object)
    #Stores the layer names that we will use later
    stops_layer_name = sublayer_names["Stops"]
    routes_layer_name = sublayer_names["Routes"]

    #Before loading the commuters' home and work locations as route stops, set
    #up field mapping.  Map the "Commuter_Name" field from the input data to
    #the RouteName property in the Stops sublayer, which ensures that each
    #unique Commuter_Name will be placed in a separate route.  Matching
    #Commuter_Names from stops_home and stops_work will end up in the same
    #route.
    field_mappings = arcpy.na.NAClassFieldMappings(layer_object, stops_layer_name)
    field_mappings["RouteName"].mappedFieldName = "Commuter_Name"

    #Add the commuters' home and work locations as Stops. The same field mapping
    #works for both input feature classes because they both have a field called
    #"Commuter_Name"
    arcpy.na.AddLocations(layer_object, stops_layer_name, stops_home,
                        field_mappings, "")
    arcpy.na.AddLocations(layer_object, stops_layer_name, stops_work,
                        field_mappings, "", append="APPEND")

    #Solve the route layer.
    arcpy.na.Solve(layer_object)

    # Get the output Routes sublayer and save it to a feature class
    routes_sublayer = layer_object.listLayers(routes_layer_name)[0]
    arcpy.management.CopyFeatures(routes_sublayer, out_routes_featureclass)

    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))

许可信息

  • Basic: 是
  • Standard: 是
  • Advanced: 是

相关主题