public class FacilityAnalyst
extends java.lang.Object
设施网络分析类。它是网络分析功能类之一,主要用于进行各类连通性分析和追踪分析。
设施网络分析属于网络分析功能的一种,所以在进行设施网络分析之前,您需要具备的前提知识是:
设施网络是具有方向的网络。即介质(水流、电流等)会根据网络本身的规则在网络中流动。
设施网络分析的前提是已经建立了用于设施网络分析的数据集,建立用于设施网络分析的数据集的基础是建立网络数据集,详细信息请参见SuperMap iDesktop帮助文档的设施网络分析相关介绍。
在利用设施网络分析类进行分析时,以及上面提到的建立用于设施网络分析的数据集,都要进行设施网络分析环境参数的设置,即使用到 FacilityAnalystSetting 类所做的设置。详细信息请参见 FacilityAnalystSetting 类。
当具备了以上知识,您就可以使用 FacilityAnalyst 类提供的各种方法来实现各种设施网络分析功能。目前,FacilityAnalyst 类提供的设施网络分析功能包括:
还可以阅读《设施网络分析》技术文档以便了解更多有关设施网络分析的介绍。
| 构造器和说明 |
|---|
FacilityAnalyst()
构造一个新的 FacilityAnalyst 对象。
|
| 限定符和类型 | 方法和说明 |
|---|---|
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 数组。
|
int[] |
findLoopsFromEdges(int[] edgeIDs)
根据给定的弧段 ID 数组查找与这些弧段相连接的环路,返回构成环路的弧段 ID 数组。
|
int[] |
findLoopsFromNodes(int[] nodeIDs)
根据给定的结点 ID 数组查找与这些结点相连接的环路,返回构成环路的弧段 ID 数组。
|
FacilityAnalystResult |
findPathDownFromEdge(int edgeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
设施网络下游路径分析,根据给定的参与分析的弧段 ID,查询该弧段下游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathDownFromNode(int nodeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
设施网络下游路径分析,根据给定的参与分析的结点 ID,查询该结点下游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathFromEdges(int startEdgeID,
int endEdgeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
设施网络路径分析,即根据给定的起始和终止弧段 ID,查找其间耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathFromNodes(int startNodeID,
int endNodeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
设施网络路径分析,即根据给定的起始和终止结点 ID,查找其间耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathUpFromEdge(int edgeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
设施网络上游路径分析,根据给定的弧段 ID,查询该弧段上游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findPathUpFromNode(int nodeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
设施网络上游路径分析,根据给定的结点 ID,查询该结点上游耗费最小的路径,返回该路径包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSinkFromEdge(int edgeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 查找汇,即从给定弧段出发,根据流向查找流出该弧段的下游汇点,并返回给定弧段到达该汇的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSinkFromNode(int nodeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 查找汇,即从给定结点出发,根据流向查找流出该结点的下游汇点,并返回给定结点到达该汇的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSourceFromEdge(int edgeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 查找源,即从给定弧段出发,根据流向查找流向该弧段的网络源头,并返回该源到达给定弧段的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult |
findSourceFromNode(int nodeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 查找源,即从给定结点出发,根据流向查找流向该结点的网络源头,并返回该源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。
|
int[] |
findUnconnectedEdgesFromEdges(int[] edgeIDs)
根据给定的弧段 ID 数组,查找与这些弧段不相连通的弧段,返回弧段 ID 数组。
|
int[] |
findUnconnectedEdgesFromNodes(int[] nodeIDs)
根据给定的结点 ID 数组,查找与这些结点不相连通的弧段,返回弧段 ID 数组。
|
FacilityAnalystSetting |
getAnalystSetting()
返回设施网络分析的环境。
|
boolean |
load()
根据设施网络分析环境设置加载设施网络模型。
|
void |
setAnalystSetting(FacilityAnalystSetting facilityAnalystSetting)
设置设施网络分析的环境。
|
FacilityAnalystResult |
traceDownFromEdge(int edgeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 进行下游追踪,即查找给定弧段的下游,返回下游包含的弧段、结点及总耗费。
|
FacilityAnalystResult |
traceDownFromNode(int nodeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 进行下游追踪,即查找给定结点的下游,返回下游包含的弧段、结点及总耗费。
|
FacilityAnalystResult |
traceUpFromEdge(int edgeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 进行上游追踪,即查找给定弧段的上游,返回上游包含的弧段、结点及总耗费。
|
FacilityAnalystResult |
traceUpFromNode(int nodeID,
java.lang.String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 进行上游追踪,即查找给定结点的上游,返回上游包含的弧段、结点及总耗费。
|
public FacilityAnalystSetting getAnalystSetting()
设施网络分析环境参数的设置,直接影响到设施网络分析的结果。设施网络分析所需要的参数包括:用于进行设施网络分析的数据集(即建立了流向的网络数据集或者同时建立了流向和等级的网络数据集,也就是说该方法对应的 FacilityAnalystSetting 类对象的 setNetworkDataset() 方法所指定的网络数据集必须有流向或者流向和等级信息)、结点 ID 字段、弧段 ID 字段、弧段起始结点 ID 字段、弧段终止结点 ID 字段、权值信息、点到弧段的距离容限、障碍结点、障碍弧段、流向等。有关设施网络分析环境参数的设置,请参见 FacilityAnalystSetting 类。
FacilityAnalystSettingFacilityAnalystSetting 对象。public void setAnalystSetting(FacilityAnalystSetting facilityAnalystSetting)
设施网络分析环境参数的设置,直接影响到设施网络分析的结果。设施网络分析所需要的参数包括:用于进行设施网络分析的数据集(即建立了流向的网络数据集或者同时建立了流向和等级的网络数据集,也就是说该方法对应的 FacilityAnalystSetting 类对象的 setNetworkDataset() 方法所指定的网络数据集必须有流向或者流向和等级信息)、结点 ID 字段、弧段 ID 字段、弧段起始结点 ID 字段、弧段终止结点 ID 字段、权值信息、点到弧段的距离容限、障碍结点、障碍弧段、流向等。有关设施网络分析环境参数的设置,请参见 FacilityAnalystSetting 类。
facilityAnalystSetting - 设施网络分析环境参数。FacilityAnalystSettingpublic boolean load()
该方法根据设施网络分析环境设置(FacilityAnalystSetting)对象中的环境参数,加载网络模型。在设置好设施网络分析环境的参数后,只有调用该方法,所做的设施网络分析环境设置才会在设施网络分析的过程中生效。
注意:
public int[] findLoopsFromNodes(int[] nodeIDs)
设施网络中,两条或两条以上流向值为 2(即不确定流向)的弧段构成的闭合路径,称为环路。详细内容请参阅 checkLoops 方法的介绍。
nodeIDs - 指定的结点 ID 数组。findLoopsFromEdges 方法的示例。public int[] findLoopsFromEdges(int[] edgeIDs)
设施网络中,两条或两条以上流向值为 2(即不确定流向)的弧段构成的闭合路径,称为环路。详细内容请参阅 checkLoops 方法的介绍。
edgeIDs - 指定的弧段 ID 数组。
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 数组。findConnectedEdgesFromEdges() 方法的示例。public int[] findConnectedEdgesFromEdges(int[] edgeIDs)
edgeIDs - 给定的弧段 ID 数组。
public void TestFindConnectedandUnconnectedEdges(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[] connectEdges = facilityAnalyst.findConnectedEdgesFromEdges(edgeIDs);
int[] unconnectEdges = facilityAnalyst.findUnconnectedEdgesFromEdges(edgeIDs);
//查找与给定的结点相连通和不相连通的弧段
int[] connectNodes = facilityAnalyst.findConnectedEdgesFromNodes(nodeIDs);
int[] unconnectNodes = facilityAnalyst.findUnconnectedEdgesFromNodes(nodeIDs);
}public int[] findUnconnectedEdgesFromNodes(int[] nodeIDs)
nodeIDs - 给定的结点 ID 数组。findConnectedEdgesFromEdges()方法的示例。public int[] findUnconnectedEdgesFromEdges(int[] edgeIDs)
edgeIDs - 给定的弧段 ID 数组。findConnectedEdgesFromEdges()方法的示例。public int[] findCommonAncestorsFromNodes(int[] nodeIDs,
boolean isUncertainDirectionValid)
有关“上游”的介绍,请参阅 traceUpFromNode 方法。
共同上游是指多个结点(或弧段)的公共上游网络。该方法用于查找多个结点的共同上游弧段,即取这些结点的各自上游弧段的交集部分,结果返回这些弧段的弧段 ID。
如下图所示,流向如图中的箭头所示的方向,前两幅图分别是对结点 1 和结点 2 进行上游追踪的结果,查找出各自的上游弧段(绿色),第三幅图则是对结点 1 和结点 2 查找共同上游弧段(橙色),容易看出,结点 1 和结点 2 的共同上游弧段,就是它们各自的上游弧段的交集。

nodeIDs - 给定的结点 ID 数组。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。
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.findCommonCatchementsFromNodes(nodeIDs, false);
}public int[] findCommonAncestorsFromEdges(int[] edgeIDs,
boolean isUncertainDirectionValid)
有关“上游”的介绍,请参阅 traceUpFromNode 方法。
共同上游是指多个结点(或弧段)的公共上游网络。该方法用于查找多条弧段的共同上游弧段,即取这些弧段的各自上游弧段的交集部分,结果返回这些弧段的弧段 ID。
请参阅 findCommonAncestorsFromNodes 方法获得更多关于“查找共同上游弧段”的介绍。
edgeIDs - 指定的弧段 ID 数组。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findCommonAncestorsFromNodes 方法的示例。public int[] findCommonCatchmentsFromNodes(int[] nodeIDs,
boolean isUncertainDirectionValid)
有关“下游”的介绍,请参阅 traceUpFromNode 方法。
共同下游是指多个结点(或弧段)的公共下游网络。该方法用于查找多个结点的共同下游弧段,即取这些结点的各自下游弧段的交集部分,结果返回这些弧段的弧段 ID。
如下图所示,流向如图中的箭头所示的方向,前两幅图分别是对结点 1 和结点 2 进行下游追踪的结果,查找出各自的下游弧段(绿色),第三幅图则是对结点 1 和结点 2 查找共同下游弧段(橙色),容易看出,结点 1 和结点 2 的共同下游弧段,就是它们各自的下游弧段的交集。

nodeIDs - 指定的结点 ID 数组。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findCommonAncestorsFromNodes 方法的示例。public int[] findCommonCatchmentsFromEdges(int[] edgeIDs,
boolean isUncertainDirectionValid)
有关“下游”的介绍,请参阅 traceUpFromNode 方法。
共同下游是指多个结点(或弧段)的公共下游网络。该方法用于查找多条弧段的共同下游弧段,即取这些弧段的各自下游弧段的交集部分,结果返回这些弧段的弧段 ID。
请参阅 findCommonCatchmentsFromNodes 方法获得更多关于“查找共同下游弧段”的介绍。
edgeIDs - 指定的弧段 ID 数组。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findCommonAncestorsFromNodes 方法的示例。public FacilityAnalystResult findSourceFromNode(int nodeID, java.lang.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 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。
/**
* 根据给定的弧段 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.Cost);
System.out.println("从弧段" + edgeID + "到源的弧段 ID 包括:");
for (int i = 0; i < resultSourceFromEdge.Edges.Length; i++) {
System.out.println(resultSourceFromEdge.Edges[i]);
}
System.out.println("从弧段" + edgeID + "到源的结点 ID 包括:");
for (int i = 0; i < resultSourceFromEdge.Nodes.Length; i++) {
System.out.println(resultSourceFromEdge.Nodes[i]);
}
}
//根据给定结点查找源(略,参考“根据给定弧段查找源”)
//根据给定结点查找汇
FacilityAnalystResult resultSinkFromNode = facilityAnalyst.findSinkFromNode(nodeID, "Length", true);
if (resultSinkFromNode != null) {
System.out.println("从结点" + nodeID + "到汇的耗费为" + resultSinkFromNode.Cost);
System.out.println("从结点" + nodeID + "到汇的弧段 ID 包括:");
for (int i = 0; i < resultSinkFromNode.Edges.Length; i++) {
System.out.println(resultSinkFromNode.Edges[i]);
}
System.out.println("从结点" + nodeID + "到汇的结点 ID 包括:");
for (int i = 0; i < resultSinkFromNode.Nodes.Length; i++) {
System.out.println(resultSinkFromNode.Nodes[i]);
}
}
//根据给定弧段查找汇(略,参考“根据给定结点查找汇”)
}
//分析完毕,释放设施网络分析对象所占的资源
facilityAnalyst.dispose();
}
public FacilityAnalystResult findSourceFromEdge(int edgeID, java.lang.String weightName, boolean isUncertainDirectionValid)
该方法从给定弧段出发,按照流向,查找流向该弧段的网络源头结点(即源点),分析的结果为查找到的源到达给定弧段的最小耗费路径所包含的弧段、结点及耗费。如果网络中有多个源,将查找最远的也就是到达给定弧段的最小耗费最大的那个源。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的弧段 ID 数组不包括分析弧段本身。
更多介绍还可参阅 findSourceFromNode 方法,该方法根据给定的结点 ID 查找源。
edgeID - 指定的弧段 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findSourceFromNode 方法的示例。public FacilityAnalystResult findSinkFromNode(int nodeID, java.lang.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 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findSourceFromNode 方法的示例。public FacilityAnalystResult findSinkFromEdge(int edgeID, java.lang.String weightName, boolean isUncertainDirectionValid)
该方法从给定弧段出发,按照流向,查找流出该弧段的下游汇点,分析的结果为该弧段到达查找到的汇的最小耗费路径所包含的弧段、结点及耗费。如果网络中有多个汇,将查找最远的也就是从给定弧段出发最小耗费最大的那个汇。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的弧段 ID 数组不包括分析弧段本身。
更多介绍还可参阅 findSinkFromNode 方法,该方法根据给定的结点 ID 查找汇。
edgeID - 指定的弧段 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findSourceFromNode 方法的示例。public FacilityAnalystResult traceUpFromNode(int nodeID, java.lang.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 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。
/**
* 根据给定的弧段 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, java.lang.String weightName, boolean isUncertainDirectionValid)
上游追踪,是从给定结点(或弧段)出发,根据流向,查找其上游的过程。该方法用于查找给定弧段的下游,分析结果为其上游所包含的弧段、结点,及流经整个下游的耗费。
有关“上下游”和“上下游追踪”的详细介绍,请参阅 traceUpFromNode 方法。
edgeID - 指定的弧段 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。traceUpFromNode 方法的示例。public FacilityAnalystResult traceDownFromNode(int nodeID, java.lang.String weightName, boolean isUncertainDirectionValid)
下游追踪,是从给定结点(或弧段)出发,根据流向,查找其下游的过程。该方法用于查找给定弧段的下游,分析结果为其下游所包含的弧段、结点,及流经整个下游的耗费。
有关“上下游”和“上下游追踪”的详细介绍,请参阅 traceUpFromNode 方法。
下游追踪常用于影响范围的分析。例如:
FacilityAnalystSetting 中设置),下游追踪时,到达障碍即追踪停止,这样可以缩小分析的范围。确定了可能受影响的河段后,通过空间查询和分析标记出位于结果河段附近的所有用水单位和居民区,及时下发通知,并采取紧急措施,防止污染的危害进一步扩大。nodeID - 指定的结点 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。traceUpFromNode 方法的示例。public FacilityAnalystResult traceDownFromEdge(int edgeID, java.lang.String weightName, boolean isUncertainDirectionValid)
下游追踪,是从给定结点(或弧段)出发,根据流向,查找其下游的过程。该方法用于查找给定弧段的下游,分析结果为其下游所包含的弧段、结点,及流经整个下游的耗费。
有关“上下游”和“上下游追踪”的详细介绍,请参阅 traceDownFromNode 和 traceUpFromNode 方法。
edgeID - 指定的弧段 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。traceUpFromNode 方法的示例。public int[] checkLoops()
设施网络中,环路是指两条或两条以上流向值为 2(即不确定流向)的弧段构成的闭合路径。这意味着环路必须同时满足以下两个条件:
下图是设施网络的一部分,使用不同的符号显示网络弧段的流向。对该网络进行环路检查,检查出两个环路,即图中的红色闭合路径。而右上方有一条流向为 2 的弧段,由于它未与其他流向同样为 2 的弧段构成闭合路径,因此不是环路。

public void TestCheckLoops(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, java.lang.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 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。
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;
int32 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, java.lang.String weightName, boolean isUncertainDirectionValid)
两弧段间的最小耗费路径的查找过程为:从给定的起始弧段出发,根据流向,查找到给定的终止弧段的所有路径,然后从其中找出耗费最小的一条返回。请参阅 findPathFromNodes 方法以获得更多有关“设施网络路径分析”的介绍,该方法用于查找两结点间的最小耗费路径。
注意:如果指定的待分析弧段的流向值为 2,即不确定流向,则分析结果返回 null。
startEdgeID - 指定的起始弧段 ID。endEdgeID - 指定的终止弧段 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findPathFromNodes 方法的示例。public FacilityAnalystResult findPathUpFromNode(int nodeID, java.lang.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 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findPathDownFromNode 方法的示例。public FacilityAnalystResult findPathUpFromEdge(int edgeID, java.lang.String weightName, boolean isUncertainDirectionValid)
有关“上游”的介绍,请参阅 traceUpFromNode 方法。
上游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有上游路径,然后从其中找出耗费最小的一条返回。该方法用于查找给定弧段的上游最小耗费路径。
请参阅 findPathUpFromNode 方法,以获得更多关于“上游最小耗费路径”的介绍。
注意:如果指定的待分析弧段的流向值为 2,即不确定流向,则分析结果返回 null。
edgeID - 指定的弧段 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。findPathDownFromNode 方法的示例。public FacilityAnalystResult findPathDownFromNode(int nodeID, java.lang.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 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。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, java.lang.String weightName, boolean isUncertainDirectionValid)
有关“下游”的介绍,请参阅 traceUpFromNode 方法。
下游最小耗费路径的查找过程可以理解为:从给定结点(或弧段)出发,根据流向,查找出该结点(或弧段)的所有下游路径,然后从其中找出耗费最小的一条返回。该方法用于查找给定弧段的下游最小耗费路径。
请参阅 findPathDownFromNode 方法,以获得更多关于“下游最小耗费路径”的介绍。
注意:如果指定的待分析弧段的流向值为 2,即不确定流向,则分析结果返回 null。
edgeID - 指定的弧段 ID。weightName - 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos)中某一个权值信息对象(WeightFieldInfo) 的名称(getName)。isUncertainDirectionValid - 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。有关流向请参阅SuperMap iDesktop帮助文档的设施网络分析相关介绍。public void dispose()