根据给定的结点 ID 查找源,即从给定结点出发,根据流向查找流向该结点的网络源头,并返回该源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。
命名空间:
SuperMap.Analyst.NetworkAnalyst程序集: SuperMap.Analyst.NetworkAnalyst (in SuperMap.Analyst.NetworkAnalyst)
版本: dll
语法
C# |
---|
public FacilityAnalystResult FindSourceFromNode( int nodeID, string weightName, bool isUncertainDirectionValid ) |
参数
- nodeID
- Type: System..::.Int32
指定的结点 ID。
- weightName
- Type: System..::.String
指定的权值字段信息对象的名称,即设施网络分析环境中指定的权值字段信息集合(WeightFieldInfos)中某一个权值信息对象(WeightFieldInfo)的名称(Name)。
- isUncertainDirectionValid
- Type: System..::.Boolean
指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值
设施网络分析结果。备注
该方法从给定结点出发,按照流向,查找流向该结点的网络源头结点(即源点),分析的结果为查找到的源到达给定结点的最小耗费路径所包含的弧段、结点及耗费。如果网络中有多个源,将查找最远的也就是到达给定结点的最小耗费最大的那个源。为了便于理解,可将该功能的实现过程分为三步:
- 从给定结点出发,根据流向,找到该结点上游所有的源点;
- 分析每个源到达给定结点的最小耗费路径并计算耗费;
- 选择上一步中计算出的耗费中的最大值所对应的路径作为结果,给出该路径上的弧段 ID 数组、结点 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 就是查找到的源。
注意:分析结果中的结点 ID 数组不包括分析结点本身。
示例
以下代码示范了如何根据给定的结点或弧段查找源和汇。本例使用示范数据中的“FacilityNet.udb”数据源进行分析,该数据源中存在一个名为“WaterNet”的网络数据集,以弧段 ID 为 336 的弧段和结点 ID 为 311 的结点为例,示范如何查找源和汇。
CopyC#
/// <summary> /// 根据给定的弧段 ID 或结点 ID 来查找源或汇。 /// </summary> /// <param name="datasource">指定的网络数据集所在的数据源。</param> private void FindSourceOrSinkExample(Datasource datasource) { //获取用于分析的网络数据集 DatasetVector network = datasource.Datasets["WaterNet"] as DatasetVector; //构造一个设施网络分析环境设置对象,并设置相关参数 FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting(); facilityAnalystSetting.NetworkDataset = network; facilityAnalystSetting.DirectionField = "direction"; facilityAnalystSetting.EdgeIDField = "SMEDGEID"; facilityAnalystSetting.NodeIDField = "SMNODEID"; facilityAnalystSetting.FNodeIDField = "SMFNODE"; facilityAnalystSetting.TNodeIDField = "SMTNODE"; facilityAnalystSetting.Tolerance = 0.001; WeightFieldInfo weightFieldInfo = new WeightFieldInfo(); weightFieldInfo.Name = "Length"; weightFieldInfo.FTWeightField = "SMLENGTH"; weightFieldInfo.TFWeightField = "SMLENGTH"; WeightFieldInfos weightFieldInfos = new WeightFieldInfos(); weightFieldInfos.Add(weightFieldInfo); facilityAnalystSetting.WeightFieldInfos = weightFieldInfos; //障碍结点和障碍弧段的设置对查找源/汇是有效的 facilityAnalystSetting.BarrierEdges = new Int32[] { 8, 199 }; facilityAnalystSetting.BarrierNodes = new Int32[] { 372 }; //构造一个设施网络分析对象,并设置设施网络分析环境 FacilityAnalyst facilityAnalyst = new FacilityAnalyst(); facilityAnalyst.AnalystSetting = facilityAnalystSetting; //加载网络模型 Boolean isLoad = facilityAnalyst.Load(); if (isLoad) { //获取参与分析的弧段或结点 ID Int32 edgeID = 336; Int32 nodeID = 311; //根据给定弧段查找源 FacilityAnalystResult resultSourceFromEdge = facilityAnalyst.FindSourceFromEdge(edgeID, "Length", true); if (resultSourceFromEdge != null) { Console.WriteLine("从弧段" + edgeID + "到源的耗费为" + resultSourceFromEdge.Cost); Console.WriteLine("从弧段" + edgeID + "到源的弧段 ID 包括:"); for (Int32 i = 0; i < resultSourceFromEdge.Edges.Length; i++) { Console.WriteLine(resultSourceFromEdge.Edges[i]); } Console.WriteLine("从弧段" + edgeID + "到源的结点 ID 包括:"); for (Int32 i = 0; i < resultSourceFromEdge.Nodes.Length; i++) { Console.WriteLine(resultSourceFromEdge.Nodes[i]); } } //根据给定结点查找源(略,参考“根据给定弧段查找源”) //根据给定结点查找汇 FacilityAnalystResult resultSinkFromNode = facilityAnalyst.FindSinkFromNode(nodeID, "Length", true); if (resultSinkFromNode != null) { Console.WriteLine("从结点" + nodeID + "到汇的耗费为" + resultSinkFromNode.Cost); Console.WriteLine("从结点" + nodeID + "到汇的弧段 ID 包括:"); for (Int32 i = 0; i < resultSinkFromNode.Edges.Length; i++) { Console.WriteLine(resultSinkFromNode.Edges[i]); } Console.WriteLine("从结点" + nodeID + "到汇的结点 ID 包括:"); for (Int32 i = 0; i < resultSinkFromNode.Nodes.Length; i++) { Console.WriteLine(resultSinkFromNode.Nodes[i]); } } //根据给定弧段查找汇(略,参考“根据给定结点查找汇”) } //分析完毕,释放设施网络分析对象所占的资源 facilityAnalyst.Dispose(); }