ArcGIS网络分析最短路径从原理到实战:构建网络数据集与批量求解
简介面向 ArcGIS 初、中级用户的一份实验型学习文档聚焦网络分析中的最短路径问题内容覆盖无权重最佳路径、加权最佳路径、车辆访问顺序路径与阻强问题四类典型场景可帮助读者掌握设施网络分析工具、旗标与障碍设置、边权重属性选择、查找路径任务执行等核心操作。资料为单个 PDF 文件压缩包整体约七百二十二 KB轻量易用浏览人数已有 165 人。文档按四个实验步骤逐一演示操作流程归纳最短路径分析的基本原理并针对修路、车辆饱和、路口事故等阻强情况讲解永久性属性修改与临时边要素障碍两种处理方式同时配有 City.mdb 示例数据库背景适合作为 ArcGIS 空间分析课程实验参考、课后自学或项目实践入门材料可反复对照练习。1. 用 ArcGIS 网络分析做最短路径先搞清楚它到底在算什么做 GIS 的人早晚会碰到一个问题给两个点让 GIS 算出沿着路网走哪条路最近。点开 ArcGIS 的 Network Analyst 工具条填上起点终点点一下求解一条路径就画出来了。看起来简单但很多人忽略了一件事——ArcGIS 里的“最短路径”并不是把两个点用直线连起来也不是简单地在路网数据里找出欧氏距离最短的线。它是在一个有向、有权、可能带交通限制的拓扑网络里求解图论意义上的最短路径默认算法是 Dijkstra也可以切换成 A* 等启发式算法。也就是说这个功能是否准确取决于你准备的路网拓扑是否干净、转弯模型怎么设置、花费字段用的是长度还是时间。这个标题对应的场景很典型道路规划、设施选址、物流配送、应急路径分析甚至管网电网络、水网连通性分析也经常借用这套逻辑。但 ArcGIS 的网络分析模块并不是“装了就能用”的傻瓜工具在真正跑出最短路径之前你得先建网络数据集理解连通性、层级、转弯、限制、障碍这些概念。这篇文不聊高深的算法推导就按我自己做项目时的习惯从数据准备、网络构建、参数设置到脚本化批量求解把完整链路写清楚。新手能照着做熟手也能看看我在参数和边界上踩过的坑。2. 最短路径在 ArcGIS 网络分析里的底层逻辑从图论到网络数据集2.1 图论里的最短路径与 ArcGIS 的对应关系最短路径问题的数学模型是经典的图论问题给定一个带权图 G(V,E)每条边 e 有权重 w(e)求从起点 s 到终点 t 的一条路径使得路径上各边权重之和最小。Dijkstra 算法在 1956 年提出适用于边权非负的图时间复杂度为 O(E log V)用二叉堆优化。ArcGIS Network Analyst 底层使用的正是这类算法。在网络分析中路网中的每个道路交叉口就是一个节点Vertex每条道路线段就是一条边Edge边的权重来自网络数据集中的成本字段比如长度或者行驶时间。但 ArcGIS 中的网络和理论图有个明显差异真实道路有转弯限制、单行道、天桥、隧道。如果直接拿原始道路线要素去算得到的路径很可能让你从桥上飞下来或者违法掉头。所以 ArcGIS 引入了“网络数据集”这种带有拓扑结构的数据模型。你在 ArcCatalog 里右键一个要素数据集新建网络数据集它会自动把线要素构建成边元素端点处建立连接并支持给边设置属性成本、限制、层级。这个网络数据集不是静态的 shapefile而是一个逻辑模型它告诉 ArcGIS 哪些道路可以连通走一条路要花多少成本哪些车辆不能走某条路。网络数据集的构建过程就是为最短路径算法准备一张干净、带权、有向的图。理解这一点很关键因为你后面做的所有操作设置连通性策略、添加转弯、设置限制属性其实都是在修正这张图让它更贴近现实交通。2.2 成本属性长度、时间还是自定义字段网络数据集中必须至少有一个“成本属性”。最常见的做法是用道路长度单位一般为米或千米。你可以通过以下步骤创建在 ArcCatalog 中右键要素数据集选择“新建网络数据集New Network Dataset”。输入名称比如Road_ND选择你的道路要素类比如roads。在“是否为此网络数据集建立转弯模型”一般选“是”为后续加转弯做准备。在“连通性”设置中默认是“端点连通”这表示只有道路的端点相交时才连通。如果两条路在中间相交比如立交桥下穿这时默认不连通需要手动打断或调整连通性策略。在“指定网络属性”这步点击添加名称写Length用法选“成本”单位选“米”数据类型选“双精度”。接着为每个要素类设置该属性的默认值。如果用的是道路长度可以选字段Shape_Length。设置好成本属性后在 Network Analyst 窗口中添加点、设置障碍等求解时算法就会沿着网络搜索使累计成本最小。如果你用时间作为成本那么道路要素中应有一个时间字段比如DriveTime注意这个字段可能需要你根据道路等级和速度计算出来或者使用 ArcGIS Network Analyst 中的“行驶时间”属性。在 ArcGIS Pro 中还可以借助“出行模式Travel Mode”进一步定义。2.3 连通性为什么两条交叉路不连通这是实际项目中最容易出问题的地方。ArcGIS 中网络连通性有几种组合方式常见的是“端点连通性”和“任意节点连通性”。端点连通性只有两个线的端点重合时它们才是连通的。如果一条路穿过另一条路在中间某处相交但两条道路要素都在交点处有折点即要素被打断成两个线那么端点连通性也能识别。如果一条路在另一条路的中间穿过而中间没有折点则这两条路在 ArcGIS 中被视为“不连通”虽然它们在地图上肉眼看着相交了。这会导致最短路径绕远。解决方法是使用“要素级连通性”。在构建网络数据集时把连通性策略从“端点连通”改为“任意节点连通”这样线的任何顶点都可以与其他线的端点或顶点相连。但要注意改成任意节点连通会带来一个问题高架桥和地面道路的交叉口也会被错误连通。在道路数据中如果存在立交桥两条路在空间上重叠或相交但实际物理上不互通。用任意节点连通就会把不该连的连上。正确做法是将物理上互通的道路打断并共享端点设置端点连通性对于立体交叉的道路用 Shapefile 中常用的方法是在软件中手动打断或者利用“平面化”工具。在 ArcGIS Pro 中可以在编辑会话里把道路在交点处打断。操作建议我一般会先做一个快速检查使用“打断相交线Intersect”工具将道路在交点处全部打断然后重新构建网络。这个方法粗暴但能保证拓扑匹配。比如用 ArcToolbox 里的Data Management Tools - Features - Feature to Line或者Intersect工具。ArcMap 的“高级编辑”工具栏里也有“打断相交线”按钮。打断之后所有道路都在交点处有节点使用端点连通性基本没问题。提示打断后别忘了合并属性。如果道路的属性字段如道路等级、速度在打断后需要保留你可以使用Intersect工具它可以输出原始要素的属性字段的并集或者先复制一份数据再打断。2.4 转弯模型与转弯限制对最短路径的影响默认情况下ArcGIS 网络分析允许从一条边任意转向另一条边不受限制。但真实世界有禁止左转、禁止掉头等情况。如果项目需要模拟真实驾驶你必须建立转弯要素类或者在网络属性中给转弯限制设置默认值。构建转弯要素类有两种方式在构建网络数据集时勾选“转弯”模型选择创建转弯要素类这个类是RestrictedTurn类型。在 Network Analyst 工具栏中点击“网络分析”按钮选择“转向设置Turn Settings”可以预设全局默认值但不具体针对某个交叉口。创建具体转弯限制的操作在 ArcMap 或 ArcGIS Pro 中启动编辑。使用“创建转弯要素”工具在需要限制的交叉口绘制转弯线。转弯线是一个从一个边到另一个边的路径。该转弯要素的属性中有一个“类型”字段取值可以是GLOBAL_TURN、RESTRICTED_TURN等。如果是限制类型则这条转弯路径禁止通行。如果是延阻类型你还可以设置延阻时间。如果你没有创建任何转弯要素那么所有转弯都是许可的。在很多基础分析比如水管网络、天然气管道中根本不需要转弯限制。在做道路最短路径时建议至少考虑禁左场景否则路径可能不符合交规。如果你使用 ArcGIS Online 或 Navigator那底层路网已经内置了转弯模型这里不展开。2.5 障碍Barriers与权重修正现实中可能出现临时封路、立交施工等这时不能改路网数据可以添加障碍。在 Network Analyst 窗口的图层上你可以添加三种障碍点障碍、线障碍、面障碍。点障碍Point Barrier会阻止经过该点也就是算法会把该点所在的边“切断”路径不能从该点穿过。线障碍Line Barrier阻止穿过该线比如一段路封闭。面障碍Polygon Barrier比如一座桥坍塌整个面的边都被禁止通行。还有一种“已添加的成本Added Cost”障碍不封路但会增加经过该处的成本比如拥堵路段增加 5 分钟。在 ArcMap 中你只需在网络分析窗口的“点障碍”图层上右键选择“加载位置”加载一个点要素图层。在 ArcGIS Pro 中类似。这些障碍只影响一次分析修改方便不需要重新构建网络数据集。3. 从道路数据到可求解的最短路径构建网络数据集与执行分析3.1 用最短路径向导快速跑通一遍ArcGIS 自带一个“最佳路径Route”分析图层适合新手快速体验。操作路径打开 ArcMap加载道路要素必须是线和起点、终点要素点。在菜单栏空白处右键调出“Network Analyst”工具条。点击工具条上的“Network Analyst”下拉菜单选择“新建路径New Route”。此时内容列表中出现 “路线Route” 分析图层包含停靠点Stops、路径Routes、点障碍、线障碍、面障碍等子图层。使用“创建网络位置Create Network Location”工具在地图上依次点击道路上的位置或者在停靠点子图层上右键加载要素。点击工具条上的“求解Solve”按钮。系统会弹出路径分析结果并在地图上绘制路径线。如果之前没有构建网络数据集刚才新建路径时系统会提示你指定网络数据集。要选择你已经构建好的网络。若你直接用 ArcGIS 自带的示例数据进行练习可以抄作业# 以 ArcGIS 自带的 San Diego 数据为例 # 通常位于 C:\ArcGIS\ArcTutor\Network Analyst\Tutorial\SanDiego.gdb # 里面包含 Streets 要素类和 Streets_ND 网络数据集你可以在 ArcCatalog 中浏览到该地理数据库将Streets要素类添加到地图再新建路线分析图层即可。这是学习最短路径功能最快的路径。3.2 用 Network Analyst 窗口手工指定起点和终点的方式有时你不想提前准备点要素直接在鼠标在屏幕上点两个位置。操作步骤如下调出 Network Analyst 工具条。点击“Network Analyst”下拉菜单选择“新建路径”。在停靠点子图层上右键选择“添加新位置Add New Location”。然后在地图上单击每点一下会生成一个停靠点。注意点位最好贴近道路因为 Network Analyst 会把点投影到最近的路段上。添加两个停靠点后点击“求解”按钮。要注意“添加新位置”工具如果没有激活也可以直接点击工具条的“创建网络位置”工具它与某个分析图层绑定。你需要在内容列表的“路线”图层上右键选择“设置活动网络分析图层”确保当前的分析图层是路线。这里最大的坑是如果起点和终点离道路很远比如在一个大公园里ArcGIS 会投影到最近的路段可能投影到马路对面。你需要放大检查路径起终点是否合理。可以设置“搜索容差Search Tolerance”在网络分析图层的“图层属性”中有一个“位置”标签你可以设置查找最近要素的容差。默认是 500 米如果点离路网超过容差则该停靠点无法定位求解时会报错。3.3 设置权重字段与方向长度、时间、单行道在求解前需要确保网络数据集中的成本属性已正确配置。如果你从道路要素的Shape_Length字段作为成本那可以直接求解长度最小路径。如果要考虑单行道需要在构建网络数据集时为成本属性添加“方向”字段。具体操作在新建网络数据集向导中添加成本属性DriveTime然后点击“评估器Evaluator”列的下拉箭头选择“字段属性Field Evaluator”。在打开的对话框中可以指定正向成本字段例如FT_DriveTime从路径起点到终点的时间反向成本字段例如TF_DriveTime从终点到起点的时间如果道路是单向的可以把反向成本设置为空或负值-1 表示禁止通行。谨慎使用负值因为某些算法不支持负边权但 ArcGIS 内部会将其作为禁止方向处理。推荐方式是在“限制属性”中设置。ArcGIS 有一个预定义的限制属性Oneway如果数据中有。你可以在网络属性中添加限制类型属性用法选择“限制”评估器用字段表达式例如[OneWay] FT或者相反控制允许方向。这种配置需要你对道路字段含义心中有数。如果数据中没有单行道字段你可以通过给“端点到端点”的方向设置不同的成本来模拟比如双向都是 1 分钟单向路反向是 9999 分钟。这种方法能保证算法不会选违法方向代价是计算会走极端绕路但一般不会出现过大的数值问题。对于正式项目建议清理数据。3.4 必须掌握的求解条件和错误排查求解失败是家常便饭。常见的错误提示和坑如下“Input point cannot be located on the network”表示输入点不在搜索容差内。解决办法是放大地图检查点的位置确保点在路网附近或者增大容差。“Empty route found”表示没有找到路径。原因可能是不连通。检查网络数据集的连通性确保起点和终点在同一个连通分组里。可以打开网络数据集属性选择“连通性”组查看组的数量和范围。“No solution” 或“求解失败”通常是因为障碍把所有路径切断了或者成本为空导致路径不可达。可尝试移除障碍重新求解。路径出现横跨大片空白区域说明网络没有正确覆盖起点终点之间或者连通性设置过于宽松把不该连通的路通过任意节点连通了。此时检查“连通性策略”。一个可靠的排错流程是先用两点直接求解只设置长度成本不加任何障碍和限制。如果成功再逐个添加限制、转弯、障碍确认哪一个导致失败。对比求解结果与手动驾车路线如果明显绕远打开“路径方向”窗口Route Directions查看路径在转弯指示的地方检查转弯模型。查看网络数据集属性中的“源数据集”选项卡确认参与网络的要素类都处于开启状态且没有勾选“使用高精度坐标”之类的问题。3.5 最短路径结果的图形与属性输出求解完成后路径会自动生成一个Routes要素线。这行的属性中Name表示路径名称Total_Length表示总长度如果成本是长度的话Total_DriveTime表示总时间。你可以右键路径图层打开属性表查看。需要导出时右键图层选择“数据 - 导出数据”将路径导出为 shapefile 或要素类后续可以在 ArcGIS Pro 或 QGIS 中继续处理。如果你想输出路径的详细拐弯步骤点击 Network Analyst 工具条上的“方向窗口”按钮可以生成像导航一样的文本序列。这个窗口还可以打印成 PDF适合做成果报告。在方向窗口中每一句指示如“向右转进入 Main St”需要道路名称字段存在。如果道路名称字段为空方向会显示“在未命名道路行驶”。4. 用 ArcPy 批量计算最短路径脚本方式的高效替代4.1 为什么需要脚本化众多起点终点对与批量分析手工点选或加载停靠点只能应对少量起终点。实际生产环境中需求往往是给定 1000 个配送点到最近仓库的最短路径或者计算每个小区到最近医院的行驶时间。手动去加停靠点、求解、保存路径效率太低。ArcGIS 提供了 ArcPy 的na模块可以创建路径分析图层、添加停靠点、求解并导出结果。这一节给出一个能改改就用的 Python 脚本。以下脚本适用于 ArcGIS Pro 的 arcpy也可在 ArcMap 10.x 中使用个别参数名略作调整。假设你有一个起点要素类origins一个终点要素类destinations以及网络数据集Road_ND。你需要计算每对起终点之间的最短距离和时间。# -*- coding: utf-8 -*- import arcpy import os # 参数配置 workspace rC:\gis_data\project.gdb network os.path.join(workspace, Road_ND) # 必须是要素数据集内的网络数据集 origins os.path.join(workspace, origins) # 起点点要素 dests os.path.join(workspace, destinations) # 终点点要素 result_table os.path.join(workspace, route_results) # 结果表 # 设置工作空间 arcpy.env.workspace workspace arcpy.env.overwriteOutput True # 创建路径分析图层 route_layer_name RouteLayer out_layer arcpy.na.MakeRouteAnalysisLayer( network, route_layer_name, analysis_properties{ AttributeName: Length, # 使用的成本属性 AllowInvalidResults: TRUE, IgnoreInvalidLocations: TRUE } )[0] # 加载起点和终点 arcpy.na.AddLocations(out_layer, Stops, origins, search_tolerance50 Meters) # 注意如果要一对多或者多对一可以用重新排序方式这里简化为按字段顺序匹配 # 先给 Stops 添加一个序列字段保证配对顺序 # 如果起点和终点是一对一可以在 origin 和 dest 中加上共同 ID 字段这里省略 # 获取停靠点数 stop_count int(arcpy.GetCount_management( arcpy.na.GetNAClassNames(out_layer)[Stops]).getOutput(0)) print(加载了 {} 个起点.format(stop_count)) # 求解 arcpy.na.Solve(out_layer) # 提取路径 routes os.path.join(RouteLayer, Routes) # 将路径导出为独立要素类 arcpy.conversion.ExportFeatures(routes, in_memory\\routes_fc) # 输出路径属性表到表格 arcpy.management.CopyRows(routes, result_table) print(完成结果已写入 {}.format(result_table))这段代码的结构MakeRouteAnalysisLayer创建分析图层AddLocations加载停靠点Solve求解最后拷贝结果。实际上如果有多对起终点你需要循环遍历每次求解一对或者把多对起终点按顺序写入同一个Stops类但每个起点和终点要设为“路径上不同点”。例如可以使用Stops的RouteName字段把不同路径的停靠点分组。默认情况下所有停靠点都在同一路径中路径会由一个顺序遍历所有停靠点的最优顺序构成类似于旅行商问题。所以如果你不想让算法重新排列停靠点顺序需要将设置ReorderingType PRESERVE_ORDER。在MakeRouteAnalysisLayer的分析属性里加一句ReorderingType: PRESERVE_ORDER这样停靠点按输入顺序依次访问。更简单的一对一循环方式是把 RouteName 字段设置在停靠点里例如起点 RouteName 1终点 RouteName 1然后求解ArcGIS 会为每个 RouteName 生成一条路径。不过这种方法较繁琐建议直接用循环。下面是一个更清晰的一对多循环示例import arcpy arcpy.env.workspace rC:\gis_data\project.gdb net Road_ND # 起点单点 origins origins # 终点多个点 dests destinations # 建立临时图层 for origin_row in arcpy.da.SearchCursor(origins, [OBJECTID, SHAPE]): oid origin_row[0] origin_geom origin_row[1] # 每个起点单独创建路径图层 result_layer arcpy.na.MakeRouteAnalysisLayer(net, route_ str(oid), {AttributeName: Length, ReorderingType: PRESERVE_ORDER})[0] # 添加起点 arcpy.na.AddLocations(result_layer, Stops, [{SHAPE: origin_geom}], search_tolerance50 Meters) # 添加该起点对应的终点 dest_list [] with arcpy.da.SearchCursor(dests, [SHAPE]) as cursor: for row in cursor: dest_list.append({SHAPE: row[0]}) arcpy.na.AddLocations(result_layer, Stops, dest_list, search_tolerance50 Meters) # 求解 arcpy.na.Solve(result_layer) # 输出路径数量 print(起点 {} 的路径已求解.format(oid))这个脚本适合理解原理。实际生产中如果数据量过大比如几万条建议把成本属性换成时间利用时间效率更高。此外结果中的路径按Name字段区分可以关联原始起终点 ID。4.2 脚本化时的几个关键参数搜索容差、无效位置处理和几何检查脚本跑批时最需要处理的坑是无效位置。你在屏幕上手工操作时能看到一个点是否投影到了正确位置脚本跑批时只能处理标志。建议在AddLocations时设置ignore_invalid_locationsTrue否则求解会因为一个点不在网络内而中断。同时注意search_tolerance的单位换算。如果数据投影是 Web Mercator输入 50 Meters 是正确的但如果数据是地理坐标系经纬度搜索容差会按度计算50 Meters 会被解释为 50 度这会出错。务必查看数据的坐标系如果是 GCS建议先把容差写大一点例如 0.01 度但更好的方案是使用投影坐标数据来构建网络。另一个常见问题是停靠点恰好位于网络中的“孤立节点”上即不连通的分支。这些位置的点虽然投影在路线上但算法无法从那里出发。建议先计算路网的整体连通性用“空间连接”或“选择孤立的道路”来修正数据。ArcGIS 中有“构建网络”时生成的“连通性组”字段在Streets的属性表中_ConnectivityGroup字段标识了属于哪个连通组。用这个字段筛选如果起点终点不在同一组就不可能有路径。批量脚本中可以先用该字段做预过滤减少无效求解时间。4.3 用求解结果生成可达性矩阵或 OD 成本表如果你要的是 OD出发地-目的地成本矩阵ArcGIS 有专门的“OD 成本矩阵”分析图层不需要逐个解路径。在 Network Analyst 工具条上选择“新建 OD 成本矩阵”加载原点和目的地求解后会生成一个Lines要素类表示每个 OD 对之间的连接线属性中包含总成本。这是最短路径大批量计算的正确打开方式比循环路径快很多。OD 成本矩阵可以用于服务区分析、供需匹配、聚类等。比如计算每个小区到最近医院的最短时间你不需要求所有 OD只需要每个 OD 的行并按目的地分组取最小值。如果你只需要两两之间的直线距离那是另外一回事。对于这种场景我一般建议先跑 OD 矩阵再用 Python 的 pandas 在结果表里做聚合效率比逐个路径高一个数量级。ArcGIS 的限制是 OD 成本矩阵最多支持一定数量的目的地具体内存限制视版本但通常几千点没有问题。超过一万条时建议拆块计算或者用 ArcGIS 的Connectivity分析扩展。5. 最短路径结果的质量验证与常见误用坐标系陷阱、路网拓扑和精度边界5.1 坐标系不一致会造成最短路径“横穿”这是新手最常见的错误路网是 WGS 1984 Web MercatorEPSG:3857但起终点是度坐标 (WGS84)。ArcGIS 通常会自动投影但如果你把投影坐标系下的路网和地理坐标系的点直接丢进同一个地图虽然 ArcGIS 自动加载了两个数据框可以混合显示但在网络分析中ArcMap 会对点进行投影处理若你直接通过屏幕点选它们被投影到路网时可能发生错误偏移。另外如果网络数据集的空间参考与输入点不一致ArcGIS 会默认“最接近”的位置这可能投影到路网的另一条路。解决方式在添加网络位置之前先把所有点要素Project到与网络数据集相同的坐标系中。或者至少确保你在“图层属性 - 源”中看到网络数据集的坐标系然后使用Project工具转换输入要素。不要依赖 ArcGIS 的自动动态投影。动态投影只影响显示网络分析内部使用的坐标系会直接读要素的实际坐标系。如果要素处于地理坐标系度但网络数据集是投影坐标系AddLocations可能会把点放置错误因为搜索容差会按照两个坐标系各自的空间参考解释。提示在 ArcGIS Pro 中网络数据集必须使用投影坐标系否则无法生成。这是硬性规定。如果在 ArcMap 中使用地理坐标的网络数据集某些工具会报错。因此建议构建网络数据集前把道路数据Project到适合当地的高斯-克吕格或 UTM 投影。5.2 检查路网拓扑的三种可视化手段最短路径的质量很大程度上取决于路网拓扑。ArcGIS 里查看连通性有三个实用方法打开网络数据集属性在“连通性”选项卡中查看“连通性组”会看到每条边属于哪个组。如果存在多个组组之间的道路不能互通除非设置了连接。地图上可以用不同符号渲染_ConnectivityGroup字段一眼看出路网是不是断成好几片。使用“网络分析”中的“定向”功能在路径上添加方向指示如果路径出现死折或反向绕行往往是拓扑问题。在 ArcMap 中用“几何网络”的“追踪”工具这是 ArcGIS 传统拓扑网络不是网络数据集尝试从一点追踪到另一点但两者模型不同不建议混用。更好的验证方法是自己随便选两个看起来连通的路口用“新建路径”求解看看路径是否合理再选取两个被河流隔开的地方必须有桥或隧道的路段才连通。另外检查“悬挂线”dangling lines。所谓悬挂线是指路网中的死胡同线的一端没有连接到任何其他线。这种路段的端点如果不在其他要素上会被网络分析忽略因为它虽然可达但从悬挂点到外部只能折返不算致命但如果你把它误认为可以抄近路的路径会选不到路。ArcGIS 有“要素转线”或者拓扑检查工具可以用Check Geometry和Check Validity定位悬挂节点。5.3 用最短路径做服务区分析别混淆概念很多用户想解决“从某点出发30 分钟内能到达哪些地方”这个问题。这属于服务区分析Service Area不是单个最短路径。服务区是网络分析模块中的另一种图层类型它在 ArcMap 的 Network Analyst 工具栏下拉菜单中叫“新建服务区New Service Area”。它通过从设施点沿道路向外扩展计算给定的成本阈值如 10 分钟、20 分钟覆盖的道路范围并生成面。如果你用很多条最短路径来检查能否在限定时间内到达某地不如直接用服务区分析。服务区的核心参数是“默认中断Default Breaks”如设置为 10 20 30则表示 10、20、30 分钟三个断面。注意服务区生成的面可能存在“重叠”和“孔洞”问题真实路网中的单行道限制会生成不对称的服务区此时要检查方向设置。生成的面可以用于可达性制图和最短路径的结果互相验证。5.4 求解结果验证的三板斧与地图比对、与导航对比、用成本审计验证最短路径是否可信我通常做三件事第一把路径结果叠加到影像底图上ArcGIS 自带的 World Imagery 或者在线天地图检查路径是否沿着道路中心线走。由于网络分析基于线要素只要线要素与影像匹配结果就正确。第二与主流导航软件对比。如果取一个城区内部点对百度地图或高德的驾车推荐路线与 ArcGIS 按长度最短解出的路径会有差异因为导航使用了时间成本且实时路况。你的目标如果是“距离最短”那结果就一定跟导航不一样。不要误以为 ArcGIS 算错了。第三检查路径的总成本。求解后在路径属性表中Total_Length字段是累计长度。你可以用 ArcGIS 的“测量”工具在地图上沿路径勾勒观察数值是否一致。如果有明显差异要检查成本单位是否和你想的一致。比如字段里存的是千米但网络属性设置成米那么总长度会相差 1000 倍。在构建网络时评估器中需要选择正确的字段和系数。如果你用Shape_Length作为成本要注意Shape_Length的单位与要素类的坐标系单位一致。若坐标系是米它就是米若是度它是度这时不能直接用作距离成本。5.5 用 Python 快速统计验证结果路径是否连通在批量求解后你可以用下面的脚本校验结果路径是否完整import arcpy route_fc route_results with arcpy.da.SearchCursor(route_fc, [Name, Total_Length, SHAPE]) as cur: for name, length, geom in cur: # 检查几何是否有效 if geom is None: print(f{name} 无几何) continue # 检查几何是否多部件 if geom.isMultipart: print(f{name} 是多部件几何可能包含非连通路径) # 检查长度是否为0或异常 if length 0: print(f{name} 长度为 {length}检查网络成本设置)多部件几何意味着路径可能由两个断开的部分组成这通常是因为网络中有空白或孤立子图也可能是求解时有两个不相连的子路径合并在一起。正常最短路径一定是一个单部件线。如果出现多部件你需要在网络数据集中查看是否有“断开”的连接。5.6 最后的技巧把最短路径变成管线网络约束条件如果把目光放长一点ArcGIS 网络分析中的最短路径不只是道路。你可以在成本属性中设置自定义字段例如管道压力、水深、电缆阻抗这时“最短”的含义就变成了“最小阻抗”。在电网络分析中你可能把每个弧段的电阻作为成本求出两点之间电阻最小的路径用于电力故障检修路径规划。在燃气管道中可以把管径作为成本反应输送效率。这种玩法需要你对每个要素自定义成本字段。ArcGIS 并不会限制你只用长度或时间。关键设置是在网络分析图层的“分析设置”中把“阻抗Impedance”从Length换成你新建的字段。如果你使用 ArcGIS Pro 的“路径Route”图层在路径分析属性面板的“出行模式”中你可以编辑当前不成文的自定义模式。ArcMap 则直接右键图层 - 属性 - 分析设置 - 阻抗下拉选择。因此这个功能的真正价值是它是一个通用的图论求解器只是挂了个道路分析的壳。你可以基于 Shapefile 的历史路网、河网、管网构建自己的图模型用最短路径算法解决很多实际问题。这大概就是这篇标题给人带来的最大启示。注意在自定义成本时ArcGIS 网络数据集支持单值和双向值。比如河流方向的顺流逆流不同你可以定义“正向成本”为顺流时间“反向成本”为逆流时间。这样计算出的最短路径才符合物理世界。设置路径为“不能反向”可以在评估器中使用 -1 作为反向成本但要注意 -1 在 ArcGIS 中表示禁止所以不要把真实成本设成负数。把这一节看成一个工具使用指南的延伸你已经能自主设计一套网络分析方案。从数据准备到网络构建到求解验证再到自定义成本管道完整那么今后面对任何“网络分析”相关的需求心理都不会发怵。毕竟ArcGIS 网络分析只要数据可靠、参数清晰、验证有据它给出的结果就是可复现、可信任的。本文还有配套的精品资源点击获取