创建路径分析图层 (Network Analyst)
摘要
创建路径网络分析图层并设置其分析属性。路径分析图层可用于根据指定的网络成本确定一组网络位置之间的最佳路径。
用法
语法
| 参数 | 说明 | 数据类型 | 
| in_network_dataset | 将在其中执行路径分析的网络数据集。 | Network Dataset Layer | 
| out_network_analysis_layer | 要创建的路径网络分析图层的名称。 | String | 
| impedance_attribute | 分析过程中用作阻抗的成本属性。 | String | 
| find_best_order (可选) | 
 | Boolean | 
| ordering_type (可选) | 当使用 FIND_BEST_ORDER 时,将指定停靠点的顺序。 
 | String | 
| time_windows (可选) | 指定是否在停靠点处使用时间窗。 
 | Boolean | 
| accumulate_attribute_name [accumulate_attribute_name,...] (可选) | 分析过程中要累积的成本属性的列表。这些累积属性仅供参考;求解程序仅使用阻抗属性参数所指定的成本属性来计算路径。 对于每个累积的成本属性,均会向求解程序所输出的路径中添加一个 Total_[阻抗] 属性。 | String | 
| UTurn_policy (可选) | 交汇点的 U 形转弯策略。允许 U 形转弯表示求解程序可以在交汇点处转向并沿同一街道往回行驶。 考虑到交汇点表示街道交叉路口和死角,不同的车辆可以在某些交汇点转弯,而在其他交汇点则不行 - 这取决于交汇点是交叉路口还是死角。为适应此情况,U 形转弯策略参数由连接到交汇点的边数隐性指定,这称为交汇点原子价。此参数可接受的值如下所列;每个值的后面是根据交汇点原子价对其含义的描述。 
  提示: 如果您需要定义更加精确的 U 形转弯策略,可以考虑在网络成本属性中添加一个通用转弯延迟赋值器,或者如果存在的话,调整其设置,并特别注意反向转弯的配置。还要考虑设置网络位置的 CurbApproach 属性。 | String | 
| restriction_attribute_name [restriction_attribute_name,...] (可选) | 分析过程中要应用的限制属性的列表。 | String | 
| hierarchy (可选) | 
 如果未在用于执行分析的网络数据集中定义等级属性,该参数将不可用。在这种情况下,使用 "#" 作为参数值。 | Boolean | 
| hierarchy_settings (可选) | 
  法律声明: 在版本 10 之前,可使用此参数将网络数据集中建立的默认等级范围更改为其他范围以用于分析。而版本 10 中不再支持此参数,并且应将其指定为空字符串。如果您要更改等级范围以进行分析,请更新网络数据集中的默认等级范围。 | Network Analyst Hierarchy Settings | 
| output_path_shape (可选) | 为分析所输出的路径要素指定形状类型。 
 无论选择何种输出形状类型,最佳路径始终由网络阻抗(而非欧氏距离)决定。只是对路径形状的表现不同,而对网络进行的基础遍历则相同。 | String | 
| start_date_time (可选) | 指定路径的开始日期和时间。路径开始时间通常用于查找阻抗属性随当日时间变化的路径。例如,开始时间 9 AM 可用于查找被认为是高峰时段流量的路径。此参数的默认值为 8:00 AM。可将日期和时间指定为 10/21/05 10:30 AM。如果路径历时多天,则仅指定开始时间,然后使用当前日期。 可使用以下日期来指定一周中的每一天,而无需使用特定的日期。 
 求解结束后,在输出路径中填充路径的开始时间与结束时间。也会在生成方向时使用这些开始时间和结束时间。 | Date | 
代码实例
仅使用必需参数执行此工具。
import arcpy
arcpy.env.workspace = "C:/ArcTutor/Network Analyst/Tutorial/SanFrancisco.gdb"
arcpy.na.MakeRouteLayer("Transportation/Streets_ND","WorkRoute","Minutes")
使用所有参数执行此工具。
import arcpy
arcpy.env.workspace = "C:/ArcTutor/Network Analyst/Tutorial/SanFrancisco.gdb"
arcpy.na.MakeRouteLayer("Transportation/Streets_ND","InspectionRoute","Minutes",
                        "FIND_BEST_ORDER","PRESERVE_BOTH","USE_TIMEWINDOWS",
                        ["Meters","Minutes"],
                        "ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY",["Oneway"],
                        "USE_HIERARCHY","","TRUE_LINES_WITH_MEASURES",
                        "1/1/1900 9:00 AM")
以下独立 Python 脚本演示了如何使用创建路径分析图层 (MakeRouteLayer 示例) 工具查找最佳路径以访问地理编码的停靠点位置。
# Name: MakeRouteLayer_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
try:
    #Check out the Network Analyst extension license
    arcpy.CheckOutExtension("Network")
    #Set environment settings
    env.workspace = "C:/data/SanFrancisco.gdb"
    env.overwriteOutput = True
    
    #Set local variables
    inNetworkDataset = "Transportation/Streets_ND"
    outNALayerName = "BestRoute"
    impedanceAttribute = "TravelTime"
    inAddressLocator = "SanFranciscoLocator"
    inAddressTable = "C:/data/StopAddresses.csv"
    inAddressFields = "Street Address VISIBLE NONE"
    outStops = "GeocodedStops"
    outLayerFile = "C:/data/output" + "/" + outNALayerName + ".lyr"
    
    #Create a new Route layer. For this scenario, the default value for all the
    #remaining parameters statisfies the analysis requirements
    outNALayer = arcpy.na.MakeRouteLayer(inNetworkDataset, outNALayerName,
                                         impedanceAttribute)
    
    #Get the layer object from the result object. The route layer can now be
    #referenced using the layer object.
    outNALayer = outNALayer.getOutput(0)
    
    #Get the names of all the sublayers within the route layer.
    subLayerNames = arcpy.na.GetNAClassNames(outNALayer)
    #Stores the layer names that we will use later
    stopsLayerName = subLayerNames["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(inAddressTable, inAddressLocator, 
                                     inAddressFields, outStops)
    
    #Load the geocoded address locations as stops mapping the address field from
    #geocoded stop features as Name property using field mappings.
    fieldMappings = arcpy.na.NAClassFieldMappings(outNALayer, stopsLayerName)
    fieldMappings["Name"].mappedFieldName = "Address"
    arcpy.na.AddLocations(outNALayer, stopsLayerName, outStops, fieldMappings,
                          "", exclude_restricted_elements = "EXCLUDE")
    
    #Solve the route layer, ignore any invalid locations such as those that
    #can not be geocoded
    arcpy.na.Solve(outNALayer,"SKIP")
    
    #Save the solved route layer as a layer file on disk with relative paths
    arcpy.management.SaveToLayerFile(outNALayer,outLayerFile,"RELATIVE")
    
    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 occured on line %i" % tb.tb_lineno
    print str(e)
本例在单次求解中创建多条路径,常用于计算起始点-目的地对间的距离或行驶时间。
# Name: MakeRouteLayer_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 datetime
#Import system modules
import arcpy
from arcpy import env
try:
    #Check out the Network Analyst extension license
    arcpy.CheckOutExtension("Network")
    #Set environment settings
    env.workspace = "C:/Data/SanFrancisco.gdb"
    env.overwriteOutput = True
    #Set local variables
    inNetworkDataset = "Transportation/Streets_ND"
    inStops_Home = "Analysis/Commuters_Home"
    inStops_Work = "Analysis/Commuters_Work"
    outNALayerName = "Commuters"
    outRoutesFC = "Analysis/outRoutes"
    impedanceAttribute = "TravelTime"
    #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 TravelTime, but compute the
    #distance traveled by accumulating the Meters attribute.
    outRouteResultObject = arcpy.na.MakeRouteLayer(inNetworkDataset, outNALayerName,
                                         impedanceAttribute,
                                         accumulate_attribute_name=["Meters"],
                                         hierarchy="NO_HIERARCHY",
                                         start_date_time=start_time)
    #Get the layer object from the result object. The route layer can now be
    #referenced using the layer object.
    outNALayer = outRouteResultObject.getOutput(0)
    #Get the names of all the sublayers within the route layer.
    subLayerNames = arcpy.na.GetNAClassNames(outNALayer)
    #Store the layer names that we will use later
    stopsLayerName = subLayerNames["Stops"]
    routesLayerName = subLayerNames["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 inStops_Home and inStops_Work will end up in the same
    #route.
    fieldMappings = arcpy.na.NAClassFieldMappings(outNALayer, stopsLayerName)
    fieldMappings["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(outNALayer, stopsLayerName, inStops_Home,
                        fieldMappings, "",
                        exclude_restricted_elements = "EXCLUDE")
    arcpy.na.AddLocations(outNALayer, stopsLayerName, inStops_Work,
                        fieldMappings, "",
                        exclude_restricted_elements = "EXCLUDE")
    #Solve the route layer.
    arcpy.na.Solve(outNALayer)
    # Get the output Routes sublayer and save it to a feature class
    RoutesSubLayer = arcpy.mapping.ListLayers(outNALayer, routesLayerName)[0]
    arcpy.management.CopyFeatures(RoutesSubLayer, outRoutesFC)
    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 occured on line %i" % tb.tb_lineno
    print str(e)