可以使用 Network Analyst 模块 arcpy.nax 在 Python 中执行网络分析。 此模块提供对六种分析类型的访问权限。 对于每种分析(也称为求解器),可使用特定于该分析的两个对象:一个对象用于初始化分析、设置分析设置、加载输入和执行分析,另一个对象用于在执行分析后处理分析结果。
可以使用分析对象的属性来修改分析设置,例如出行模式。 分析对象还具有多种用于加载输入和执行分析的方法。 借助结果对象的方法,可以访问并保存分析输出。
请参阅 ServiceArea 分析对象和 ServiceAreaResult 结果对象的属性和方法的完整列表。
注:
本主题以服务区分析为例;但是,此处提供的信息可以应用于任何类型的网络分析。
要执行网络分析,请遵循以下五步工作流:
- 初始化分析。
- 设置分析的属性。
- 加载输入。
- 求解分析。
- 处理结果。
初始化分析
要初始化分析,您必须指定道路网。 道路网的选项如下:
- 网络数据集 - 此选项要求您具有 ArcGIS Network Analyst extension 和网络数据集。 可以使用网络数据集的完整目录路径或使用 MakeNetworkDatasetLayer 函数基于网络数据集创建的网络数据集图层名称来指定网络数据集。
- 门户服务 - 此选项需要具有路径选择权限和足够配额的 ArcGIS Online 帐户或者已配置 ArcGIS Enterprise 路径选择服务的门户。 在运行此脚本之前,您必须登录到该门户。
提示:
要在使用网络数据集时获得最佳性能,请在初始化分析时使用网络数据集图层的名称。 如果使用目录路径,则每次初始化分析时都会打开网络数据集。 打开网络数据集非常耗时,因为数据集包含读取和缓存的高级数据结构和表。 如果使用同一图层,则网络数据集图层将仅打开数据集一次,从而提高性能。
以下代码片段显示了如何使用网络数据集初始化服务区分析:
import arcpy
nd_path = "C:/data/NorthAmerica.gdb/Routing/Routing_ND"
nd_layer_name = "NorthAmerica"
# Create a network dataset layer. The layer will be referenced using its name.
arcpy.nax.MakeNetworkDatasetLayer(nd_path, nd_layer_name)
# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea(nd_layer_name)
以下代码片段显示了如何使用 ArcGIS Online 初始化服务区分析:
import arcpy
# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea("https://www.arcgis.com/")
以下代码片段显示了如何使用配置了 ArcGIS Enterprise routing services 的门户初始化服务区分析:
import arcpy
# Instantiate a ServiceArea analysis object.
service_area = arcpy.nax.ServiceArea("https://myportal.mysite.com/portal/")
设置分析的属性
初始化分析后,必须设置分析的属性。 要确定分析对象支持的属性并了解给定属性如何影响分析,请参阅有关特定对象的帮助主题(可在帮助中的“类”类别下找到)。 许多属性都是使用 Python 枚举对象(一组表示某些常量值的符号名称)设置的。 例如,可以使用 arcpy.nax.TimeUnits 枚举中的 Minutes 成员将分析的时间单位设置为分钟。 对象的帮助主题介绍了是否需要将属性设置为枚举。 它还指定要使用的枚举的名称。
要为任何分析设置的最重要的属性是用于分析的出行模式。 要设置出行模式,必须先获取网络数据集支持的出行模式列表。 要实现此目的,请使用 GetTravelModes 函数。 从支持的列表中,根据名称选择分析的出行模式。 GetTravelModes 函数将返回一个字典,其中键是出行模式名称,值是出行模式对象。
以下代码片段显示了如何设置服务区分析的属性。 该片段假设已初始化服务区分析对象。
# Get the desired travel mode for the analysis.
nd_travel_modes = arcpy.nax.GetTravelModes(nd_layer_name)
travel_mode = nd_travel_modes["Driving Time"]
# Set properties.
service_area.timeUnits = arcpy.nax.TimeUnits.Minutes
service_area.defaultImpedanceCutoffs = [5, 10, 15]
service_area.travelMode = travel_mode
service_area.outputType = arcpy.nax.ServiceAreaOutputType.Polygons
service_area.geometryAtOverlap = arcpy.nax.ServiceAreaOverlapGeometry.Split
加载输入
在执行分析之前,必须加载要用于分析的输入位置。 根据分析类型,必须将一个或多个位置加载到该分析支持的一个或多个输入数据类型中。 例如,要执行服务区分析,必须将一个或多个设施点(在其周围生成服务区域面和服务区域线的位置)加载到 ServiceAreaInputDataType.Facilities 数据类型中。
可通过两种方式加载输入: 如果输入位置已作为要素类或表提供,则可以使用分析对象上的 load 方法加载输入。 如果要从其他数据源读取输入位置(例如,包含纬度和经度值的 .csv 文件),或者如果将输入位置设置为几何对象,则可以使用分析对象上的 insertCursor 方法加载输入。
求解分析
要执行分析,请调用 solve 方法。 此方法将返回一个结果对象,以供处理分析结果,例如将结果导出到要素类。
如果分析没有找到任何结果(例如,如果在输入停靠点之间找不到路径),则 solve 方法不会引发 Python 异常。 要确定分析是否生成有效结果,请使用结果对象的 solveSucceeded 属性。
许可:
如果网络数据源为本地网络数据集,而非服务的 URL,则 solve 需要 ArcGIS Network Analyst extension 许可才能成功。 在调用 solve 方法之前,请检出许可。
以下代码片段显示了如何执行分析:
# Check out the Network Analyst extension license.
arcpy.CheckOutExtension("network")
# Solve the analysis.
result = service_area.solve()
处理结果
执行分析后,可使用通过 solve 方法获得的结果对象来处理结果。 结果对象可用于确定分析是成功还是失败(使用 solveSucceeded 属性)以及分析是否生成部分解决方案(使用 isPartialSolution 属性)。 如果分析失败,则可以确定使用 solverMessages 方法的原因。
以下代码片段显示了如何执行分析并将结果导出到要素类:
# Solve the analysis.
result = service_area.solve()
# Export the results to a feature class. If the analysis failed print all the
# messages.
if result.solveSucceeded:
result.export(arcpy.nax.ServiceAreaOutputDataType.Polygons, output_polygons)
else:
arcpy.AddError("Analysis failed")
# Print all the warning messages.
for message in result.solverMessages(arcpy.nax.MessageSeverity.Warning):
arcpy.AddWarning(message[-1])
# Print all the error messages.
for message in result.solverMessages(arcpy.nax.MessageSeverity.Error):
arcpy.AddError(message[-1])
可以通过多种方法来访问和处理分析结果。 例如,可以将结果导出到要素类,或者使用光标逐行读取各行。