public class FacilityAnalyst3D
extends com.supermap.data.InternalHandleDisposable
设施网络,是对现实世界中的常见网络和基础设施的模拟,如供水网、输电线、通信线路、天然气管道、河流等,其共同的特点是资源的流动具有方向。三维设施网络分析是基于创建了流向的三维网络数据集的分析,是三维网络分析的重要内容,目前提供的主要功能有:查找结点或弧段到源或汇之间的弧段、上下游追踪、上游最近设施查找等。相对于传统的二维设施网络分析,三维设施网络分析由于其真实的三维展现,从而能够更好地为设施网络的设计、施工、突发事故处理等提供指导和决策支持。
三维设施网络分析的一般步骤:
NetworkBuilder3D
类;buildFacilityNetworkDirections
方法)。由于设施网络是具有方向的网络,因此,进行三维设施网络分析的前提是用于分析的三维网络数据集已经创建了流向;NetworkBuilder3D.check(NetworkCheckParameter3D, SteppedListener...)
check} 方法); setAnalystSetting
方法);load
方法);findSourceFromEdge
、traceUpFromEdge
、findCriticalFacilitiesUpFromEdge
等方法的示例。构造器和说明 |
---|
FacilityAnalyst3D()
构造一个新的 FacilityAnalyst3D 对象。
|
限定符和类型 | 方法和说明 |
---|---|
BurstAnalyse3DResult |
burstAnalyseFromEdge(int[] sourceNodeIDs,
int edgeID,
boolean isUncertainDirectionValid)
双向爆管分析,通过指定爆管弧段,查找爆管弧段上下游中对爆管位置产生直接影响的结点以及受爆管位置直接影响的结点。
|
BurstAnalyse3DResult |
burstAnalyseFromNode(int[] sourceNodeIDs,
int nodeID,
boolean isUncertainDirectionValid)
双向爆管分析,通过指定爆管结点,查找爆管结点上下游中对爆管位置产生直接影响的结点以及受爆管位置直接影响的结点。
|
FacilityAnalystCheckResult3D |
check()
已过时。
|
void |
dispose()
释放该对象所占用的资源。
|
FacilityAnalystResult3D |
findCriticalFacilitiesDownFromEdge(int[] sourceNodeIDs,
int edgeID,
boolean isUncertainDirectionValid)
下游关键设施查找,即查找给定弧段的关键下游设施结点,返回关键设施结点 ID 数组及给定弧段影响到的下游弧段 ID 数组。
|
FacilityAnalystResult3D |
findCriticalFacilitiesDownFromNode(int[] sourceNodeIDs,
int nodeID,
boolean isUncertainDirectionValid)
下游关键设施查找,即查找给定结点的下游关键设施结点,返回关键结点 ID 数组及给定结点影响到的下游弧段 ID 数组。
|
FacilityAnalystResult3D |
findCriticalFacilitiesUpFromEdge(int[] sourceNodeIDs,
int edgeID,
boolean isUncertainDirectionValid)
上游关键设施查找,即查找给定弧段的上游中的关键设施结点,返回关键结点 ID 数组及其下游弧段 ID 数组。
|
FacilityAnalystResult3D |
findCriticalFacilitiesUpFromNode(int[] sourceNodeIDs,
int nodeID,
boolean isUncertainDirectionValid)
上游关键设施查找,即查找给定结点的上游中的关键设施结点,返回关键结点 ID 数组及其影响到的下游弧段 ID 数组。
|
FacilityAnalystResult3D |
findSinkFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 查找汇,即从给定弧段出发,根据流向查找流出该弧段的下游汇点,并返回给定弧段到达该汇的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult3D |
findSinkFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 查找汇,即从给定结点出发,根据流向查找流出该结点的下游汇点,并返回给定结点到达该汇的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult3D |
findSourceFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 查找源,即从给定弧段出发,根据流向查找流向该弧段的网络源头,并返回该源到达给定弧段的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystResult3D |
findSourceFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 查找源,即从给定结点出发,根据流向查找流向该结点的网络源头,并返回该源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。
|
FacilityAnalystSetting3D |
getAnalystSetting()
返回三维设施网络分析环境。
|
boolean |
load()
根据三维设施网络分析环境设置对象中的环境参数,加载网络模型。
|
void |
setAnalystSetting(FacilityAnalystSetting3D value)
设置三维设施网络分析环境。
|
FacilityAnalystResult3D |
traceDownFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 进行下游追踪,即查找给定弧段的下游,返回下游包含的弧段、结点及总耗费。
|
FacilityAnalystResult3D |
traceDownFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 进行下游追踪,即查找给定结点的下游,返回下游包含的弧段、结点及总耗费。
|
FacilityAnalystResult3D |
traceUpFromEdge(int edgeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的弧段 ID 进行上游追踪,即查找给定弧段的上游,返回上游包含的弧段、结点及总耗费。
|
FacilityAnalystResult3D |
traceUpFromNode(int nodeID,
String weightName,
boolean isUncertainDirectionValid)
根据给定的结点 ID 进行上游追踪,即查找给定结点的上游,返回上游包含的弧段、结点及总耗费。
|
public FacilityAnalystSetting3D getAnalystSetting()
FacilityAnalystSetting3D
对象。public void setAnalystSetting(FacilityAnalystSetting3D value)
三维设施网络分析环境用于设置三维设施网络分析所需的相关参数,包括三维网络数据集、弧段和结点的 ID 字段、权值信息、障碍信息等。详见 FacilityAnalystSetting3D
类。三维设施网络分析环境参数的设置,直接影响到设施网络分析的结果。
value
- 三维设施网络分析环境参数。
请参见 findSourceFromEdge
、traceUpFromEdge
、findCriticalFacilitiesUpFromEdge
等方法的示例。public boolean load()
该方法根据三维设施网络分析环境设置(FacilityAnalystSetting3D
)对象中的环境参数,加载网络模型。只有调用该方法,所做的设施网络分析环境设置才会在设施网络分析的过程中生效。该方法需要在设置 setAnalystSetting
方法后调用。
注意:
dispose
方法释放 FacilityAnalyst3D
对象所占用的资源,否则可能出错。dispose
方法释放资源,否则加载可能失败。findSourceFromEdge
、traceUpFromEdge
、findCriticalFacilitiesUpFromEdge
等方法的示例。@Deprecated public FacilityAnalystCheckResult3D check()
该方法用于对三维设施网络数据集进行检查,给出错误信息,便于用户针对错误信息对数据进行修改,以避免由于数据错误导致设施网络分析错误。
注意,该方法需要在设置三维设施网络分析环境(setAnalystSetting
方法)之后调用,但不需要加载网络模型(load
方法)。
该方法返回一个三维设施网络分析数据检查结果(FacilityAnalystCheckResult3D)对象,通过该对象的 getArcErrorInfos
方法和 getNodeErrorInfos
方法可以获取弧段错误信息和结点错误信息。错误信息存储在字典中,键代表错误弧段或结点的 SMID,值代表错误类型。错误类型以数字表示,代表的具体错误含义如下表所示。
public FacilityAnalystResult3D findSourceFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定结点出发,按照流向,查找流向该结点的网络源头结点(即源点),分析的结果为查找到的源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。如果网络中有多个源,将查找最远的也就是到达给定结点的最小耗费最大的那个源。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的结点 ID 数组不包括分析结点本身。
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。findSourceFromEdge
方法的示例。public FacilityAnalystResult3D findSourceFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定弧段出发,按照流向,查找流向该弧段的网络源头结点(即源点),分析的结果为查找到的源到达给定弧段的最小耗费路径所包含的弧段、结点及耗费。如果网络中有多个源,将查找最远的也就是到达给定弧段的最小耗费最大的那个源。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的弧段 ID 数组不包括分析弧段本身。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。/** * 根据给定的弧段 ID 或结点 ID 来查找源或汇。 * @param datasource 指定的三维网络数据集所在的数据源。 */ private void findSourceOrSinkExample(Datasource datasource) { // 获取用于分析的三维网络数据集 DatasetVector network3D = (DatasetVector) datasource.getDatasets().get("FacilityNet"); // 构造一个三维设施网络分析环境设置对象,并设置相关参数 FacilityAnalystSetting3D facilityAnalystSetting = new FacilityAnalystSetting3D(); facilityAnalystSetting.setNetworkDataset(network3D); facilityAnalystSetting.setDirectionField("direction"); facilityAnalystSetting.setEdgeIDField("SMEDGEID"); facilityAnalystSetting.setNodeIDField("SMNODEID"); facilityAnalystSetting.setFNodeIDField("SMFNODE"); facilityAnalystSetting.setTNodeIDField("SMTNODE"); facilityAnalystSetting.setTolerance(0.001); WeightFieldInfo3D weightFieldInfo = new WeightFieldInfo3D(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SMLENGTH"); weightFieldInfo.setTFWeightField("SMLENGTH"); WeightFieldInfos3D weightFieldInfos = new WeightFieldInfos3D(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); facilityAnalystSetting.setBarrierEdges(new int[] { 8 }); facilityAnalystSetting.setBarrierNodes(new int[] { 79 }); // 构造一个三维设施网络分析对象,并设置三维设施网络分析环境 FacilityAnalyst3D facilityAnalyst = new FacilityAnalyst3D(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); // 加载三维网络模型 boolean isLoad = facilityAnalyst.load(); if (isLoad) { // 获取参与分析的弧段或结点 ID int edgeID = 102; int nodeID = 45; //根据给定弧段查找源 FacilityAnalystResult3D resultSourceFromEdge = facilityAnalyst.findSourceFromEdge(edgeID, "length", true); 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]); } //根据给定结点查找源(略,参考“根据给定弧段查找源”) //根据给定结点查找汇 FacilityAnalystResult3D resultSinkFromNode = facilityAnalyst.findSinkFromNode(nodeID, "Length", true); 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 FacilityAnalystResult3D findSinkFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定结点出发,按照流向,查找流出该结点的下游汇点,分析的结果为该结点到达查找到的汇的最小耗费路径所包含的弧段、结点及耗费。如果网络中有多个汇,将查找最远的也就是从给定结点出发最小耗费最大的那个汇。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的结点 ID 数组不包括分析结点本身。
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。findSourceFromEdge
方法的示例。public FacilityAnalystResult3D findSinkFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
该方法从给定弧段出发,按照流向,查找流出该弧段的下游汇点,分析的结果为该弧段到达查找到的汇的最小耗费路径所包含的弧段、结点及耗费。如果网络中有多个汇,将查找最远的也就是从给定弧段出发最小耗费最大的那个汇。为了便于理解,可将该功能的实现过程分为三步:
注意:分析结果中的弧段 ID 数组不包括分析弧段本身。
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。findSourceFromEdge
方法的示例。public FacilityAnalystResult3D traceUpFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
下图为一个简单的设施网络的示意图,其中结点 Q 为汇点,即资源流入 Q 点,图中的箭头标出了网络的流向。根据流向可以看出,资源流经结点 A、B、C、L、E、F、G 最终流入结点 Q,因此这些结点称为结点 Q 的上游结点,同样,资源流经弧段 AB、BC、CL、LQ、EB、FG、GL 最终流入结点 Q,故这些弧段称为结点 Q 的上游弧段。
上游追踪的目的就是找出某个结点或弧段的上游所流经的所有弧段。上图中,对于结点 Q ,上游追踪的结果为弧段 AB、BC、CL、LQ、EB、FG、GL 的 ID 的数组。
关于上游追踪的更多介绍,请参见 traceUpFromEdge
方法。
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。FacilityAnalyst3D
类的示例。public FacilityAnalystResult3D traceUpFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
下图为一个简单的设施网络的示意图,其中结点 Q 为汇点,即资源流入 Q 点,图中的箭头标出了网络的流向。根据流向可以看出,资源流经结点 A、B、C、L、E、F、G 最终流入结点 Q,因此这些结点称为结点 Q 的上游结点,同样,资源流经弧段 AB、BC、CL、LQ、EB、FG、GL 最终流入结点 Q,故这些弧段称为结点 Q 的上游弧段。同理,对于弧段 LQ 来说,结点 A、B、C、L、E、F、G 是它的上游结点,弧段 AB、BC、CL、EB、FG、GL 是它的上游弧段。
上游追踪的目的就是找出某个结点或弧段的上游所流经的所有弧段。上图中,对于弧段 LQ,上游追踪的结果为弧段 AB、BC、CL、EB、FG、GL 的 ID 数组。
河流(水系)网络是最常见的设施网络之一。上游追踪可以用于分析某条河段的上游河段有哪些,并且上游追踪在遇到障碍(包括障碍点、障碍弧段和障碍结点)时停止搜索。障碍信息在三维设施网络分析环境设置(FacilityAnalystSetting3D
)中指定。如下图所示,黄色弧段为要进行上游追踪的河段,红色弧段为障碍,蓝色弧段为分析出的上游弧段。
上游追踪的一个常用应用是辅助定位河流水污染物来源。河流不仅是地球水循环的重要路径,也是人类最主要的淡水资源,一旦河流发生污染而没有及时发现污染源并消除,很可能影响人们的正常饮水和健康。由于河流受重力影响从高处向低处流动,因此当河流发生污染时,应考虑其上游可能出现了污染源,如工业废水排放、生活污水排放、农药化肥污染等。河流水污染物来源追踪的大致步骤一般为:
edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。/** * 根据给定的弧段 ID 或结点 ID 进行上游追踪或下游追踪。 * @param datasource 指定的三维网络数据集所在的数据源。 */ private void traceUpOrDownExample(Datasource datasource) { // 获取用于分析的三维网络数据集 DatasetVector network3D = (DatasetVector) datasource.getDatasets().get("FacilityNet"); // 构造一个三维设施网络分析环境设置对象,并设置相关参数 FacilityAnalystSetting3D facilityAnalystSetting = new FacilityAnalystSetting3D(); facilityAnalystSetting.setNetworkDataset(network3D); facilityAnalystSetting.setDirectionField("direction"); facilityAnalystSetting.setEdgeIDField("SMEDGEID"); facilityAnalystSetting.setNodeIDField("SMNODEID"); facilityAnalystSetting.setFNodeIDField("SMFNODE"); facilityAnalystSetting.setTNodeIDField("SMTNODE"); facilityAnalystSetting.setTolerance(0.001); WeightFieldInfo3D weightFieldInfo = new WeightFieldInfo3D(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SMLENGTH"); weightFieldInfo.setTFWeightField("SMLENGTH"); WeightFieldInfos3D weightFieldInfos = new WeightFieldInfos3D(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); facilityAnalystSetting.setBarrierEdges(new int[] { 8 }); facilityAnalystSetting.setBarrierNodes(new int[] { 79 }); // 构造一个三维设施网络分析对象,并设置三维设施网络分析环境 FacilityAnalyst3D facilityAnalyst = new FacilityAnalyst3D(); facilityAnalyst.setAnalystSetting(facilityAnalystSetting); // 加载三维网络模型 boolean isLoad = facilityAnalyst.load(); if (isLoad) { // 获取参与分析的弧段或结点 ID int edgeID = 102; int nodeID = 45; //对给定的弧段进行上游追踪 FacilityAnalystResult3D resultTraceUpFromEdge = facilityAnalyst.traceUpFromEdge(edgeID, "Length", true); System.out.println("从弧段" + edgeID + "进行上游追踪的耗费为" + resultTraceUpFromEdge.getCost()); System.out.println("从弧段" + edgeID + "进行上游追踪,弧段 ID 包括:"); for (int i = 0; i < resultTraceUpFromEdge.getEdges().length; i++) { System.out.println(resultTraceUpFromEdge.getEdges()[i]); } System.out.println("从弧段" + edgeID + "进行上游追踪,结点 ID 包括:"); for (int i = 0; i < resultTraceUpFromEdge.getNodes().length; i++) { System.out.println(resultTraceUpFromEdge.getNodes()[i]); } //对给定的结点进行上游追踪(略,参考"对给定的弧段进行上游追踪") //对给定的结点进行下游追踪 FacilityAnalystResult3D resultTraceDownFromNode = facilityAnalyst.traceDownFromNode(nodeID, "Length", true); System.out.println("从结点" + nodeID + "进行下游追踪的耗费为" + resultTraceDownFromNode.getCost()); System.out.println("从结点" + nodeID + "进行下游追踪,弧段 ID 包括:"); for (int i = 0; i < resultTraceDownFromNode.getEdges().length; i++) { System.out.println(resultTraceDownFromNode.getEdges()[i]); } System.out.println("从结点" + nodeID + "进行下游追踪,结点 ID 包括:"); for (int i = 0; i < resultTraceDownFromNode.getNodes().length; i++) { System.out.println(resultTraceDownFromNode.getNodes()[i]); } //对给定的弧段进行下游追踪(略,参考"对给定的结点进行下游追踪") } // 分析完毕,释放三维设施网络分析对象所占的资源 facilityAnalyst.dispose(); }
public FacilityAnalystResult3D traceDownFromNode(int nodeID, String weightName, boolean isUncertainDirectionValid)
下图为一个简单的设施网络的示意图,其中结点 Q 为源点,即资源从 Q 点流出,图中的箭头标出了网络的流向。根据流向可以看出,结点 A、B、C、L、E、F、G 都接收了从结点 Q 流出的资源,因此这些结点称为结点 Q 的下游结点,同样,资源从结点 Q 流出,流经弧段 BA、CB、LC、QL、BE、GF、LG,故这些弧段称为结点 Q 的下游弧段。
下游追踪的目的就是找出某个结点或弧段的下游所流经的所有弧段。上图中,对于结点 Q ,下游追踪的结果为弧段 BA、CB、LC、QL、BE、GF、LG 的 ID 数组。
下游追踪常用于影响范围的分析。详细介绍请参见 traceDownFromEdge
方法。
nodeID
- 指定的结点 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。FacilityAnalyst3D
类的示例。public FacilityAnalystResult3D traceDownFromEdge(int edgeID, String weightName, boolean isUncertainDirectionValid)
下图为一个简单的设施网络的示意图,其中结点 Q 为源点,即资源从 Q 点流出,图中的箭头标出了网络的流向。根据流向可以看出,结点 A、B、C、L、E、F、G 都接收了从结点 Q 流出的资源,因此这些结点称为结点 Q 的下游结点,同样,资源从结点 Q 流出,流经弧段 BA、CB、LC、QL、BE、GF、LG,故这些弧段称为结点 Q 的下游弧段。同理,对于弧段 QL 来说,结点 A、B、C、L、E、F、G 是它的下游结点,弧段 BA、CB、LC、BE、GF、LG 是它的下游弧段。
下游追踪的目的就是找出某个结点或弧段的下游所流经的所有弧段。上图中,对于弧段 QL,下游追踪的结果为弧段 BA、CB、LC、BE、GF、LG 的 ID 数组。
下游追踪常用于影响范围的分析。例如:
FacilityAnalystSetting3D
中设置),下游追踪时,到达障碍即追踪停止,这样可以缩小分析的范围。确定了可能受影响的河段后,通过空间查询和分析标记出位于结果河段附近的所有用水单位和居民区,及时下发通知,并采取紧急措施,防止污染的危害进一步扩大。edgeID
- 指定的弧段 ID。weightName
- 指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(setWeightFieldInfos
)中某一个权值信息对象(WeightFieldInfo3D
) 的名称(getName
)。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。FacilityAnalyst3D
类的示例。public FacilityAnalystResult3D findCriticalFacilitiesUpFromNode(int[] sourceNodeIDs, int nodeID, boolean isUncertainDirectionValid)
此方法根据给定的结点 ID 和设施结点的 ID 数组,查找该结点的上游中的关键设施结点。有关上游关键设施查找的详细介绍,请参阅另一重载方法 findCriticalFacilitiesUpFromEdge
,该方法用来查找给定弧段的上游中的关键设施结点。
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。nodeID
- 指定的分析结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为 false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。findCriticalFacilitiesUpFromEdge
方法的示例。public FacilityAnalystResult3D findCriticalFacilitiesUpFromEdge(int[] sourceNodeIDs, int edgeID, boolean isUncertainDirectionValid)
在进行上游关键设施查找分析时,我们将设施网络的结点划分为普通结点和设施结点两类,其中设施结点认为是能够影响网络连通性的结点,例如供水管网中的阀门;普通结点是不影响网络连通性的结点,如供水管网中的消防栓或三通等。上游关键设施查找分析需要指定设施结点和分析结点,其中分析结点可以是设施结点也可以是普通结点。
上游关键设施查找分析将从给定的设施结点中筛选出关键结点,这些关键结点是分析弧段与其上游保持连通性的最基本的结点,也就是说,关闭这些关键结点后,分析结点与上游无法连通。同时,该分析的结果还包含查找出的关键结点的下游弧段的并集。关键设施结点和它们的下游分别通过设施网络分析结果(FacilityAnalystResult3D)类的 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 network3D = (DatasetVector)datasource.getDatasets().get("FacilityNet"); //构造一个三维设施网络分析环境设置对象,并设置相关参数 FacilityAnalystSetting3D facilityAnalystSetting = new FacilityAnalystSetting3D(); facilityAnalystSetting.setNetworkDataset(network3D); facilityAnalystSetting.setDirectionField("direction"); facilityAnalystSetting.setEdgeIDField("SMEDGEID"); facilityAnalystSetting.setNodeIDField("SMNODEID"); facilityAnalystSetting.setFNodeIDField("SMFNODE"); facilityAnalystSetting.setTNodeIDField("SMTNODE"); facilityAnalystSetting.setTolerance(0.001); //由于上游关键设施查找不需要权值信息,因此不需要设置WeightFieldInfos //是否设置WeightFieldInfos需要根据具体的分析功能确定 //构造一个三维设施网络分析对象,并设置三维设施网络分析环境 FacilityAnalyst3D facilityAnalyst = new FacilityAnalyst3D(); 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 }; //对给定弧段进行上游关键设施查找分析 FacilityAnalystResult3D result = facilityAnalyst.findCriticalFacilitiesUpFromEdge(facilitiyNodeIDs, edgeID, true); if (result != null) { //从设施网络分析结果中获取查找到的关键设施结点数组 int[] criticalFacilities = result.getNodes(); //从设施网络分析结果中获取关键设施结点的下游弧段数组 int[] catchmentEdges = result.getEdges(); } //对给定结点进行上游关键设施查找分析(略,参考“对给定弧段进行上游关键设施查找分析”) } // 分析完毕,释放三维设施网络分析对象所占的资源 facilityAnalyst.dispose(); }
public FacilityAnalystResult3D findCriticalFacilitiesDownFromNode(int[] sourceNodeIDs, int nodeID, boolean isUncertainDirectionValid)
此方法根据给定的结点 ID 和设施结点的 ID 数组,查找该结点的下游中的关键设施结点。有关下游关键设施查找的详细介绍,请参阅另一重载方法FacilityAnalyst3D.findCriticalFacilitiesDownFromEdge(int[], int, boolean)
,该方法用来查找给定弧段的下游中的关键设施结点。
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。nodeID
- 指定的分析结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。public FacilityAnalystResult3D findCriticalFacilitiesDownFromEdge(int[] sourceNodeIDs, int edgeID, boolean isUncertainDirectionValid)
在进行下游关键设施查找分析时,我们将设施网络的结点划分为普通结点和设施结点两类,其中设施结点认为是能够影响网络连通性的结点,例如供水管网中的阀门;普通结点是不影响网络连通性的结点,如供水管网中的消防栓或三通等。
下游关键设施查找分析将从给定的设施结点中筛选出关键结点,这些关键结点是分析弧段与其下游保持连通性的最基本的结点,也就是说,关闭这些关键结点后,分析结点与下游无法连通。同时,该分析的结果还包含给定弧段影响的下游弧段并集。关键设施结点和下游弧段分别通过设施网络分析结果类的 getNodes()
和 getEdges()
方法返回。
关键设施结点的查找方式可以归纳为:从分析弧段出发,向它的下游查找,每个方向上遇到的第一个设施结点,就是要查找的关键设施结点。
此方法根据给定的弧段 ID 和设施结点的 ID 数组,查找该弧段的下游中的关键设施结点。还可以通过 FacilityAnalyst3D.findCriticalFacilitiesDownFromNode(int[], int, boolean)
方法来查找给定结点的下游关键设施结点。
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。edgeID
- 指定的分析弧段 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 buildFacilityNetworkDirections
方法的介绍。public void dispose()
public BurstAnalyse3DResult burstAnalyseFromNode(int[] sourceNodeIDs, int nodeID, boolean isUncertainDirectionValid)
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。nodeID
- 指定的分析结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅NetworkBuilder.buildFacilityNetworkDirections方法的介绍。public BurstAnalyse3DResult burstAnalyseFromEdge(int[] sourceNodeIDs, int edgeID, boolean isUncertainDirectionValid)
sourceNodeIDs
- 指定的设施结点 ID 数组。不能为空。edgeID
- 指定的弧段结点 ID。isUncertainDirectionValid
- 指定不确定流向是否有效。指定为 true,表示不确定流向有效,遇到不确定流向时分析继续进行;指定为
false,表示不确定流向无效,遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2
时代表该弧段的流向为不确定流向。详细介绍请参阅NetworkBuilder.buildFacilityNetworkDirections方法的介绍。Copyright © 2021–2024 SuperMap. All rights reserved.