根据给定的结点 ID 进行上游追踪,即查找给定结点的上游,返回上游包含的弧段、结点及总耗费。

命名空间:  SuperMap.Analyst.NetworkAnalyst
程序集:  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 数组,以及流经整个上游或者下游的耗费。本方法用于查找给定弧段的上游。

  • 应用实例
  • 上游追踪的一个常用应用是辅助定位河流水污染物来源。河流不仅是地球水循环的重要路径,也是人类最主要的淡水资源,一旦河流发生污染而没有及时发现污染源并消除,很可能影响人们的正常饮水和健康。由于河流受重力影响从高处向低处流动,因此当河流发生污染时,应考虑其上游可能出现了污染源,如工业废水排放、生活污水排放、农药化肥污染等。河流水污染物来源追踪的大致步骤一般为:

    1. 当水质监测站的监测数据显示水质发生异常,首先确定发生异常的位置,从而在河流网络(网络数据集)上找出该位置所在(或最近)的弧段或结点,作为上游追踪的起点;
    2. 如果知道在起点的上游中距离起点最近的水质监测正常的位置,可以将这些位置或其所在的河段设置为障碍,可以帮助进一步缩小分析的范围。因为可以认为,水质监测正常的位置的上游,不可能存在此次调查的污染源。设置为障碍后,进行上游追踪分析,追踪到该位置后,将不会继续追踪该位置的上游;
    3. 进行上游追踪分析,查找到向发生水质异常位置所在河段汇流的所有河段;
    4. 使用空间查询、分析找出位于这些河段附近的所有可能的污染源,如化工厂、垃圾处理厂等;
    5. 根据发生水质异常的监测数据对污染源进行进一步筛选;
    6. 分析筛选出的污染源的排污负荷,按照其造成污染的可能性进行排序;
    7. 对可能的污染源按照顺序进行实地调查与研究,最终确定污染物来源。

示例

以下代码示范了如何根据给定的结点或弧段进行上下游追踪。本例使用示范数据中的“FacilityNet.udb”数据源进行分析,该数据源中存在一个名为“WaterNet”的网络数据集,以弧段 ID 为 336 的弧段和结点 ID 为 311 的结点为例,示范如何进行上游追踪和下游追踪。

CopyC#
/// <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();
}

版本信息

SuperMap iObjects .NET


请参见