Arcgis-Issues_03Arcgis最佳路径分析
前言
要对目前已有道路及规划防火道路与火点进行最佳路径分析,分析由各最近驻防点到火点的最优路径,求算到达火点最短平均时间。这里采取分离行车和步行的方法,分别计算最短车行和步行平均距离,进而根据速度确定最短平均时间。
注意:ArcMap需要有Network Analyst扩展的授权许可。
数据准备
驻防点
因对路网进行分析,则驻防点各点需位于路网上,使用近邻分析工具,勾选位置,可获得其最近路网点坐标(NEAR_X和NEAR_Y)和最短距离(NEAR_DIST)。
将表导出为dbf——添加X、Y数据——导出数据为驻防点最近路网点.shp
火点
同驻防点处理。
路网
网络数据集的默认连通性设置仅在线要素的重合端点处建立连通性。
这就需要在路网各交点处打断,同时在与起始点和目的点相交处也要打断(保证分析可以在岔路处分支,在起止点停止)。
使用要素转线工具在交点处打断线,使用在点处分割线工具在与起始点和目的点相交处打断。
还要保证不能有悬挂点和伪节点,悬挂点(Dangle Node,Dangle):线段的端点悬空,没有和其他结点连接,这个结点(端点)称为悬结点。伪结点(Pseudo Node):两个结点相互接触,连接成一个结点,称为伪结点。
由此可见,悬挂点是不通的,伪节点是一条线路上两个节点的重合,也可以合并成一条线路。可使用拓扑检查并修改,设置规则:不能有悬挂点、不能有伪节点。
实现原理
OD成本矩阵
Origin-Destination(起始点—目的点)
解释下什么叫OD成本矩阵?
举个例子:从A、B到C、D,要求算两两之间的通行时间,情况就四种A—C,A—D,B—C,B—D。对于少数情况人工就可以分析,若有100个起始点,100个目的点,就有100*100种组合,这种组合就叫OD成本矩阵。
OD 成本矩阵用于查找和测量网络中从多个起始点到多个目的地的最小成本路径。配置 OD 成本矩阵分析时,可以指定要查找的目的地数和要搜索的最大距离。
OD 成本矩阵求解程序不输出沿网络(路网)的线,但是存储在“线”属性表中的值却反映了网络距离,而不是直线距离。
上面简单来理解就是,OD 成本矩阵求解结果是连接起始点和目的点的直线,但其距离属性为沿路网距离,OD成本矩阵的主要关注点是矩阵而非实际路径。
若想获得起始点到目的点真实路径,可使用路径分析。
路径分析
求解路径分析表示根据要求的阻抗查找最快、最短甚至是最优的路径。如果阻抗是时间,则最佳路线即为最快路线。如果阻抗是具有实时或历史流量的时间属性,则最佳路线是对指定日期和时间来说最快的路线。因此,可将最佳路径定义为阻抗最低或成本最低的路径,其中,阻抗由您来选择。确定最佳路径时,所有成本属性均可用作阻抗。
这里只做粗略分析,不考虑阻抗因素。
若只有较少起止点,可直接使用Network Analyst工具栏上的创建网络位置按钮。当存在多组时,可对停靠点分组,每组指定相同的名称(RouteName字段),并指定停靠点的Sequence属性(起点设置1,终点设置2)。
操作步骤
创建要素数据集
创建文件地理数据库——创建要素数据集(坐标与路网图层一致)——将路网要素导入要素数据集
创建网络数据集
这里不考虑高程和行驶方向,假设道路不存在立交和单行道(事实也基本如此)。
OD成本矩阵
创建OD成本矩阵图层
加载起始点和目的地点
打开Network Analyst窗口,加载起始点和目的地点(右键加载位置),因未指定各火点对应的驻防点,这里默认火点最近驻防点作为负责单位,上面创建OD成本矩阵图层也指定了要查找的默认目的点数为1,反向思维这里将火点作为起始点,驻防点作为目的点,确定最优OD矩阵。
求解
点击Network Analyst工具栏上求解按钮,若在数据准备阶段未处理路网悬挂点,会出现如下警告信息(本文作为演示未处理)。
求解结果为产出OD线层,Name字段为网络分析对象的名称;OriginID和DestinationID字段为起始点和目的地点的唯一ID值;DestinationRank字段为关联起始点找到的所有目的地中各目的地的等级,离起始点最近的目的地的等级为 1;Total_长度字段为起始点和目的地之间沿网络行驶的距离(尽管显示为直线,此值为沿网络实际距离)。
路径分析
使用OD成本矩阵就已经实现了目的,如要获得沿路网路径,可使用路径分析。
创建路径分析图层
使用工具箱创建路径分析图层工具或者Network Analyst工具栏新建路径。
生成停靠点层
使用OD成本矩阵生成的线分别与起始点、目的点相交。
同一条OD线可能会与起始点或目的点存在超过两个交点,可使用OriginID或DestinationID与FID_Destination或FID_Origin是否相等来判断并将其删除。
这就得到OD线两个端点,对起始点.shp和目的点.shp添加Sequence字段,起始点.shp字段内容设为2,目的点.shp字段内容设为1(这里纠正过来,因上面采取逆向方法确定火点最近驻防点)。
将起始点.shp和目的点.shp合并获得停靠点层,创建RouteName字段,字段内容为Name字段,可使用字段计算器如下Python代码纠正其方向描述。
(!Name!.split("-")[1]+"-"+!Name!.split("-")[0]).strip()
求解
在Network Analyst窗口选择路径,加载停靠点。
点击Network Analyst工具栏上求解按钮,求解结果为各组停靠点对应的路径。