上游关键设施查找,即查找给定弧段的上游中的关键设施结点,返回关键结点 ID 数组及其影响到的下游弧段 ID 数组。

命名空间:  SuperMap.Analyst.NetworkAnalyst
程序集:  SuperMap.Analyst.NetworkAnalyst (in SuperMap.Analyst.NetworkAnalyst)
版本: dll

语法

C#
public FacilityAnalystResult FindCriticalFacilitiesUpFromEdge(
	int[] sourceNodeIDs,
	int edgeID,
	bool isUncertainDirectionValid
)

参数

sourceNodeIDs
Type: array< System..::.Int32 >[]()[]
指定的设施结点 ID 数组。不能为空。
edgeID
Type: System..::.Int32
指定的分析弧段 ID。
isUncertainDirectionValid
Type: System..::.Boolean
指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。

返回值

设施网络分析结果。未查找到关键设施结点返回 null。

备注

在进行上游关键设施查找分析时,我们将设施网络的结点划分为普通结点和设施结点两类,其中设施结点认为是能够影响网络连通性的结点,例如供水管网中的阀门;普通结点是不影响网络连通性的结点,如供水管网中的消防栓或三通等。上游关键设施查找分析需要指定设施结点和分析结点,其中分析结点可以是设施结点也可以是普通结点。

上游关键设施查找分析将从给定的设施结点中筛选出关键结点,这些关键结点是分析弧段与其上游保持连通性的最基本的结点,也就是说,关闭这些关键结点后,分析结点与上游无法连通。同时,该分析的结果还包含查找出的关键结点的下游弧段的并集。关键设施结点和它们的下游分别通过设施网络分析结果(FacilityAnalystResult)类的 NodesEdges 方法返回。

关键设施结点的查找方式可以归纳为:从分析弧段出发,向它的上游回溯,每个方向上遇到的第一个设施结点,就是要查找的关键设施结点。如下图所示,从分析弧段(红色)出发,查找到的关键设施结点包括:2、8、9 和 7。而结点 4 和 11 不是回溯方向上遇到的第一个设施结点,因此不是关键设施结点。作为示意,这里仅给出了分析弧段的上游部分,但注意分析结果还会给出关键设施结点 2、8、9 和 7 的下游弧段。

此方法根据给定的弧段 ID 和设施结点的 ID 数组,查找该弧段的上游中的关键设施结点。还可以通过 FindCriticalFacilitiesUpFromNode 方法来查找给定结点的上游的关键设施结点。

应用实例

供水管网发生爆管后,可以将所有的阀门作为设施结点,将发生爆裂的管段或管点作为分析弧段或分析结点,进行上游关键设施查找分析,迅速找到上游中需要关闭的最少数量的阀门。关闭这些阀门后,爆裂管段或管点与它的上游不再连通,从而阻止水的流出,防止灾情加重和资源浪费。同时,分析得出需要关闭的阀门的下游弧段的并集,也就是关闭阀门后的影响范围,从而确定停水区域,及时做好通知工作和应急措施。

示例

以下代码示范了如何进行上游关键设施查找分析。

假设在数据源“datasource”中存在一个名为“FacilityNet”的网络数据集,查找弧段 ID 为 16 的弧段的上游中的关键设施结点有哪些。

CopyC#
/// <summary>
/// 根据给定的弧段 ID 和设施结点 ID 数组进行上游关键设施查找分析。
/// </summary>
/// <param name="datasource">指定的网络数据集所在的数据源。</param>
private void FindCriticalFacilitiesUpExample(Datasource datasource)
{
    //获取用于分析的网络数据集
    DatasetVector network = datasource.Datasets["FacilityNet"] 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;
    //由于上游关键设施查找不需要权值信息,因此不需要设置WeightFieldInfos
    //是否设置WeightFieldInfos需要根据具体的分析功能确定

    //构造一个设施网络分析对象,并设置设施网络分析环境
    FacilityAnalyst facilityAnalyst = new FacilityAnalyst();
    facilityAnalyst.AnalystSetting = facilityAnalystSetting;

    //加载网络模型
    Boolean isLoad = facilityAnalyst.Load();

    if (isLoad)
    {
        //指定待分析弧段
        Int32 edgeID = 16;
        //指定网络中的设施结点
        Int32[] facilitiyNodeIDs = new Int32[] { 1, 9, 10, 13, 17, 20, 21, 29, 30, 35, 35, 37 };
        //对给定弧段进行上游关键设施查找分析
        FacilityAnalystResult result = facilityAnalyst.FindCriticalFacilitiesUpFromEdge(facilitiyNodeIDs, edgeID, true);
        if (result != null)
        {
            //从设施网络分析结果中获取查找到的关键设施结点数组
            Int32[] criticalFacilities = result.Nodes;
            //从设施网络分析结果中获取关键设施结点的下游弧段数组
            Int32[] catchmentEdges = result.Edges;
        }
        //对给定结点进行上游关键设施查找分析(略,参考“对给定弧段进行上游关键设施查找分析”)
    }

    // 分析完毕,释放设施网络分析对象所占的资源
    facilityAnalyst.Dispose();
}

请参见