arcpy.na.MakeServiceAreaLayer(in_network_dataset, out_network_analysis_layer, impedance_attribute, {travel_from_to}, {default_break_values}, {polygon_type}, {merge}, {nesting_type}, {line_type}, {overlap}, {split}, {excluded_source_name}, {accumulate_attribute_name}, {UTurn_policy}, {restriction_attribute_name}, {polygon_trim}, {poly_trim_value}, {lines_source_fields}, {hierarchy}, {time_of_day})
|
名称
|
说明
|
数据类型
|
|
in_network_dataset
|
执行服务区分析所依托的网络数据集。
|
Network Dataset Layer
|
|
out_network_analysis_layer
|
要创建的服务区网络分析图层的名称。
|
String
|
|
impedance_attribute
|
分析过程中将用作阻抗的成本属性。
|
String
|
|
travel_from_to
(可选)
|
指定行至或离开设施点的方向。
使用此选项的结果是,在基于行驶方向的网络中,单向限制及不同行驶方向的阻抗差异会产生不同的服务区。 例如,应该在远离设施点的方向上创建比萨外卖店的服务区,而医院的服务区应该创建在朝向设施点的方向上。
|
String
|
|
default_break_values
(可选)
|
指示要计算的服务区范围的默认阻抗值。 在设施点上指定中断值可覆盖默认中断值。
可以设置多个面中断来创建同心服务区。 例如,要为同一设施点查找 2 分钟、3 分钟和 5 分钟服务区,请将“默认中断值”参数指定为“2 3 5”(2、3 和 5 这些数字之间应该以空格分隔)。
|
String
|
|
polygon_type
(可选)
|
指定要生成的面类型。
如果您的数据来自一个路网类似格网的市区,则概化面和详细面之间的差异十分细微。 但是,如果涉及山区和农村道路,那么详细面表示的结果可能要比概化面更加精确。
SIMPLE_POLYS—创建生成速度快并且相当精确的概化面,边缘除外。 这是默认设置。
DETAILED_POLYS—创建详细面,用于对服务区线进行精确建模并且可包含未到达的岛状区域。 这种面比概化面的生成速度慢。
NO_POLYS—如果仅需要服务区线,则关闭面生成。
|
String
|
|
merge
(可选)
|
指定用来合并共享相似中断值的面的选项。 此选项仅适用于为多个设施点生成面的情况。
NO_MERGE—为各个设施点创建单独的面。 这些面可以相互叠置。
NO_OVERLAP—为各个设施点创建最接近的单独面。 这些面不会相互叠置。
MERGE—针对拥有相同中断值的多个设施点,连接其面。
|
String
|
|
nesting_type
(可选)
|
指定该选项,将同心服务区面创建为圆或环。 仅当为设施点指定多个中断值时,此选项才适用。
|
String
|
|
line_type
(可选)
|
指定基于服务区分析生成的线的类型。 对于大型服务区,选择 TRUE_LINES 或 TRUE_LINES_WITH_MEASURES 选项将增加分析所占用的内存量。
|
String
|
|
overlap
(可选)
|
确定计算服务区线时是否生成重叠线。
|
Boolean
|
|
split
(可选)
|
确定是否应在中断值处分割线要素。
|
Boolean
|
|
excluded_source_name
[excluded_source_name,...]
(可选)
|
指定生成面时要排除的网络源的列表。 将从所有面中忽略来自排除源的遍历元素的几何。
在生成面的过程中,如果需要排除某些会创建低精度的面或者对服务区分析无关紧要的网络源时,此选项十分有用。 例如,在包含街道和铁路的多模式网络中创建行驶时间服务区时,应选择在面生成过程中排除铁路线,以便对车辆可达行驶区域进行正确建模。
从服务区面中排除网络源时,不会阻止遍历这些源。 从服务区面中排除网络源仅影响服务区的面形状。 如果要阻止遍历给定网络源,必须在定义网络数据集时创建适当的限制。
|
String
|
|
accumulate_attribute_name
[accumulate_attribute_name,...]
(可选)
|
分析过程中要累积的成本属性的列表。 这些累积属性仅供参考;求解程序仅使用阻抗属性参数所指定的成本属性来计算路径。
对于每个累积的成本属性,均会向求解程序所输出的路径中添加一个 Total_ [阻抗] 属性。
|
String
|
|
UTurn_policy
(可选)
|
指定将在交汇点处使用的 U 形转弯策略。 允许 U 形转弯表示求解程序可以在交汇点处转向并沿同一街道往回行驶。 考虑到交汇点表示街道交叉路口和死角,不同的车辆可以在某些交汇点转弯,而在其他交汇点则不行 - 这取决于交汇点是交叉路口还是死角。 为适应此情况,U 形转弯策略参数由与交汇点连通的边数隐性指定,这称为交汇点原子价。 此参数可接受的值如下所列;每个值的后面是根据交汇点价对其含义的描述。
如果您需要定义更加精确的 U 形转弯策略,可以考虑在网络成本属性中添加一个通用转弯延迟赋值器,或者如果存在的话,调整其设置,并特别注意反向转弯的配置。 还可以设置网络位置的 CurbApproach 属性。
ALLOW_UTURNS—无论在交汇点处有几条连接的边,均允许 U 形转弯。 这是默认值。
NO_UTURNS—在所有交汇点处均禁止 U 形转弯,不管交汇点原子价如何。 但是,即使已指定该选项,在网络位置仍允许 U 形转弯;但是也可以通过设置个别网络位置的 CurbApproach 属性来禁止 U 形转弯。
ALLOW_DEAD_ENDS_ONLY—除仅有一条相邻边的交汇点(死角)外,其他交汇点均禁止 U 形转弯。
ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY—在恰好有两条相邻边相遇的交汇点处禁止 U 形转弯,但是交叉点(三条或三条以上相邻边的交汇点)和死角(仅有一条相邻边的交汇点)处允许。 通常,网络在路段中间有多余的交汇点。 此选项用于阻止车辆在这些位置进行 U 形转弯。
|
String
|
|
restriction_attribute_name
[restriction_attribute_name,...]
(可选)
|
分析期间要应用的限制属性列表。
|
String
|
|
polygon_trim
(可选)
|
是否应对输出面进行修剪。
|
Boolean
|
|
poly_trim_value
(可选)
|
指定对服务区面进行修剪的距离范围。 该参数包括距离的值和单位。 默认值是 100 米。
|
Linear Unit
|
|
lines_source_fields
(可选)
|
网络源字段是否应包括在输出线中。
LINES_SOURCE_FIELDS—向服务区线添加 SourceID、SourceOID、FromPosition 和 ToPosition 字段,以保存分析过程中已遍历的基础源要素的信息。 如需将服务区线的结果连接到原始源数据,这将非常有用。
NO_LINES_SOURCE_FIELDS—不向服务区线添加源字段(SourceID、SourceOID、FromPosition 和 ToPosition)。
|
Boolean
|
|
hierarchy
(可选)
|
如果未在用于执行分析的网络数据集中定义等级属性,该参数将不可用。
|
Boolean
|
|
time_of_day
(可选)
|
离开或到达服务区图层的设施点的时间。 将此值理解为离开还是到达时间,取决于行驶方向是离开还是朝向设施点。
如果您已经选择了基于流量的阻抗属性,将会根据特定的某天某时的动态交通状况来生成解决方案。 日期和时间可被指定为 5/14/2012 10:30 AM。
可使用以下日期来指定一周中的每一天,而无需使用特定的日期。
Today—12/30/1899
Sunday—12/31/1899
Monday—1/1/1900
Tuesday—1/2/1900
Wednesday—1/3/1900
Thursday—1/4/1900
Friday—1/5/1900
Saturday—1/6/1900
例如,要指定行程从星期二 5:00 PM 开始,则请将该参数值指定为 1/2/1900 5:00 PM。
重复解决相同的分析问题,但使用不同的“时间”参数值,这样您就会看到设施点的到达时间随时间的变化。 例如,全天中消防站周围的五分钟服务区在大清早时可能变得大一点,而在早高峰期消失,上午晚些时候服务区又扩大等等。
|
Date
|
派生输出
|
名称
|
说明
|
数据类型
|
|
output_layer
|
新创建的网络分析图层。
|
Network Analyst Layer
|
代码示例
MakeServiceAreaLayer 示例 1(Python 窗口)
仅使用必需参数运行该工具。
network = "C:/Data/SanFrancisco.gdb/Transportation/Streets_ND"
arcpy.na.MakeServiceAreaLayer(network, "FireStationCoverage", "TravelTime")
MakeServiceAreaLayer 示例 2(Python 窗口)
使用所有参数运行该工具。
network = "C:/Data/Paris.gdb/Transportation/ParisMultimodal_ND"
arcpy.na.MakeServiceAreaLayer(network, "WarehouseCoverage", "DriveTime",
"TRAVEL_FROM", "5 10 15", "SIMPLE_POLYS",
"NO_OVERLAP", "RINGS", "TRUE_LINES",
"NON_OVERLAP", "NO_SPLIT",
["Metro_Lines", "Transfer_Stations",
"Transfer_Street_Station"],
["Meters", "DriveTime"], "ALLOW_DEAD_ENDS_ONLY",
["Oneway"], "NO_TRIM_POLYS", "",
"LINES_SOURCE_FIELDS")
MakeServiceAreaLayer 示例 3(工作流)
以下独立 Python 脚本演示了如何使用 MakeServiceAreaLayer 函数在消防站周围生成 1 分钟、2 分钟和 3 分钟服务区。
# Name: MakeServiceAreaLayer_Workflow.py
# Description: Generate 1-,2-,3- minute service areas around fire stations and
# save the results to a layer file on disk. The service area
# polygons can be used to visualize the areas that do not have
# adequate coverage from the fire stations
# Requirements: Network Analyst extension
#Import system modules
import arcpy
from arcpy import env
import os
try:
#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 = "FireStationCoverage"
impedance = "TravelTime"
facilities = os.path.join(input_gdb, "Analysis", "FireStations")
output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")
#Create a new service area layer. We wish to generate the service area
#polygons as rings, so that we can easily visualize the coverage for any
#given location. We also want overlapping polygons as we can determine the
#number of fire stations that cover a given location. We use hierarchy to
#speed up the time taken to create the polygons. We will specify these
#options while creating the new service area layer.
result_object = arcpy.na.MakeServiceAreaLayer(network, layer_name,
impedance, "TRAVEL_FROM", "1 2 3",
"DETAILED_POLYS", "NO_MERGE", "RINGS")
#Get the layer object from the result object. The service layer can now be
#referenced using the layer object.
layer_object = result_object.getOutput(0)
#Get the names of all the sublayers within the service area layer.
sublayer_names = arcpy.na.GetNAClassNames(layer_object)
#Stores the layer names that we will use later
facilities_layer_name = sublayer_names["Facilities"]
#Load the fire stations as facilities using default field mappings and
#default search tolerance
arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities, "",
"")
#Solve the service area layer
arcpy.na.Solve(layer_object)
#Save the solved service area 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)))
MakeServiceAreaLayer 示例 4(工作流)
本例展示了如何在一天的多个时间点内在设施点周边创建服务区,以及如何将字段从输入要素移到输出要素并将输出面追加到现有要素类中。
# Name: MakeServiceAreaLayer_Workflow2.py
# Description: Generate 3-minute service areas around fire stations at several
# times of day to compare coverage differences due to varying
# traffic conditions. Save the results to a feature class on disk.
# Requirements: Network Analyst extension
#Import system modules
import arcpy
from arcpy import env
import os
import datetime
try:
#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 = "FireStationCoverage"
out_featureclass = os.path.join(output_dir, "Output.gdb",
"FireStationCoverage")
impedance = "TravelTime"
facilities = os.path.join(input_gdb, "Analysis", "FireStations")
times_of_day = [datetime.datetime(2014, 9, 25, 7, 0, 0),
datetime.datetime(2014, 9, 25, 12, 30, 0),
datetime.datetime(2014, 9, 25, 17, 30, 0),
datetime.datetime(2014, 9, 25, 21, 0, 0)]
#Create a new service area layer.
result_object = arcpy.na.MakeServiceAreaLayer(network, layer_name,
impedance, "TRAVEL_FROM", "3",
"DETAILED_POLYS", "NO_MERGE",
hierarchy = "NO_HIERARCHY")
#Get the layer object from the result object. The service area layer can
#now be referenced using the layer object.
layer_object = result_object.getOutput(0)
#Get the names of all the sublayers within the service area layer.
sublayer_names = arcpy.na.GetNAClassNames(layer_object)
#Stores the layer names that we will use later
facilities_layer_name = sublayer_names["Facilities"]
polygons_layer_name = sublayer_names["SAPolygons"]
#The input data has a field for FireStationID that we want to transfer to
#our analysis layer. Add the field, and then use field mapping to transfer
#the values.
arcpy.na.AddFieldToAnalysisLayer(layer_object, facilities_layer_name,
"FireStationID", "TEXT")
field_mappings = arcpy.na.NAClassFieldMappings(layer_object,
facilities_layer_name)
field_mappings["FireStationID"].mappedFieldName = "FireStationID"
#Load the fire stations as facilities.
arcpy.na.AddLocations(layer_object, facilities_layer_name, facilities,
field_mappings, "",
exclude_restricted_elements = "EXCLUDE")
# Add fields to the output Polygons sublayer for later use.
arcpy.na.AddFieldToAnalysisLayer(layer_object, polygons_layer_name,
"FireStationID", "TEXT")
arcpy.na.AddFieldToAnalysisLayer(layer_object, polygons_layer_name,
"TimeOfDay", "TEXT")
#Get sublayers to work with later
facilities_sublayer = layer_object.listLayers(facilities_layer_name)[0]
polygons_sublayer = layer_object.listLayers(polygons_layer_name)[0]
#Get the Service Area Layer's solver properties. This can be used to
#set individual properties later without re-creating the layer.
solver_properties = arcpy.na.GetSolverProperties(layer_object)
#Solve the Service Area for each time of day in the time list
for t in times_of_day:
print("Calculating service area for time of day: ", t)
#Use the solver properties to set the time of day for the solve
solver_properties.timeOfDay = t
#Solve the service area layer
arcpy.na.Solve(layer_object)
#Transfer the FireStationID field from the input Facilities to the
#output Polygons
arcpy.management.AddJoin(polygons_sublayer, "FacilityID",
facilities_sublayer, "ObjectID")
#The joined fields are qualified by the feature class name of the joined
#table, so determine the feature class names
field_qualifier_pol = os.path.basename(polygons_sublayer.dataSource)
target_field_name = "%s.FireStationID" % field_qualifier_pol
field_qualifier_fac = os.path.basename(facilities_sublayer.dataSource)
expression = "!%s.FireStationID!" % field_qualifier_fac
arcpy.management.CalculateField(polygons_sublayer, target_field_name,
expression, "PYTHON")
arcpy.management.RemoveJoin(polygons_sublayer)
#Populate the TimeOfDay field in the output feature class
expression = '"' + str(t) + '"'
arcpy.management.CalculateField(polygons_sublayer, "TimeOfDay",
expression, "PYTHON")
#Append the polygons to the output feature class. If this was the first
#solve, create the feature class.
if not arcpy.Exists(out_featureclass):
arcpy.management.CopyFeatures(polygons_sublayer, out_featureclass)
else:
arcpy.management.Append(polygons_sublayer, out_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))