设施网络分析 |
在调用 Load 方法成功加载设施网络模型后,就可以利用 FacilityAnalyst 类提供的方法实现相应的设施网络分析功能。本章的各个小节将分别对 FacilityAnalyst 类所提供的设施网络分析功能和相关概念进行详细介绍。
在设施网络中,环路是指由两条或两条以上流向值为 2(即不确定流向)的弧段构成的闭合路径。图 8-1 是某设施网络的一部分,我们将网络弧段的流向通过不同的符号进行显示。对该网络进行环路检查,检查出两个环路,即图中的红色闭合路径。构成这两个闭合路径弧段流向均为 2。而右上方一条流向为 2 的弧段,由于并未与其他流向同为 2 的弧段构成闭合路径,因此不是环路。
图 8-1 环路 |
FacilityAnalyst 类提供了三个有关环路检查的方法,可用于查找网络中的环路,或查找与指定结点或弧段相连通的环路。
方法一:检查设施网络中的环路,返回构成环路的弧段 ID 数组。
语法:
public Int32[] CheckLoops()
返回值:
返回构成环路的弧段 ID 数组。
方法二:根据给定的结点 ID 数组查找与这些结点相连通的环路,返回构成环路的弧段 ID 数组。
语法:
public Int32[] FindLoopsFromNodes(Int32[] nodeIDs)
参数说明:
nodeIDs:指定的结点 ID 数组。
返回值:
返回与给定结点相连通的环路的弧段 ID 数组。
方法三:根据给定的弧段 ID 数组查找与这些弧段相连通的环路,返回构成环路的弧段 ID 数组。
语法:
public Int32[] FindLoopsFromEdges(Int32[] edgeIDs)
参数说明:
edgeIDs:指定的弧段 ID 数组。
返回值:
返回与给定弧段相连通的环路的弧段 ID 数组。
在现实生活中,点与点之间并不总是连通的,如果我们想要知道哪些点之间是连通的,哪些点之间不连通,就可以使用连通性分析功能。连通性分析的最大特点是不需要考虑网络阻力值的大小(禁止通行除外),网络上的结点和弧段只有连通和不连通之分。禁止通行可以通过设置障碍点和障碍边实现。
如图 8-2 所示,绿色部分是与分析结点相连通的弧段与结点,它们中的每一个都通过其他结点或弧段连接到分析结点;灰色部分的网络中的弧段与结点,无法连接到分析结点,因此与分析结点是不连通的。例如,在进行污染源调查的事件中,经过分析和判断之后发现可疑污染源的位置,可以通过查找连通弧段功能找出与可疑的污染源点相连的水路,以方便监测船沿路监测污染物含量。
图 8-2 连通与不连通 |
目前,FacilityAnalyst 类提供的连通性分析主要包括:查找与指定结点或弧段相连通的弧段、查找与指定结点或弧段不相连通的弧段。下面分别介绍其实现方法。
FacilityAnalyst 类提供了两个方法,用于查找与指定结点或弧段相连通的弧段。当查找多个结点或弧段的连通弧段时,返回的结果是每个结点或弧段的连通弧段的并集。
方法一:根据给定的结点 ID 数组,查找与这些结点相连通弧段,返回弧段 ID 数组。
语法:
public Int32[] FindConnectedEdgesFromNodes(Int32[] nodeIDs)
参数说明:
nodeIDs:指定的结点 ID 数组。
返回值:
返回与给定结点相连通的弧段 ID 数组。
方法二:根据给定的弧段 ID 数组,查找与这些弧段相连通的弧段,返回弧段 ID 数组。
语法:
public Int32[] FindConnectedEdgesFromEdges(Int32[] edgeIDs)
参数说明:
edgeIDs:指定的弧段 ID 数组。
返回值:
返回与给定弧段相连通的弧段 ID 数组。
FacilityAnalyst 类提供了两个方法,用于查找与指定结点或弧段不相连通的弧段。同样,当查找多个结点或弧段的不连通弧段时,返回的结果是每个结点或弧段的不连通弧段的并集。
方法一:根据给定的结点 ID 数组,查找与这些结点不相连通弧段,返回弧段 ID 数组。
语法:
public Int32[] FindUnconnectedEdgesFromNodes(Int32[] nodeIDs)
参数说明:
nodeIDs:指定的结点 ID 数组。
返回值:
返回与给定结点不相连通的弧段 ID 数组。
方法二:根据给定的弧段 ID 数组,查找与这些弧段不相连通的弧段,返回弧段 ID 数组。
语法:
public Int32[] FindUnconnectedEdgesFromEdges (Int32[] edgeIDs)
参数说明:
edgeIDs:指定的弧段 ID 数组。
返回值:
返回与给定弧段不相连通的弧段 ID 数组。
在设施网络中,网络的源和汇都以网络结点的形式存在。网络中的结点可以是源、汇,也可以是普通的结点,例如管网中的阀门、三通连接头等,它们并不是资源流动的起点或终点。源和汇在网络流向上的意义非常清晰,即资源总是从源流出,最终流入汇。例如,电网中的电流总是从发电站流向用户,因此发电站是源,而用户则是汇。网络中可以有多个源和汇。
SuperMap 设施网络分析提供了查找源、查找汇的功能,下面分别介绍其实现方法。
查找源是指从给定结点(或弧段)出发,按照流向,查找流向该结点(或弧段)的网络源头结点(即源点)。
FacilityAnalyst 类提供了两个方法:FindConnectedEdgesFromNodes 和 FindConnectedEdgesFromEdges,分别用于从给定结点查找源,和从给定弧段查找源。该方法分析的结果为:查找到的源到达给定结点(或弧段)的最小耗费路径所包含的弧段、结点及耗费。当网络中有多个源时,将查找最远的也就是到达给定结点(或弧段)的最小耗费最大的那个源。实际上,可将该功能的实现过程分为三步来加以理解:
1. 从给定结点(或弧段)出发,根据流向,找到该结点(或弧段)上游所有的源点。
2. 分析每个源到达给定结点(或弧段)的最小耗费路径并计算耗费。
3. 选择上一步中计算出的耗费中的最大值所对应的路径作为结果,给出该路径上的弧段 ID 数组、结点 ID 数组以及该路径的耗费。
图 8-3 是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 M 进行查找源分析。可以知道,从 结点 M 出发,根据流向向上回溯,共有 7 个源,从源到结点 M 的最小耗费路径分别为:C-H-M、A-E-H-M、B-D-E-H-M、F-D-E-H-M、J-N-M、I-N-M 和 P-N-M,根据网络阻力,也就是弧段权值,可以计算得出 B-D-E-H-M 这条路径的耗费最大,为 18.4,因此,结点 B 就是查找到的源。
图 8-3 查找源 |
下面给出查找源的实现方法的详细说明:
方法一:根据给定的结点 ID 查找源,即从给定结点出发,根据流向查找流向该结点的网络源头,并返回该源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindSourceFromNode (Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
方法二:根据给定的弧段 ID 查找源,即从给定弧段出发,根据流向查找流向该弧段的网络源头,并返回该源到达给定弧段的最小耗费路径所包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindSourceFromEdge (Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
以上两个方法均返回一个 FacilityAnalystResult 对象,从该对象可以得到查找源的结果,包括查找到的源到达给定结点(或弧段)的最小耗费路径上的弧段 ID 数组(Edges 属性)、结点 ID 集合(Nodes 属性),以及这条路径的耗费值(Cost 属性)。
查找汇与查找源类似,是从给定结点(或弧段)出发,根据流向,查找流出该结点(或弧段)的下游汇点。
FacilityAnalyst 类的 FindConnectedEdgesFromNodes 和 FindConnectedEdgesFromEdges 方法,分别用于从给定结点查找汇,和从给定弧段查找汇。该方法分析的结果为:给定结点(或弧段)到达汇的最小耗费路径所包含的弧段、结点及耗费。当网络中有多个汇时,将查找最远的也就是从指定结点(或弧段)出发最小耗费最大的那个汇。同样,也可将查找汇的过程分为三步来理解:
1. 从给定结点(或弧段)出发,根据流向,找到该结点(或弧段)下游的所有汇点。
2. 分析从给定结点(或弧段)到达每个汇的的最小耗费路径并计算耗费。
3. 选择上一步中计算出的耗费中的最大值所对应的路径作为结果,给出该路径上的弧段 ID 数组、结点 ID 数组以及该路径的耗费。
图 8-4 是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 D 进行查找汇分析。可以知道,从 结点 D 出发,根据流向向下查找,共有 4 个汇,从结点 D 到达汇的最小耗费路径分别为:E-H-L-G、E-H-L-K、E-H-M-S 和 E-H-M-Q-R,根据网络阻力,也就是弧段权值,可以计算得出 E-H-M-Q-R 这条路径的耗费最大,为 16.6,因此,结点 R 就是查找到的汇。
图 8-4 查找源 |
下面给出查找汇的实现方法的详细说明:
方法一:根据给定的结点 ID 查找汇,即从给定结点出发,根据流向查找流出该结点的下游汇点,并返回给定结点到达该汇的最小耗费路径所包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindSinkFromNode (Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
方法二:根据给定的弧段 ID 查找汇,即从给定弧段出发,根据流向查找流出该弧段的下游汇点,并返回给定弧段到达该汇的最小耗费路径所包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindSourceFromEdge (Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
以上两个方法均返回一个 FacilityAnalystResult 对象,从该对象可以得到查找汇的结果,包括给定结点(或弧段)到达查找到的汇的最小耗费路径上的弧段 ID 数组(Edges 属性)、结点 ID 集合(Nodes 属性),以及这条路径的耗费值(Cost 属性)。
首先来了解什么是上游和下游。
对于某个结点(或弧段)来说,网络中的资源最终流入该结点(或弧段)所经过的弧段和结点称为它的上游;从该结点(或弧段)流出最终流入汇点所经过的弧段和网络称为它的下游。
下面以结点的上游和下游为例加以阐述。图 8-5 是一个简单的设施网络的示意图,使用箭头标出了网络的流向。根据流向,可以看出,资源流经结点 B、D、C、H、G 以及弧段 BG、DG、CG、HJ、GJ 最终流入结点 J,因此这些结点和弧段称为结点 J 的上游,其中的结点称为它的上游结点,弧段称为它的上游弧段。同样的,资源从结点 J 流出,流经结点 I、K、L 以及弧段 JI、IK、KL 最终流出网络,因此,这些结点和弧段称为结点 J 的下游,其中的结点称为它的下游结点,弧段称为它的下游弧段。
图 8-5 上游与下游 |
SuperMap 设施网络分析提供了上游追踪和下游追踪功能,分别用于查找给定结点(或弧段)的上游和下游,下面进行详细介绍。
上游追踪,是从给定结点(或弧段)出发,根据流向,查找其上游的过程。
上游追踪的一个常用应用是辅助定位河流水污染物来源。河流不仅是地球水循环的重要路径,也是人类最主要的淡水资源,一旦河流发生污染而没有及时发现污染源并消除,很可能影响人们的正常饮水和健康。由于河流受重力影响从高处向低处流动,因此当河流发生污染时,应考虑其上游可能出现了污染源,如工业废水排放、生活污水排放、农药化肥污染等。河流水污染物来源追踪的大致步骤一般为:
1. 当水质监测站的监测数据显示水质发生异常,首先确定发生异常的位置,从而在河流网络(网络数据集)上找出该位置所在(或最近)的弧段或结点,作为上游追踪的起点;
2. 如果知道在起点的上游中距离起点最近的水质监测正常的位置,可以将这些位置或其所在的河段设置为障碍,可以帮助进一步缩小分析的范围。因为可以认为,水质监测正常的位置的上游,不可能存在此次调查的污染源。设置为障碍后,进行上游追踪分析,追踪到该位置后,将不会继续追踪该位置的上游;
3. 进行上游追踪分析,查找到向发生水质异常位置所在河段汇流的所有河段;
4. 使用空间查询、分析找出位于这些河段附近的所有可能的污染源,如化工厂、垃圾处理厂等;
5. 根据发生水质异常的监测数据对污染源进行进一步筛选;
6. 分析筛选出的污染源的排污负荷,按照其造成污染的可能性进行排序;
7. 对可能的污染源按照顺序进行实地调查与研究,最终确定污染物来源。
FacilityAnalyst 类提供了两个方法,用于查找指定结点(或弧段)的上游:
方法一:根据给定的结点 ID 进行上游追踪,即查找给定结点的上游,返回上游包含的弧段 ID 数组、结点 ID 数组及总耗费。
语法:
public FacilityAnalystResult TraceUpFromNode(Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
方法二:根据给定的弧段 ID 进行上游追踪,即查找给定弧段的上游,返回上游包含的弧段 ID 数组、结点 ID 数组及总耗费。
语法:
public FacilityAnalystResult TraceUpFromEdge(Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
以上两个方法均返回一个 FacilityAnalystResult 对象,从该对象可以得到上游追踪的结果,包括给定结点(或弧段)的上游结点 ID 数组(Nodes 属性)、上游弧段 ID 数组(Edges 属性),以及流经整个上游的总耗费(Cost 属性)。
下游追踪,是从给定结点(或弧段)出发,根据流向,查找其下游的过程。
下游追踪常用于影响范围的分析。例如:
FacilityAnalyst 类提供了两个方法,用于查找指定结点(或弧段)的下游:
方法一:根据给定的结点 ID 进行下游追踪,即查找给定结点的下游,返回下游包含的弧段 ID 数组、结点 ID 数组及总耗费。
语法:
public FacilityAnalystResult TraceDownFromNode(Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
方法二:根据给定的弧段 ID 进行下游追踪,即查找给定弧段的下游,返回下游包含的弧段 ID 数组、结点 ID 数组及总耗费。
语法:
public FacilityAnalystResult TraceDownFromEdge(Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
以上两个方法均返回一个 FacilityAnalystResult 对象,从该对象可以得到下游追踪的结果,包括给定结点(或弧段)的下游结点 ID 数组(Nodes 属性)、下游弧段 ID 数组(Edges 属性),以及流经整个下游的总耗费(Cost 属性)。
共同上游是指多个结点(或弧段)的公共上游网络,即这些结点(或弧段)各自上游的交集部分。同样,共同下游是多个结点(或弧段)各自下游的交集部分。
FacilityAnalyst 提供了查找共同上游弧段、查找共同下游弧段的实现方法,下面分别进行介绍。
有关“上游”和“下游”,请参阅上一小节(8.4)的介绍。
图 8-6 中,前两幅图分别是对结点 1 和结点 2 进行上游追踪的结果,查找出各自的上游弧段(绿色),第三幅图则是对结点 1 和结点 2 查找共同上游弧段(橙色),容易看出,结点 1 和结点 2 的共同上游弧段,就是它们各自的上游弧段的交集。
图 8-6 共同上游 |
FacilityAnalyst 类提供了两个方法,用于查找多个结点(或弧段)的共同上游弧段:
方法一:根据给定的结点 ID 数组,查找这些结点的共同上游弧段,返回弧段 ID 数组。
语法:
public Int32[] FindCommonAncestorsFromNodes(Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回给定结点的共同上游的弧段 ID 数组。
方法二:根据给定的弧段 ID 数组,查找这些弧段的共同上游弧段,返回弧段 ID 数组。
语法:
public Int32[] FindCommonAncestorsFromEdges(Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回给定弧段的共同上游的弧段 ID 数组。
图 8-7 中,前两幅图分别是对结点 1 和结点 2 进行下游追踪的结果,查找出各自的下游弧段(绿色),第三幅图则是对结点 1 和结点 2 查找共同下游弧段(橙色),容易看出,结点 1 和结点 2 的共同下游弧段,就是它们各自的下游弧段的交集。
图 8-7 共同下游 |
FacilityAnalyst 类提供了两个方法,用于查找多个结点(或弧段)的共同下游弧段:
方法一:根据给定的结点 ID 数组,查找这些结点的共同下游弧段,返回弧段 ID 数组。
语法:
public Int32[] FindCommonCatchmentsFromNodes(Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回给定结点的共同下游的弧段 ID 数组。
方法二:根据给定的弧段 ID 数组,查找这些弧段的共同下游弧段,返回弧段 ID 数组。
语法:
public Int32[] FindCommonCatchmentsFromEdges(Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回给定弧段的共同下游的弧段 ID 数组。
设施网络的路径追踪分析包括三方面内容:两结点(弧段)间的路径分析、上游路径分析和下游路径分析。
路径追踪分析,是依据网络流向和网络权值,计算最小耗费路径的过程。耗费值依据指定的权值字段的值来计算,具体内容请参阅第 6 章。最小耗费路径的含义也是由权值字段的意义决定的。例如,如果权值均相等或不使用耗费(设置权值为 0),则查找的是弧段数最少的路径;如果使用弧段长度作为权值,则查找的是最短路径。
下面对这三种路径追踪分析分别进行详细介绍。
两结点(或弧段)间的最小耗费路径的查找过程为:从给定的起始结点(或弧段)出发,根据流向,查找到给定的终止结点(或弧段)的所有路径,然后从其中找出耗费最小的一条返回。起始和终止对象必须是同一类型,即都是结点,或都是弧段。
图 8-8 是两结点最小耗费路径的示意图。从起始结点 B 出发,沿着网络流向,有三条路径能够到达终止结点 P,分别为 B-D-L-P、B-C-G-I-J-K-P 和 E-E-F-H-M-N-O-P,其中路径 B-C-G-I-J-K-P 的耗费最小,为 105,因此该路径是结点 B 到 P 的最小耗费路径。
图 8-8 两结点间最小耗费路径 |
FacilityAnalyst 类提供了两个方法,用于查找任意两结点(或任意两弧段)之间的最小耗费路径:
方法一:路径分析,即根据给定的起始和终止结点 ID,查找其间耗费最小的路径,返回该路径包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindPathFromNodes(Int32 startNodeID, Int32 endNodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
startNodeID:指定的起始结点 ID。
endNodeID:指定的终止结点 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
方法二:路径分析,即根据给定的起始和终止弧段 ID,查找其间耗费最小的路径,返回该路径包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindPathFromEdges(Int32 startEdgeID, Int32 endEdgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
startEdgeID:指定的起始弧段 ID。
endEdgeID:指定的终止弧段 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
以上两个方法均返回一个 FacilityAnalystResult 对象,从该对象可以得到路径分析的结果,包括给定两结点(或两弧段)间的最小耗费路径上的结点 ID 数组(Nodes 属性)、弧段 ID 数组(Edges 属性),以及该路径的耗费(Cost 属性)。如果没有找到路径则返回 null。
上游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有上游路径,然后从其中找出耗费最小的一条返回。
图 8-9 是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 I 进行上游最小耗费路径分析。首先从结点 I 出发,根据流向向上回溯,找出结点 I 的所有上游路径,共有 6 条,包括:E-F-I、A-F-I、B-G-J-I、D-G-J-I、C-G-J-I 和 H-J-I,然后根据网络阻力(即权值)计算这些路径的耗费,可以得出 E-F-I 这条路径的耗费最小,为 8.2,因此,结点 I 的上游最小耗费路径就是 E-F-I。
图 8-9 上游最小耗费路径 |
FacilityAnalyst 类提供了两个方法,用于查找给定结点(或弧段)的上游最小耗费路径:
方法一:上游路径分析,根据给定的结点 ID,查询该结点的下游最小耗费路径,返回该路径包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindPathUpFromNode(Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
方法二:上游路径分析,根据给定的弧段 ID,查询该弧段的上游最小耗费路径,返回该路径包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindPathUpFromEdge(Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
以上两个方法均返回一个 FacilityAnalystResult 对象,从该对象可以得到上游路径分析的结果,包括给定结点(或两弧段)的上游最小耗费路径上的结点 ID 数组(Nodes 属性)、弧段 ID 数组(Edges 属性),以及该路径的耗费(Cost 属性)。
上游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有下游路径,然后从其中找出耗费最小的一条返回。
图 8-10 是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 H 进行下游最小耗费路径分析。首先从结点 H 出发,根据流向向下查找,找出结点 H 的所有下游路径,共有 4 条,包括:H-L-G、H-L-K、H-M-S 和 H-M-Q-R,然后根据网络阻力(即权值)计算这些路径的耗费,可以得出 H-L-K 这条路径的耗费最小,为 11.1,因此,结点 H 的下最小耗费路径就是 H-L-K。
图 8-10 下游最小耗费路径 |
FacilityAnalyst 类提供了两个方法,用于查找给定结点(或弧段)的下游最小耗费路径:
方法一:下游路径分析,根据给定的结点 ID,查询该结点的下游最小耗费路径,返回该路径包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindPathDownFromNode(Int32 nodeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
nodeID:指定的结点 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
方法二:下游路径分析,根据给定的弧段 ID,查询该弧段的下游最小耗费路径,返回该路径包含的弧段、结点及耗费。
语法:
public FacilityAnalystResult FindPathDownFromEdge(Int32 edgeID, String weightName, Boolean isUncertainDirectionValid)
参数说明:
edgeID:指定的弧段 ID。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值:
返回设施网络分析结果。
以上两个方法均返回一个 FacilityAnalystResult 对象,从该对象可以得到下游路径分析的结果,包括给定结点(或两弧段)的下游最小耗费路径上的结点 ID 数组(Nodes 属性)、弧段 ID 数组(Edges 属性),以及该路径的耗费(Cost 属性)。