程序集: SuperMap.Analyst.NetworkAnalyst (in SuperMap.Analyst.NetworkAnalyst)
版本: dll
语法
C# |
---|
public FacilityAnalystResult TraceUpFromNode( 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 方法的介绍。
返回值
设施网络分析结果。备注
- 上游和下游
- 上游追踪与下游追踪
- 应用实例
- 当水质监测站的监测数据显示水质发生异常,首先确定发生异常的位置,从而在河流网络(网络数据集)上找出该位置所在(或最近)的弧段或结点,作为上游追踪的起点;
- 如果知道在起点的上游中距离起点最近的水质监测正常的位置,可以将这些位置或其所在的河段设置为障碍,可以帮助进一步缩小分析的范围。因为可以认为,水质监测正常的位置的上游,不可能存在此次调查的污染源。设置为障碍后,进行上游追踪分析,追踪到该位置后,将不会继续追踪该位置的上游;
- 进行上游追踪分析,查找到向发生水质异常位置所在河段汇流的所有河段;
- 使用空间查询、分析找出位于这些河段附近的所有可能的污染源,如化工厂、垃圾处理厂等;
- 根据发生水质异常的监测数据对污染源进行进一步筛选;
- 分析筛选出的污染源的排污负荷,按照其造成污染的可能性进行排序;
- 对可能的污染源按照顺序进行实地调查与研究,最终确定污染物来源。
对于设施网络的某个结点(或弧段)来说,网络中的资源最终流入该结点(或弧段)所经过的弧段和结点称为它的上游;从该结点(或弧段)流出最终流入汇点所经过的弧段和网络称为它的下游。
下面以结点的上游和下游为例。下图是一个简单的设施网络的示意图,使用箭头标出了网络的流向。根据流向,可以看出,资源流经结点 2、4、3、7、8 以及弧段 10、9、3、4、8 最终流入结点 10,因此这些结点和弧段称为结点 10 的上游,其中的结点称为它的上游结点,弧段称为它的上游弧段。同样的,资源从结点 10 流出,流经结点9、11、12 以及弧段 5、7、11 最终流出网络,因此,这些结点和弧段称为结点 10 的下游,其中的结点称为它的下游结点,弧段称为它的下游弧段。
上游追踪,是从给定结点(或弧段)出发,根据流向,查找其上游的过程。类似的,下游追踪是从给定结点(或弧段)出发,根据流向,查找其下游的过程。FacilityAnalyst 类分别提供了从结点或弧段出发,进行上游或下游追踪的方法,分析的结果为查找到的上游或下游所包含的弧段 ID 数组、结点 ID 数组,以及流经整个上游或者下游的耗费。本方法用于查找给定弧段的上游。
上游追踪的一个常用应用是辅助定位河流水污染物来源。河流不仅是地球水循环的重要路径,也是人类最主要的淡水资源,一旦河流发生污染而没有及时发现污染源并消除,很可能影响人们的正常饮水和健康。由于河流受重力影响从高处向低处流动,因此当河流发生污染时,应考虑其上游可能出现了污染源,如工业废水排放、生活污水排放、农药化肥污染等。河流水污染物来源追踪的大致步骤一般为:
示例
以下代码示范了如何根据给定的结点或弧段进行上下游追踪。本例使用示范数据中的“FacilityNet.udb”数据源进行分析,该数据源中存在一个名为“WaterNet”的网络数据集,以弧段 ID 为 336 的弧段和结点 ID 为 311 的结点为例,示范如何进行上游追踪和下游追踪。
/// <summary> /// 根据给定的弧段 ID 或结点 ID 进行上游追踪或下游追踪。 /// </summary> /// <param name="datasource">指定的网络数据集所在的数据源。</param> private void TraceUpOrDownExample(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 resultTraceUpFromEdge = facilityAnalyst.TraceUpFromEdge(edgeID, "Length", true); Console.WriteLine("从弧段" + edgeID + "进行上游追踪的耗费为" + resultTraceUpFromEdge.Cost); Console.WriteLine("从弧段" + edgeID + "进行上游追踪,弧段 ID 包括:"); for (Int32 i = 0; i < resultTraceUpFromEdge.Edges.Length; i++) { Console.WriteLine(resultTraceUpFromEdge.Edges[i]); } Console.WriteLine("从弧段" + edgeID + "进行上游追踪,结点 ID 包括:"); for (Int32 i = 0; i < resultTraceUpFromEdge.Nodes.Length; i++) { Console.WriteLine(resultTraceUpFromEdge.Nodes[i]); } //对给定的结点进行上游追踪(略,参考"对给定的弧段进行上游追踪") //对给定的结点进行下游追踪 FacilityAnalystResult resultTraceDownFromNode = facilityAnalyst.TraceDownFromNode(nodeID, "Length", true); Console.WriteLine("从结点" + nodeID + "进行下游追踪的耗费为" + resultTraceDownFromNode.Cost); Console.WriteLine("从结点" + nodeID + "进行下游追踪,弧段 ID 包括:"); for (Int32 i = 0; i < resultTraceDownFromNode.Edges.Length; i++) { Console.WriteLine(resultTraceDownFromNode.Edges[i]); } Console.WriteLine("从结点" + nodeID + "进行下游追踪,结点 ID 包括:"); for (Int32 i = 0; i < resultTraceDownFromNode.Nodes.Length; i++) { Console.WriteLine(resultTraceDownFromNode.Nodes[i]); } //对给定的弧段进行下游追踪(略,参考"对给定的结点进行下游追踪") } //分析完毕,释放设施网络分析对象所占的资源 facilityAnalyst.Dispose(); }