使用 arcpy.nax 模块执行网络分析的最重要部分之一就是访问分析输出。 在使用 solve 方法求解分析时,将返回一个求解程序结果对象,该结果对象具有多种可通过以下方式检索输出的方法:
- 使用 export 方法将分析结果保存到要素类。
- 使用 searchCursor 方法直接读取结果。
- 使用 toArrowTable 方法以 Apache Arrow 格式检索结果。
- 将分析结果保存到可在其他应用程序(例如 ArcGIS Navigator)中使用的 .zip 文件。
- 出于调试目的,将分析结果保存到图层文件或包。
本主题将更加详细地介绍每个选项,以便您选择适合您需要的选项。
注:
本主题以路径和 OD 成本矩阵分析为例。 此处提供的信息可应用于任何类型的网络分析,但在相关情况下会注明一些例外情况。
将结果保存至要素类
要将求解程序返回的分析结果直接保存到磁盘上,请使用 export 方法。 将包含指定输出类型的所有字段和行。
以下代码片段显示了如何使用 export 方法将分析结果保存到磁盘上。
# Solve the analysis
result = route.solve()
# Save results to disk using the export method
output_feature_class = "C:/data/io.gdb/Routes"
result.export(arcpy.nax.RouteOutputDataType.Routes, output_feature_class)
有关路径分析的 export 方法的详细信息,请参阅 RouteResult 对象文档的“方法”部分。
读取结果
searchCursor 方法可用于直接逐行访问输出。 如果仅需从输出中检索特定字段,或者要将结果直接插入到其他某些系统,而不将整个输出表保存到磁盘,则该方法将非常有用。
例如,也许在您的路径分析中,您只需检索每个路径的总行驶里程,则可将该信息包含在报表中。 使用 searchCursor 方法检索每一行的 Total_Miles 字段。
以下代码片段显示了如何使用 searchCursor 方法在输出中检索某些字段的值。 在本示例中,可将超过 10 英里路径的名称打印到控制台。
# Solve the analysis
result = route.solve()
# Retrieve specific fields of interest using a searchCursor
for row in result.searchCursor(arcpy.nax.RouteOutputDataType.Routes, ["Name", "Total_Miles"]):
# Retrieve the name and mileage for each route
route_name = row[0]
route_miles = row[1]
# Print the route's name if the route's total mileage is greater than 10 miles
if route_miles > 10:
print(route_name)
您可以使用 searchCursor 方法将分析结果读入 Pandas 数据框以进行进一步分析。
下面的代码片段展示了如何使用 searchCursor 方法从分析结果中构建 Pandas 数据框。
import pandas as pd
# Solve the analysis
result = route.solve()
# Read the results into a pandas dataframe
fields = ["Name", "Total_Miles"]
with result.searchCursor(arcpy.nax.RouteOutputDataType.Routes, fields) as cur:
df = pd.DataFrame(cur, columns=fields)
# Do some further analysis...
可以使用一些特殊形状令牌访问输出的几何。 例如,使用 SHAPE@JSON 令牌可以检索形状的 JSON 表示。 使用 SHAPE@XY 令牌可以检索由求解程序结果对象的 spatialReference 属性指定的空间参考中的点的一组 X 和 Y 坐标。
提示:
使用结果对象的 fieldNames 方法可以检索分析输出类中包含的字段列表。 有关路径分析输出的 fieldNames 方法的详细信息,请参阅 RouteResult 对象文档的“方法”部分。
有关路径分析的 searchCursor 方法的详细信息,请参阅 RouteResult 对象文档的“方法”部分。
以 Apache Arrow 格式检索结果
对于 OD 成本矩阵分析,可以检索作为 Apache Arrow 表对象的 Lines 输出,并使用 toArrowTable 方法将结果保存到文件中。 Apache Arrow 可用于高效存储和读取大量数据,并且可以轻松处理数据科学中许多其他常用数据格式并在它们之间进行转换。
警告:
toArrowTable 方法仅适用于 OD 成本矩阵求解程序。
以下代码片段显示了如何使用 toArrowTable 方法以 Arrow 表形式检索 OD 成本矩阵分析的结果,并使用 Arrow 表计算每个起点到达的目的地数量。
# Solve the analysis
result = od_matrix.solve()
# Retrieve the Arrow table using the toArrowTable method
arrow_table = result.toArrowTable(
arcpy.nax.OriginDestinationCostMatrixOutputDataType.Lines,
["OriginOID"]
)
# Count the number of destinations reached by each origin.
# The result is a pyarrow structured array.
counts = arrow_table["OriginOID"].value_counts()
# If desired, you can convert the Arrow table to a pandas dataframe
# or many other supported formats.
df = arrow_table.to_pandas(split_blocks=True, zero_copy_only=True)
如果需要,可以指定一个输出文件来永久存储分析结果。 此文件可用于以后的进一步分析。
以下代码片段显示了如何使用 toArrowTable 方法将结果保存到文件中,以及如何读入文件以进行进一步分析。
# Solve the analysis
result = od_matrix.solve()
# Using the toArrowTable method to save the OD Cost Matrix result permanently to a file.
result.toArrowTable(
arcpy.nax.OriginDestinationCostMatrixOutputDataType.Lines,
["OriginOID", "DestinationOID", "Total_Time", "Total_Distance"],
os.path.join(output_folder, "ODLines.arrow")
)
以下代码片段显示了如何读入保存的文件以进行进一步分析。
import pyarrow
# Read the data from the file
with pyarrow.memory_map(os.path.join(output_folder, "ODLines.arrow"), 'r') as source:
batch_reader = pyarrow.ipc.RecordBatchFileReader(source)
table_from_file = batch_reader.read_all()
# Create a pandas dataframe using the records from the memory-mapped file using zero copy
df = table_from_file.to_pandas(split_blocks=True, zero_copy_only=True)
# Do some further analysis...
在处理庞大的数据集时,可能需要使用 max_batch_size 参数来防止在写出分析结果时出现内存不足错误。 此参数指定输出 Arrow 表中单个记录批次中包含的最大记录数。 当将包含多个记录批次的 Arrow 表或文件转换为另一种格式时,例如 Pandas DataFrame,您可能无法对整个表或文件进行零拷贝读取。 在零拷贝读取中,无需其他序列化操作即可访问数据并将其加载到 RAM 中。 为了实现这种零拷贝读取行为,代码可能需要一次处理一个记录批次。
以下代码片段显示了如何设置调用 toArrowTable 时的 Arrow 最大批处理大小。
# Solve the analysis
result = od_matrix.solve()
# Using the toArrowTable method to save the OD Cost Matrix result permanently to a file.
# Use max_batch_size to prevent memory errors.
out_arrow_file = os.path.join(output_folder, "ODLines.arrow")
arrow_table = result.toArrowTable(
arcpy.nax.OriginDestinationCostMatrixOutputDataType.Lines,
["OriginOID", "DestinationOID", "Total_Time", "Total_Distance"],
out_arrow_file,
max_batch_size=1000000 # Limit the output batches to one million records
)
以下代码片段显示了如何读入和处理包含多个记录批次的文件。
import pyarrow
# Process the OD Cost Matrix results in batches
with pyarrow.memory_map(os.path.join(output_folder, "ODLines.arrow"), 'r') as source:
batch_reader = pyarrow.ipc.RecordBatchFileReader(source)
for i in range(batch_reader.num_record_batches):
rb = batch_reader.get_batch(i)
# Convert this record batch to a pandas dataframe using zero copy
df = rb.to_pandas(split_blocks=True, zero_copy_only=True)
# Do some further analysis...
在 OriginDestinationCostMatrixResult 对象文档的方法部分了解有关 OD 成本矩阵分析 toArrowTable 方法的详细信息。
检索路径数据 .zip 文件
对于“路径”、“最近设施点”和“车辆配送”分析,可以将结果导出到路径数据 .zip 文件。 可以使用共享为路径图层工具将 .zip 文件共享为 ArcGIS Online 或 ArcGIS Enterprise 中的路径图层项目。
路径图层项目可用于各种应用程序,例如在 ArcGIS Navigator 中用于为移动工作人员提供路径指引,在 Map Viewer 经典版 的方向窗格中对路径图层包含的路径进行进一步自定义,以及在 ArcGIS Pro 中用于基于路径图层创建路径分析图层。
以下代码片段显示了如何使用 saveRouteData 方法保存路径数据 .zip 文件,并使用 ShareAsRoute Layers 功能将其共享至您的门户。
# Solve the analysis
result = route.solve()
# Export the results to a route data .zip file
out_zip = "C:/data/RouteData.zip"
result.saveRouteData(out_zip)
# Share the route data zip file as route layers to your portal
arcpy.nax.ShareAsRouteLayers(
out_zip,
summary='Tuesday restaurant inspection routes',
tags='Tuesday',
route_name_prefix='TuesdayRestaurants',
portal_folder_name='RouteLayers',
share_with='MYGROUPS',
groups='Drivers'
)
警告:
要成功运行 saveRouteData 方法,必须将求解程序对象上的 allowSaveRouteData 属性设置为 True。
有关路径分析的 saveRouteData 方法的详细信息,请参阅 RouteResult 对象文档的“方法”部分。
保存图层文件或包
可以使用 saveAsLayerFile 方法将分析设置和结果保存到图层文件或图层包,然后在 ArcGIS Pro 中打开并检查生成的图层。 这主要用于调试分析。
可以选择另存为与 ArcGIS Desktop 或 ArcGIS Pro 兼容的 .lyr 图层文件或者仅与 ArcGIS Pro 兼容的 .lpkx 图层包。 输出类型取决于您在指定方法的 file_name 参数时所使用的文件扩展名。 图层包中包含分析数据,但不包含网络数据源。
旧版本:
具有 .lyr 扩展名的图层文件没有出行模式属性。 构成出行模式的各个设置将保留在已保存的图层中,但是用于分析的出行模式的名称将丢失。
以下代码片段显示了如何使用 saveAsLayerFile 方法将分析结果另存为图层包。
# Solve the analysis
result = route.solve()
# Save the results to a layer package for debugging purposes
out_lpkx = "C:/data/RouteAnalysis.lpkx"
result.saveAsLayerFile(out_lpkx)
注:
要成功运行 saveAsLayerFile 方法,必须将求解程序对象上的 allowSaveLayerFile 属性设置为 True。
有关路径分析的 saveAsLayerFile 方法的详细信息,请参阅 RouteResult 对象文档的“方法”部分。