public class FacilityAnalyst
extends com.supermap.data.InternalHandleDisposable
设施网络分析类。它是网络分析功能类之一,主要用于进行各类连通性分析和追踪分析。
设施网络分析属于网络分析功能的一种,所以在进行设施网络分析之前,您需要具备的前提知识是:
设施网络是具有方向的网络。即介质(水流、电流等)会根据网络本身的规则在网络中流动。
设施网络分析的前提是已经建立了用于设施网络分析的数据集,建立用于设施网络分析的数据集的基础是建立网络数据集,在此基础上利用
NetworkBuilder
类的
buildFacilityNetworkDirections
方法赋予网络数据集特有的用于进行设施网络分析的数据信息,也就是为网络数据集建立流向,使原有的网络数据集具有了能够进行设施网络分析的最基本的条件
,此时,就可以进行各种设施网络分析了。如果你的设施网络具有等级信息,还可以进一步使用 NetworkBuilder
类的
buildFacilityNetworkHierarchies()
方法添加等级信息。详细信息请参见 NetworkBuilder
类的
buildFacilityNetworkDirections
和
buildFacilityNetworkHierarchies()
方法。
在利用设施网络分析类进行分析时,以及上面提到的建立用于设施网络分析的数据集,都要进行设施网络分析环境参数的设置,即使用到
FacilityAnalystSetting
类所做的设置。详细信息请参见
FacilityAnalystSetting
类。
当具备了以上知识,您就可以使用 FacilityAnalyst
类提供的各种方法来实现各种设施网络分析功能。目前,FacilityAnalyst
类提供的设施网络分析功能包括:
还可以阅读《设施网络分析》技术文档以便了解更多有关设施网络分析的介绍。
findSourceFromNode
、traceUpFromNode
、
findCommonAncestorsFromNodes
、
findPathFromNodes
以及
findPathDownFromNode
等方法的示例。构造器和说明 |
---|
FacilityAnalyst()
构造一个新的 FacilityAnalyst 对象。
|
限定符和类型 | 方法和说明 |
---|---|
BurstAnalyseResult |
burstAnalyseFromEdge(int[] sourceNodeIDs,
int edgeID,
boolean isUncertainDirectionValid)
双向爆管分析,通过指定爆管弧段,查找爆管弧段上下游中对爆管位置产生直接影响的结点以及受爆管位置直接影响的结点。
|
BurstAnalyseResult |
burstAnalyseFromNode(int[] sourceNodeIDs,
int nodeID,
boolean isUncertainDirectionValid)
双向爆管分析,通过指定爆管结点,查找爆管结点上下游中对爆管位置产生直接影响的结点以及受爆管位置直接影响的结点。
|
int[] |
checkLoops()
检查网络环路,返回构成环路的弧段 ID 数组。
|
void |
dispose()
释放该对象所占用的资源。
|
int[] |
findCommonAncestorsFromEdges(int[] edgeIDs,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 数组,查找这些弧段的共同上游弧段,返回弧段 ID 数组。
|
int[] |
findCommonAncestorsFromNodes(int[] nodeIDs,
boolean isUncertainDirectionValid)
根据给定的结点 ID 数组,查找这些结点的共同上游弧段,返回弧段 ID 数组。
|
int[] |
findCommonCatchmentsFromEdges(int[] edgeIDs,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 数组,查找这些弧段的共同下游弧段,返回弧段 ID 数组。
|
int[] |
findCommonCatchmentsFromNodes(int[] nodeIDs,
boolean isUncertainDirectionValid)
根据指定的结点 ID 数组,查找这些结点的共同下游弧段,返回弧段 ID 数组。
|
int[] |
findConnectedEdgesFromEdges(int[] edgeIDs)
根据给定的弧段 ID 数组,查找与这些弧段相连通的弧段,返回弧段 ID 数组。
|
int[] |
findConnectedEdgesFromNodes(int[] nodeIDs)
根据给定的结点 ID 数组,查找与这些结点相连通弧段,返回弧段 ID 数组。
|
FacilityAnalystResult |
findCriticalFacilitiesDownFromEdge(int[] sourceNodeIDs,
int edgeID,
boolean isUncertainDirectionValid)
下游关键设施查找,即查找给定弧段的关键下游设施结点,返回关键设施结点 ID 数组及给定弧段影响到的下游弧段 ID 数组。
|
FacilityAnalystResult |
findCriticalFacilitiesDownFromNode(int[] sourceNodeIDs,
int nodeID,
boolean isUncertainDirectionValid)
下游关键设施查找,即查找给定结点的下游关键设施结点,返回关键结点 ID 数组及给定结点影响到的下游弧段 ID 数组。
|
FacilityAnalystResult |
findCriticalFacilitiesUpFromEdge(int[] sourceNodeIDs,
int edgeID,
boolean isUncertainDirectionValid)
上游关键设施查找,即查找给定弧段的上游中的关键设施结点,返回关键结点 ID 数组及其下游弧段 ID 数组。
|
FacilityAnalystResult |
findCriticalFacilitiesUpFromNode(int[] sourceNodeIDs,
int nodeID,
boolean isUncertainDirectionValid)
上游关键设施查找,即查找给定结点的上游中的关键设施结点,返回关键结点 ID 数组及其影响到的下游弧段 ID 数组。
|
int[] |
findLoopsFromEdges(int[] edgeIDs)
根据给定的弧段 ID 数组查找与这些弧段相连通的环路,返回构成环路的弧段 ID 数组。
|
int[] |
findLoopsFromNodes(int[] nodeIDs)
根据给定的结点 ID 数组查找与这些结点相连通的环路,返回构成环路的弧段 ID 数组。
|
FacilityAnalystResult |
findPathDownFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
设施网络下游路径分析,根据给定的参与分析的弧段 ID,查询该弧段下游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathDownFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
设施网络下游路径分析,根据给定的参与分析的结点 ID,查询该结点下游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathFromEdges(int startEdgeID,
int endEdgeID,
String weightName,
boolean isUncertainDirectionValid)
设施网络路径分析,即根据给定的起始和终止弧段 ID,查找其间耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathFromNodes(int startNodeID,
int endNodeID,
String weightName,
boolean isUncertainDirectionValid)
设施网络路径分析,即根据给定的起始和终止结点 ID,查找其间耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathUpFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
设施网络上游路径分析,根据给定的弧段 ID,查询该弧段上游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathUpFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
设施网络上游路径分析,根据给定的结点 ID,查询该结点上游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSinkFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 查找汇,即从给定弧段出发,根据流向查找流出该弧段的下游汇点,并返回给定弧段到达该汇的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSinkFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 查找汇,即从给定结点出发,根据流向查找流出该结点的下游汇点,并返回给定结点到达该汇的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSourceFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 查找源,即从给定弧段出发,根据流向查找流向该弧段的网络源头,并返回该源到达给定弧段的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSourceFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 查找源,即从给定结点出发,根据流向查找流向该结点的网络源头,并返回该源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。
|
int[] |
findUnconnectedEdgesFromEdges(int[] edgeIDs)
根据给定的弧段 ID 数组,查找与这些弧段不相连通的弧段,返回弧段 ID 数组。
|
int[] |
findUnconnectedEdgesFromNodes(int[] nodeIDs)
根据给定的结点 ID 数组,查找与这些结点不相连通的弧段,返回弧段 ID 数组。
|
FacilityAnalystSetting |
getAnalystSetting()
返回设施网络分析的环境。
|
boolean |
load()
根据设施网络分析环境设置加载设施网络模型。
|
void |
setAnalystSetting(FacilityAnalystSetting value)
设置设施网络分析的环境。
|
FacilityAnalystResult |
traceDownFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 进行下游追踪,即查找给定弧段的下游,返回下游包含的弧段、结点及总耗费。
|
FacilityAnalystResult |
traceDownFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 进行下游追踪,即查找给定结点的下游,返回下游包含的弧段、结点及总耗费。
|
FacilityAnalystResult |
traceUpFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 进行上游追踪,即查找给定弧段的上游,返回上游包含的弧段、结点及总耗费。
|
FacilityAnalystResult |
traceUpFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 进行上游追踪,即查找给定结点的上游,返回上游包含的弧段、结点及总耗费。
|
public FacilityAnalystSetting getAnalystSetting()
设施网络分析环境参数的设置,直接影响到设施网络分析的结果。设施网络分析所需要的参数包括:用于进行设施网络分析的数据集(
即建立了流向的网络数据集或者同时建立了流向和等级的网络数据集,也就是说该方法对应的 FacilityAnalystSetting
类对象的
setNetworkDataset()
方法所指定的网络数据集必须有流向或者流向和等级信息)、结点 ID 字段、弧段 ID 字段、弧段起始结点
ID 字段、弧段终止结点 ID 字段、权值信息、点到弧段的距离容限、障碍结点、障碍弧段、流向等。有关设施网络分析环境参数的设置,请参见
FacilityAnalystSetting
类。
FacilityAnalystSetting
FacilityAnalystSetting
对象。public void setAnalystSetting(FacilityAnalystSetting value)
设施网络分析环境参数的设置,直接影响到设施网络分析的结果。设施网络分析所需要的参数包括:用于进行设施网络分析的数据集(
即建立了流向的网络数据集或者同时建立了流向和等级的网络数据集,也就是说该方法对应的 FacilityAnalystSetting 类对象的
setNetworkDataset() 方法所指定的网络数据集必须有流向或者流向和等级信息)、结点 ID 字段、弧段 ID 字段、弧段起始结点
ID 字段、弧段终止结点 ID 字段、权值信息、点到弧段的距离容限、障碍结点、障碍弧段、流向等。有关设施网络分析环境参数的设置,请参见
FacilityAnalystSetting
类。
value
- 设施网络分析环境参数。FacilityAnalystSetting
public boolean load()
该方法根据设施网络分析环境设置(FacilityAnalystSetting
)对象中的环境参数,加载网络模型。在设置好设施网络分析环境的参数后,只有调用该方法,所做的设施网络分析环境设置才会在设施网络分析的过程中生效。
注意:
CheckLoops
方法的示例。public int[] findLoopsFromNodes(int[] nodeIDs)
设施网络中,两条或两条以上流向值为 2(即不确定流向)的弧段构成的闭合路径,称为环路。详细内容请参阅 checkLoops
方法的介绍。
nodeIDs
- 指定的结点 ID 数组。findLoopsFromNodes
方法的示例。public int[] findLoopsFromEdges(int[] edgeIDs)
设施网络中,两条或两条以上流向值为 2(即不确定流向)的弧段构成的闭合路径,称为环路。详细内容请参阅 checkLoops
方法的介绍。
edgeIDs
- 指定的弧段 ID 数组。buildFacilityNetworkDirections
方法的示例。
public void FindLoopsFrom(DatasetVector networkDataset) { // 设置用于设施网络分析的环境 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(networkDataset); facilityAnalystSetting.setDirectionField("Direction"); facilityAnalystSetting.setEdgeIDField("SmID"); facilityAnalystSetting.setNodeIDField("SmNodeID"); facilityAnalystSetting.setFNodeIDField("SmFNode"); facilityAnalystSetting.setTNodeIDField("SmTNode"); facilityAnalystSetting.setTolerance(0.0015); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SmLength"); weightFieldInfo.setTFWeightField("SmLength"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); facilityAnalyst.load(); // 获取参与分析的弧段或结点 int[] edgeIDs = new int[] { 3855, 9073 }; int[] nodeIDs = new int[] { 2996, 2682 }; // 查找与给定弧段相连通的环路 int[] loopsFromEdges = facilityAnalyst.findLoopsFromEdges(edgeIDs); // 查找与给定结点相连通的环路 int[] loopsFromNodes = facilityAnalyst.findLoopsFromNodes(nodeIDs); }
public int[] findConnectedEdgesFromNodes(int[] nodeIDs)
在现实生活中,点与点之间并不总是连通的,如果我们想要知道哪些点之间是连通的,哪些点之间不连通,就可以使用连通性分析功能。 连通性分析的最大特点是不需要考虑网络阻力值的大小(禁止通行除外),网络上的结点和弧段只有连通和不连通之分。禁止通行可以通过设置障碍点和障碍边实现。
如下图所示,绿色部分是与分析结点相连通的弧段与结点,它们中的每一个都通过其他结点或弧段连接到分析结点;灰色部分的网络中的弧段与结点, 无法连接到分析结点,因此与分析结点是不连通的。
该方法用于查找与给定结点相连通的弧段,查找出连通弧段后,可根据网络拓扑关系,即弧段的起始结点、终止结点查询出相应的连通结点。
应用实例
在进行污染源调查的事件中,经过分析和判断之后发现可疑污染源的位置,可以通过查找连通弧段功能找出与可疑的污染源点相连的水路, 以方便监测船沿路监测污染物含量。
nodeIDs
- 指定的结点 ID 数组。buildFacilityNetworkDirections
方法的示例。
{ // 设置用于设施网络分析的环境 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(networkDataset); facilityAnalystSetting.setDirectionField("Direction"); facilityAnalystSetting.setEdgeIDField("SmID"); facilityAnalystSetting.setNodeIDField("SmNodeID"); facilityAnalystSetting.setFNodeIDField("SmFNode"); facilityAnalystSetting.setTNodeIDField("SmTNode"); facilityAnalystSetting.setTolerance(0.0015); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SmLength"); weightFieldInfo.setTFWeightField("SmLength"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); facilityAnalyst.load(); // 获取参与分析的弧段或结点 int[] edgeIDs = new int[] { 3855, 9073 }; int[] nodeIDs = new int[] { 2996, 2682 }; // 查找与给定弧段相连通和不相连通的弧段 int[] connectEdges = facilityAnalyst.findConnectedEdgesFromEdges(edgeIDs); int[] unconnectEdges = facilityAnalyst .findUnconnectedEdgesFromEdges(edgeIDs); // 查找与给定的结点相连通和不相连通的弧段 int[] connectNodes = facilityAnalyst.findConnectedEdgesFromNodes(nodeIDs); int[] unconnectNodes = facilityAnalyst .findUnconnectedEdgesFromNodes(nodeIDs); }
public int[] findConnectedEdgesFromEdges(int[] edgeIDs)
该方法用于查找与给定弧段相连通的弧段,查找出连通弧段后,可根据网络拓扑关系,即弧段的起始结点、终止结点查询出相应的连通结点。
有关网络连通性的更多介绍,请参见 findConnectedEdgesFromNodes
方法。
edgeIDs
- 指定的弧段 ID 数组。findConnectedEdgesFromNodes
方法的示例。public int[] findUnconnectedEdgesFromNodes(int[] nodeIDs)
该方法用于查找与给定结点不连通的弧段,查找出连通弧段后,可根据网络拓扑关系,即弧段的起始结点、终止结点查询出相应的不连通结点。
有关网络连通性的更多介绍,请参见 findConnectedEdgesFromNodes
方法。
nodeIDs
- 指定的结点 ID 数组。findConnectedEdgesFromNodes
方法的示例。public int[] findUnconnectedEdgesFromEdges(int[] edgeIDs)
该方法用于查找与给定弧段不连通的弧段,查找出连通弧段后,可根据网络拓扑关系,即弧段的起始结点、终止结点查询出相应的不连通结点。
有关网络连通性的更多介绍,请参见 findConnectedEdgesFromNodes
方法。
edgeIDs
- 指定的弧段 ID 数组。findConnectedEdgesFromNodes
方法的示例。public int[] findCommonAncestorsFromNodes(int[] nodeIDs, boolean isUncertainDirectionValid)
有关“上游”的介绍,请参阅 traceUpFromNode
方法。
共同上游是指多个结点(或弧段)的公共上游网络。该方法用于查找多个结点的共同上游弧段,即取这些结点的各自上游弧段的交集部分,结果返回这些弧段的弧段 ID。
如下图所示,流向如图中的箭头所示的方向,前两幅图分别是对结点 1 和结点 2 进行上游追踪的结果,查找出各自的上游弧段(绿色),第三幅图则是对结点 1 和结点 2 查找共同上游弧段(橙色),容易看出,结点 1 和结点 2 的共同上游弧段,就是它们各自的上游弧段的交集。
nodeIDs
- 给定的结点 ID 数组。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。buildFacilityNetworkDirections
方法的示例。
public void FindCommonAncestorsandCatchementsEdges(DatasetVector networkDataset) { // 设置用于设施网络分析的环境 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(networkDataset); facilityAnalystSetting.setDirectionField("Direction"); facilityAnalystSetting.setEdgeIDField("SmID"); facilityAnalystSetting.setNodeIDField("SmNodeID"); facilityAnalystSetting.setFNodeIDField("SmFNode"); facilityAnalystSetting.setTNodeIDField("SmTNode"); facilityAnalystSetting.setTolerance(0.0015); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SmLength"); weightFieldInfo.setTFWeightField("SmLength"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); facilityAnalyst.load(); // 获取参与分析的弧段或结点 int[] edgeIDs = new int[] { 3855, 9073 }; int[] nodeIDs = new int[] { 2996, 2682 }; // 查找给定弧段的共同上游弧段和共同上游弧段 int[] commonAncestorsofEdges = facilityAnalyst .findCommonAncestorsFromEdges(edgeIDs, false); int[] commonCatchmentsofEdges = facilityAnalyst .findCommonCatchmentsFromEdges(edgeIDs, false); // 查找给定结点的共同上游弧段和共同上游弧段 int[] commonAncestorsofNodes = facilityAnalyst .findCommonAncestorsFromNodes(nodeIDs, false); int[] commonCatchementsofNodes = facilityAnalyst .findCommonCatchmentsFromNodes(nodeIDs, false); }
public int[] findCommonAncestorsFromEdges(int[] edgeIDs, boolean isUncertainDirectionValid)
有关“上游”的介绍,请参阅 traceUpFromNode
方法。
共同上游是指多个结点(或弧段)的公共上游网络。该方法用于查找多条弧段的共同上游弧段,即取这些弧段的各自上游弧段的交集部分,结果返回这些弧段的弧段 ID。
请参阅 findCommonAncestorsFromNodes
方法获得更多关于“查找共同上游弧段”的介绍。
edgeIDs
- 指定的弧段 ID 数组。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findCommonAncestorsFromNodes
方法的示例。public int[] findCommonCatchmentsFromNodes(int[] nodeIDs, boolean isUncertainDirectionValid)
有关“下游”的介绍,请参阅 traceUpFromNode
方法。
共同下游是指多个结点(或弧段)的公共下游网络。该方法用于查找多个结点的共同下游弧段,即取这些结点的各自下游弧段的交集部分,结果返回这些弧段的弧段 ID。
如下图所示,流向如图中的箭头所示的方向,前两幅图分别是对结点 1 和结点 2 进行下游追踪的结果,查找出各自的下游弧段(绿色),第三幅图则是对结点 1 和结点 2 查找共同下游弧段(橙色),容易看出,结点 1 和结点 2 的共同下游弧段,就是它们各自的下游弧段的交集。
nodeIDs
- 指定的结点 ID 数组。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findCommonAncestorsFromNodes
方法的示例。public int[] findCommonCatchmentsFromEdges(int[] edgeIDs, boolean isUncertainDirectionValid)
有关“下游”的介绍,请参阅 traceUpFromNode
方法。
共同下游是指多个结点(或弧段)的公共下游网络。该方法用于查找多条弧段的共同下游弧段,即取这些弧段的各自下游弧段的交集部分,结果返回这些弧段的弧段 ID。
请参阅 findCommonCatchmentsFromNodes
方法获得更多关于“查找共同下游弧段”的介绍。
edgeIDs
- 指定的弧段 ID 数组。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findCommonAncestorsFromNodes
方法的示例。public FacilityAnalystResult findSourceFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定结点出发,按照流向,查找流向该结点的网络源头结点(即源点),分析的结果为查找到的源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。 如果网络中有多个源,将查找最远的也就是到达给定结点的最小耗费最大的那个源。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的结点 ID 数组不包括分析结点本身。
下图是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 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 就是查找到的源。
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。/** * 根据给定的弧段 ID 或结点 ID 来查找源或汇。 * * @param datasource * 指定的网络数据集所在的数据源。 */ private void findSourceOrSinkExample(Datasource datasource) { // 获取用于分析的网络数据集 DatasetVector network = (DatasetVector) datasource.getDatasets().get( "WaterNet"); // 构造一个设施网络分析环境设置对象,并设置相关参数 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(network); facilityAnalystSetting.setDirectionField("direction"); facilityAnalystSetting.setEdgeIDField("SMEDGEID"); facilityAnalystSetting.setNodeIDField("SMNODEID"); facilityAnalystSetting.setFNodeIDField("SMFNODE"); facilityAnalystSetting.setTNodeIDField("SMTNODE"); facilityAnalystSetting.setTolerance(0.001); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SMLENGTH"); weightFieldInfo.setTFWeightField("SMLENGTH"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); // 障碍结点和障碍弧段的设置对查找源/汇是有效的 facilityAnalystSetting.setBarrierEdges(new int[] { 8, 199 }); facilityAnalystSetting.setBarrierNodes(new int[] { 372 }); // 构造一个设施网络分析对象,并设置设施网络分析环境 FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); // 加载网络模型 Boolean isLoad = facilityAnalyst.load(); if (isLoad) { // 获取参与分析的弧段或结点 ID int edgeID = 336; int nodeID = 311; // 根据给定弧段查找源 FacilityAnalystResult resultSourceFromEdge = facilityAnalyst .findSourceFromEdge(edgeID, "Length", true); if (resultSourceFromEdge != null) { System.out.println("从弧段" + edgeID + "到源的耗费为" + resultSourceFromEdge.getCost); System.out.println("从弧段" + edgeID + "到源的弧段 ID 包括:"); for (int i = 0; i < resultSourceFromEdge.getEdges.Length; i++) { System.out.println(resultSourceFromEdge.getEdges[i]); } System.out.println("从弧段" + edgeID + "到源的结点 ID 包括:"); for (int i = 0; i < resultSourceFromEdge.getNodes.Length; i++) { System.out.println(resultSourceFromEdge.getNodes[i]); } } // 根据给定结点查找源(略,参考“根据给定弧段查找源”) // 根据给定结点查找汇 FacilityAnalystResult resultSinkFromNode = facilityAnalyst .findSinkFromNode(nodeID, "Length", true); if (resultSinkFromNode != null) { System.out.println("从结点" + nodeID + "到汇的耗费为" + resultSinkFromNode.getCost); System.out.println("从结点" + nodeID + "到汇的弧段 ID 包括:"); for (int i = 0; i < resultSinkFromNode.getEdges.Length; i++) { System.out.println(resultSinkFromNode.getEdges[i]); } System.out.println("从结点" + nodeID + "到汇的结点 ID 包括:"); for (int i = 0; i < resultSinkFromNode.getNodes.Length; i++) { System.out.println(resultSinkFromNode.getNodes[i]); } } // 根据给定弧段查找汇(略,参考“根据给定结点查找汇”) } // 分析完毕,释放设施网络分析对象所占的资源 facilityAnalyst.dispose(); }
public FacilityAnalystResult findSourceFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定弧段出发,按照流向,查找流向该弧段的网络源头结点(即源点),分析的结果为查找到的源到达给定弧段的最小耗费路径所包含的弧段、结点及耗费。 如果网络中有多个源,将查找最远的也就是到达给定弧段的最小耗费最大的那个源。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的弧段 ID 数组不包括分析弧段本身。
多介绍还可参阅 findSourceFromNode
方法,该方法根据给定的结点 ID 查找源。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findSourceFromNode
方法的示例。public FacilityAnalystResult findSinkFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定结点出发,按照流向,查找流出该结点的下游汇点,分析的结果为该结点到达查找到的汇的最小耗费路径所包含的弧段、结点及耗费。 如果网络中有多个汇,将查找最远的也就是从给定结点出发最小耗费最大的那个汇。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的结点 ID 数组不包括分析结点本身。
下图是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 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 就是查找到的汇。
nodeID
- 指定的参与分析的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findSourceFromNode
方法的示例。public FacilityAnalystResult findSinkFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定弧段出发,按照流向,查找流出该弧段的下游汇点,分析的结果为该弧段到达查找到的汇的最小耗费路径所包含的弧段、结点及耗费。 如果网络中有多个汇,将查找最远的也就是从给定弧段出发最小耗费最大的那个汇。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的弧段 ID 数组不包括分析弧段本身。
更多介绍还可参阅 findSinkFromNode
方法,该方法根据给定的结点 ID 查找汇。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findSourceFromNode
方法的示例。public FacilityAnalystResult traceUpFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
对于设施网络的某个结点(或弧段)来说,网络中的资源最终流入该结点(或弧段)所经过的弧段和结点称为它的上游;从该结点(或弧段) 流出最终流入汇点所经过的弧段和网络称为它的下游。
下面以结点的上游和下游为例。下图是一个简单的设施网络的示意图,使用箭头标出了网络的流向。根据流向,可以看出,资源流经结点 2、4、3、7、8 以及弧段 10、9、3、4、8 最终流入结点 10,因此这些结点和弧段称为结点 10 的上游,其中的结点称为它的上游结点,弧段称为它的上游弧段。同样的,资源从结点 10 流出,流经结点9、11、12 以及弧段 5、7、11 最终流出网络,因此,这些结点和弧段称为结点 10 的下游,其中的结点称为它的下游结点,弧段称为它的下游弧段。
上游追踪,是从给定结点(或弧段)出发,根据流向,查找其上游的过程。类似的,下游追踪是从给定结点(或弧段)出发,根据流向,查找其下游的过程。 FacilityAnalyst 类分别提供了从结点或弧段出发,进行上游或下游追踪的方法,分析的结果为查找到的上游或下游所包含的弧段 ID 数组、结点 ID 数组,以及流经整个上游或者下游的耗费。本方法用于查找给定弧段的上游。
上游追踪的一个常用应用是辅助定位河流水污染物来源。河流不仅是地球水循环的重要路径,也是人类最主要的淡水资源, 一旦河流发生污染而没有及时发现污染源并消除 ,很可能影响人们的正常饮水和健康。由于河流受重力影响从高处向低处流动,因此当河流发生污染时,应考虑其上游可能出现了污染源 ,如工业废水排放、生活污水排放、农药化肥污染等。河流水污染物来源追踪的大致步骤一般为:
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。/** * 根据给定的弧段 ID 或结点 ID 进行上游追踪或下游追踪。 * * @param datasource * 指定的网络数据集所在的数据源。 */ private void traceUpOrDownExample(Datasource datasource) { // 获取用于分析的网络数据集 DatasetVector network = (DatasetVector) datasource.getDatasets().get( "WaterNet"); // 构造一个设施网络分析环境设置对象,并设置相关参数 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(network); facilityAnalystSetting.setDirectionField("direction"); facilityAnalystSetting.setEdgeIDField("SMEDGEID"); facilityAnalystSetting.setNodeIDField("SMNODEID"); facilityAnalystSetting.setFNodeIDField("SMFNODE"); facilityAnalystSetting.setTNodeIDField("SMTNODE"); facilityAnalystSetting.setTolerance(0.001); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SMLENGTH"); weightFieldInfo.setTFWeightField("SMLENGTH"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); // 障碍结点和障碍弧段的设置对查找源/汇是有效的 facilityAnalystSetting.setBarrierEdges(new int[] { 8, 199 }); facilityAnalystSetting.setBarrierNodes(new int[] { 372 }); // 构造一个设施网络分析对象,并设置设施网络分析环境 FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); // 加载网络模型 Boolean isLoad = facilityAnalyst.load(); if (isLoad) { // 获取参与分析的弧段或结点 ID int edgeID = 336; int nodeID = 311; // 对给定的弧段进行上游追踪 FacilityAnalystResult resultTraceUpFromEdge = facilityAnalyst .traceUpFromEdge(edgeID, "Length", true); System.out.println("从弧段" + edgeID + "进行上游追踪的耗费为" + resultTraceUpFromEdge.Cost); System.out.println("从弧段" + edgeID + "进行上游追踪,弧段 ID 包括:"); for (int i = 0; i < resultTraceUpFromEdge.Edges.Length; i++) { System.out.println(resultTraceUpFromEdge.Edges[i]); } System.out.println("从弧段" + edgeID + "进行上游追踪,结点 ID 包括:"); for (int i = 0; i < resultTraceUpFromEdge.Nodes.Length; i++) { System.out.println(resultTraceUpFromEdge.Nodes[i]); } // 对给定的结点进行上游追踪(略,参考"对给定的弧段进行上游追踪") // 对给定的结点进行下游追踪 FacilityAnalystResult resultTraceDownFromNode = facilityAnalyst .traceDownFromNode(nodeID, "Length", true); System.out.println("从结点" + nodeID + "进行下游追踪的耗费为" + resultTraceDownFromNode.Cost); System.out.println("从结点" + nodeID + "进行下游追踪,弧段 ID 包括:"); for (int i = 0; i < resultTraceDownFromNode.Edges.Length; i++) { System.out.println(resultTraceDownFromNode.Edges[i]); } System.out.println("从结点" + nodeID + "进行下游追踪,结点 ID 包括:"); for (int i = 0; i < resultTraceDownFromNode.Nodes.Length; i++) { System.out.println(resultTraceDownFromNode.Nodes[i]); } // 对给定的弧段进行下游追踪(略,参考"对给定的结点进行下游追踪") } // 分析完毕,释放设施网络分析对象所占的资源 facilityAnalyst.dispose(); }
public FacilityAnalystResult traceUpFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
上游追踪,是从给定结点(或弧段)出发,根据流向,查找其上游的过程。该方法用于查找给定弧段的下游,分析结果为其上游所包含的弧段、结点, 及流经整个下游的耗费。
有关“上下游”和“上下游追踪”的详细介绍,请参阅 traceUpFromNode
方法。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。traceUpFromNode
方法的示例。public FacilityAnalystResult traceDownFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
下游追踪,是从给定结点(或弧段)出发,根据流向,查找其下游的过程。该方法用于查找给定弧段的下游,分析结果为其下游所包含的弧段、结点, 及流经整个下游的耗费。
有关“上下游”和“上下游追踪”的详细介绍,请参阅 traceUpFromNode
方法。
下游追踪常用于影响范围的分析。例如:
FacilityAnalystSetting
中设置),下游追踪时,到达障碍即追踪停止
,这样可以缩小分析的范围。确定了可能受影响的河段后,通过空间查询和分析标记出位于结果河段附近的所有用水单位和居民区
,及时下发通知,并采取紧急措施,防止污染的危害进一步扩大。nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。traceUpFromNode
方法的示例。public FacilityAnalystResult traceDownFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
下游追踪,是从给定结点(或弧段)出发,根据流向,查找其下游的过程。该方法用于查找给定弧段的下游,分析结果为其下游所包含的弧段、结点, 及流经整个下游的耗费。
有关“上下游”和“上下游追踪”的详细介绍,请参阅 traceDownFromNode
和 traceUpFromNode
方法。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。traceUpFromNode
方法的示例。public int[] checkLoops()
设施网络中,环路是指两条或两条以上流向值为 2(即不确定流向)的弧段构成的闭合路径。这意味着环路必须同时满足以下两个条件:
buildFacilityNetworkDirections
方法。下图是设施网络的一部分,使用不同的符号显示网络弧段的流向。对该网络进行环路检查,检查出两个环路,即图中的红色闭合路径。而右上方有一条流向为 2 的弧段,由于它未与其他流向同样为 2 的弧段构成闭合路径,因此不是环路。
buildFacilityNetworkDirections
方法的示例。
public void CheckLoops(DatasetVector networkDataset) { // 设置用于设施网络分析的环境 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(networkDataset); facilityAnalystSetting.setDirectionField("Direction"); facilityAnalystSetting.setEdgeIDField("SmID"); facilityAnalystSetting.setNodeIDField("SmNodeID"); facilityAnalystSetting.setFNodeIDField("SmFNode"); facilityAnalystSetting.setTNodeIDField("SmTNode"); facilityAnalystSetting.setTolerance(0.0015); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SmLength"); weightFieldInfo.setTFWeightField("SmLength"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); facilityAnalyst.load(); // 调用方法查找网络环路 int[] edgeIDs = facilityAnalyst.checkLoops(); // 输出构成环路的弧段ID System.out.println("构成环路的弧段ID数组如下:"); for (int i = 0; i < edgeIDs.length; i++) { System.out.println(edgeIDs[i]); } }
public FacilityAnalystResult findPathFromNodes(int startNodeID, int endNodeID, String weightName, boolean isUncertainDirectionValid)
两结点间的最小耗费路径的查找过程为:从给定的起始结点出发,根据流向,查找到给定的终止结点的所有路径,然后从其中找出耗费最小的一条返回。
下图是两结点最小耗费路径的示意图。从起始结点 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 的最小耗费路径。
startNodeID
- 指定的起始结点 ID。endNodeID
- 指定的终止结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。buildFacilityNetworkDirections
方法的示例。
public void findPathBetween(DatasetVector networkDataset) { // 设置用于设施网络分析的环境 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(networkDataset); facilityAnalystSetting.setDirectionField("Direction"); facilityAnalystSetting.setEdgeIDField("SmID"); facilityAnalystSetting.setNodeIDField("SmNodeID"); facilityAnalystSetting.setFNodeIDField("SmFNode"); facilityAnalystSetting.setTNodeIDField("SmTNode"); facilityAnalystSetting.setTolerance(0.0015); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SmLength"); weightFieldInfo.setTFWeightField("SmLength"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); facilityAnalyst.load(); // 获取参与分析的弧段或结点 int startEdgeID = 3855; int endEdgeID = 7887; int startNodeID = 2996; int endNodeID = 4239; // 查找两个弧段间的最小耗费路径 FacilityAnalystResult PathLeastE = facilityAnalyst.findPathFromEdges( startEdgeID, endEdgeID, "Length", true); // 查找两个结点间的最小耗费路径 FacilityAnalystResult PathLeastN = facilityAnalyst.findPathFromNodes( startNodeID, endNodeID, "Length", true); }
public FacilityAnalystResult findPathFromEdges(int startEdgeID, int endEdgeID, String weightName, boolean isUncertainDirectionValid)
两弧段间的最小耗费路径的查找过程为:从给定的起始弧段出发,根据流向,查找到给定的终止弧段的所有路径,然后从其中找出耗费最小的一条返回。请参阅
findPathFromNodes
方法以获得更多有关“设施网络路径分析”的介绍,该方法用于查找两结点间的最小耗费路径。
注意:如果指定的待分析弧段的流向值为 2,即不确定流向,则分析结果返回 null。
startEdgeID
- 指定的起始弧段 ID。endEdgeID
- 指定的终止弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findPathFromNodes
方法的示例。public FacilityAnalystResult findPathUpFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
有关“上游”的介绍,请参阅 traceUpFromNode
方法。
上游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有上游路径,然后从其中找出耗费最小的一条返回。 该方法用于查找给定结点的上游最小耗费路径。
下图是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 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。
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findPathDownFromNode
方法的示例。public FacilityAnalystResult findPathUpFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
有关“上游”的介绍,请参阅 traceUpFromNode
方法。
上游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有上游路径,然后从其中找出耗费最小的一条返回。 该方法用于查找给定弧段的上游最小耗费路径。
请参阅 findPathUpFromNode
方法,以获得更多关于“上游最小耗费路径”的介绍。
注意:如果指定的待分析弧段的流向值为 2,即不确定流向,则分析结果返回 null。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。findPathDownFromNode
方法的示例。public FacilityAnalystResult findPathDownFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
有关“下游”的介绍,请参阅 traceUpFromNode
方法。
下游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有下游路径,然后从其中找出耗费最小的一条返回。 该方法用于查找给定结点的下游最小耗费路径。
下图是一个简单的设施网络,在网络弧段上使用箭头标示了网络的流向,在弧段旁标注了权值。对于分析结点 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。
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。public void findPathDownandUp(DatasetVector networkDataset) { // 设置用于设施网络分析的环境 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(networkDataset); facilityAnalystSetting.setDirectionField("Direction"); facilityAnalystSetting.setEdgeIDField("SmID"); facilityAnalystSetting.setNodeIDField("SmNodeID"); facilityAnalystSetting.setFNodeIDField("SmFNode"); facilityAnalystSetting.setTNodeIDField("SmTNode"); facilityAnalystSetting.setTolerance(0.0015); WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SmLength"); weightFieldInfo.setTFWeightField("SmLength"); WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); facilityAnalyst.load(); // 获取参与分析的结点 int nodeID = 2996; // 查找给定结点的上游和下游弧段数最小耗费路径 FacilityAnalystResult PathUpLeast = facilityAnalyst.findPathUpFromNode( nodeID, "Length", true); FacilityAnalystResult PathDownLeast = facilityAnalyst.findPathDownFromNode( nodeID, "Length", true); }
public FacilityAnalystResult findPathDownFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
有关“下游”的介绍,请参阅 traceUpFromNode
方法。
下游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有下游路径,然后从其中找出耗费最小的一条返回。 该方法用于查找给定弧段的下游最小耗费路径。
请参阅 findPathDownFromNode
方法,以获得更多关于“下游最小耗费路径”的介绍。
注意:如果指定的待分析弧段的流向值为 2,即不确定流向,则分析结果返回 null。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(
setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。public void dispose()
public FacilityAnalystResult findCriticalFacilitiesUpFromNode(int[] sourceNodeIDs, int nodeID, boolean isUncertainDirectionValid)
此方法根据给定的结点 ID 和设施结点的 ID 数组,查找该结点的上游中的关键设施结点。有关上游关键设施查找的详细介绍,请参阅另一重载方法 findCriticalFacilitiesUpFromEdge
,该方法用来查找给定弧段的上游中的关键设施结点。
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。nodeID
- 指定的分析结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。findCriticalFacilitiesUpFromEdge
方法的示例。public FacilityAnalystResult findCriticalFacilitiesUpFromEdge(int[] sourceNodeIDs, int edgeID, boolean isUncertainDirectionValid)
在进行上游关键设施查找分析时,我们将设施网络的结点划分为普通结点和设施结点两类,其中设施结点认为是能够影响网络连通性的结点,例如供水管网中的阀门;普通结点是不影响网络连通性的结点,如供水管网中的消防栓或三通等。上游关键设施查找分析需要指定设施结点和分析结点,其中分析结点可以是设施结点也可以是普通结点。
上游关键设施查找分析将从给定的设施结点中筛选出关键结点,这些关键结点是分析弧段与其上游保持连通性的最基本的结点,也就是说,关闭这些关键结点后,分析结点与上游无法连通。同时,该分析的结果还包含查找出的关键结点的下游弧段的并集。关键设施结点和它们的下游分别通过设施网络分析结果(FacilityAnalystResult)类的 getNodes
和 getEdges
方法返回。
关键设施结点的查找方式可以归纳为:从分析弧段出发,向它的上游回溯,每个方向上遇到的第一个设施结点,就是要查找的关键设施结点。如下图所示,从分析弧段(红色)出发,查找到的关键设施结点包括:2、8、9 和 7。而结点 4 和 11 不是回溯方向上遇到的第一个设施结点,因此不是关键设施结点。作为示意,这里仅给出了分析弧段的上游部分,但注意分析结果还会给出关键设施结点 2、8、9 和 7 的下游弧段。
此方法根据给定的弧段 ID 和设施结点的 ID 数组,查找该弧段的上游中的关键设施结点。还可以通过 findCriticalFacilitiesUpFromNode
方法来查找给定结点的上游的关键设施结点。
应用实例
供水管网发生爆管后,可以将所有的阀门作为设施结点,将发生爆裂的管段或管点作为分析弧段或分析结点,进行上游关键设施查找分析,迅速找到上游中需要关闭的最少数量的阀门。关闭这些阀门后,爆裂管段或管点与它的上游不再连通,从而阻止水的流出,防止灾情加重和资源浪费。同时,分析得出需要关闭的阀门的下游弧段的并集,也就是关闭阀门后的影响范围,从而确定停水区域,及时做好通知工作和应急措施。
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。edgeID
- 指定的分析弧段 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。假设在数据源“datasource”中存在一个名为“FacilityNet”的网络数据集,查找弧段 ID 为 16 的弧段的上游中的关键设施结点有哪些。
/** * 根据给定的弧段 ID 和设施结点 ID 数组进行上游关键设施查找分析。 * @param datasource 指定的网络数据集所在的数据源。 */ private void findCriticalFacilitiesUpExample(Datasource datasource) { //获取用于分析的网络数据集 DatasetVector network = (DatasetVector)datasource.getDatasets().get("FacilityNet"); //构造一个设施网络分析环境设置对象,并设置相关参数 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.setNetworkDataset(network); facilityAnalystSetting.setDirectionField("direction"); facilityAnalystSetting.setEdgeIDField("SMEDGEID"); facilityAnalystSetting.setNodeIDField("SMNODEID"); facilityAnalystSetting.setFNodeIDField("SMFNODE"); facilityAnalystSetting.setTNodeIDField("SMTNODE"); facilityAnalystSetting.setTolerance(0.001); //由于上游关键设施查找不需要权值信息,因此不需要设置WeightFieldInfos //是否设置WeightFieldInfos需要根据具体的分析功能确定 //构造一个设施网络分析对象,并设置设施网络分析环境 FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); //加载网络模型 boolean isLoad = facilityAnalyst.load(); if (isLoad) { // 指定待分析弧段 int edgeID = 16; // 指定网络中的设施结点 int[] facilitiyNodeIDs = new int[] { 1, 9, 10, 13, 17, 20, 21, 29, 30, 35, 35, 37 }; //对给定弧段进行上游关键设施查找分析 FacilityAnalystResult result = facilityAnalyst.findCriticalFacilitiesUpFromEdge(facilitiyNodeIDs, edgeID, true); if (result != null) { //从设施网络分析结果中获取查找到的关键设施结点数组 int[] criticalFacilities = result.getNodes(); //从设施网络分析结果中获取关键设施结点的下游弧段数组 int[] catchmentEdges = result.getEdges(); } //对给定结点进行上游关键设施查找分析(略,参考“对给定弧段进行上游关键设施查找分析”) } // 分析完毕,释放设施网络分析对象所占的资源 facilityAnalyst.dispose(); }
public FacilityAnalystResult findCriticalFacilitiesDownFromNode(int[] sourceNodeIDs, int nodeID, boolean isUncertainDirectionValid)
此方法根据给定的结点 ID 和设施结点的 ID 数组,查找该结点的下游中的关键设施结点。有关下游关键设施查找的详细介绍,请参阅另一重载方法FacilityAnalyst.findCriticalFacilitiesDownFromEdge(int[], int, boolean)
,该方法用来查找给定弧段的下游中的关键设施结点。
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。nodeID
- 指定的分析结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。public FacilityAnalystResult findCriticalFacilitiesDownFromEdge(int[] sourceNodeIDs, int edgeID, boolean isUncertainDirectionValid)
在进行下游关键设施查找分析时,我们将设施网络的结点划分为普通结点和设施结点两类,其中设施结点认为是能够影响网络连通性的结点,例如供水管网中的阀门;普通结点是不影响网络连通性的结点,如供水管网中的消防栓或三通等。
下游关键设施查找分析将从给定的设施结点中筛选出关键结点,这些关键结点是分析弧段与其下游保持连通性的最基本的结点,也就是说,关闭这些关键结点后,分析结点与下游无法连通。同时,该分析的结果还包含给定弧段影响的下游弧段并集。关键设施结点和下游弧段分别通过设施网络分析结果类的 getNodes()
和 getEdges()
方法返回。
关键设施结点的查找方式可以归纳为:从分析弧段出发,向它的下游查找,每个方向上遇到的第一个设施结点,就是要查找的关键设施结点。
此方法根据给定的弧段 ID 和设施结点的 ID 数组,查找该弧段的下游中的关键设施结点。还可以通过 FacilityAnalyst.findCriticalFacilitiesDownFromNode(int[], int, boolean)
方法来查找给定结点的下游关键设施结点。
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。edgeID
- 指定的分析弧段 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。public BurstAnalyseResult burstAnalyseFromNode(int[] sourceNodeIDs, int nodeID, boolean isUncertainDirectionValid)
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。nodeID
- 指定的分析结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。public BurstAnalyseResult burstAnalyseFromEdge(int[] sourceNodeIDs, int edgeID, boolean isUncertainDirectionValid)
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。edgeID
- 指定的弧段结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅
buildFacilityNetworkDirections
方法的介绍。Copyright © 2021–2024 SuperMap. All rights reserved.