设施网络分析 |
设施网络是具有方向的网络,因此,在创建网络数据集之后,必须为其创建流向,才能够用于进行各种设施网络路径分析、连通性分析、上下游追踪等。
流向是指网络中资源流动的方向。网络中的流向由源和汇决定:资源总是从源点流出,流向汇点。SuperMap 规定在网络数据集的弧段属性表中使用一个字段来存储流向,字段值共有四个:0、1、2、3,分别代表四种流向类型,具体介绍参见表 5.1。
表 5.1 流向类型
流向类型 |
示例图 |
描述 |
|
0 |
表示对应弧段的流向与数字化方向相同。
如左图所示,线段 AB 的数字化方向为 A-->B。由于 A 为源点,因此资源从 A 流向 B,与数字化方向相同,故 AB 的流向字段值为 0。 |
||
1 |
表示对应弧段的流向与数字化方向相反。
如左图所示,线段 AB 的数字化方向为 A-->B。由于 A 为汇点,因此资源从 B 流向 A,与数字化方向相反,故 AB 的流向字段值为 1。 |
||
2 |
表示对应弧段的流向不确定。
如左图所示,由于 A 和 B 均为源点,那么资源可能从 A 流向 B,也可能从 B 流向 A,具体的流向无法确定,故 AB 的流向字段值为 2。 |
||
3 |
表示对应弧段的流向为未初始化方向,该弧段称为不连通边,即 该弧段与源点、汇点所在的结点不连通。
如左图所示,线段 AB 与源和汇所在的结点不连通,即从网络上不能到达源或汇点,故 AB 的流向字段值为 3。 |
注:
数字化方向:是指对象绘制时的方向,即对象的节点序列的方向。
SuperMap 提供了根据网络中源和汇的位置自动创建流向的方法,即 NetworkBuilder 类的 BuildFacilityNetworkDirections 方法。当然,用户也可以直接建立一个流向字段,通过手动输入和其他方式写入代表流向的值。下面对 BuildFacilityNetworkDirections 方法进行详细介绍。
语法:
public static Boolean BuildFacilityNetworkDirections(FacilityAnalystSetting facilityAnalystSetting, Int32[] sourceIDs, Int32[] sinkIDs, String weightName, String nodeTypeField)
参数说明:
facilityAnalystSetting:指定的设施网络分析环境设置对象。注意,在构建设施网络流向或等级时,参数 facilityAnalystSetting 的障碍弧段(BarrierEdges)和障碍结点(BarrierNodes)的设置将会无效,因为障碍弧段和障碍结点只在进行设施网络相关分析操作时有效,与网络拓扑结构无关。
sourceIDs:指定的源对应的网络结点的结点 ID 数组。网络数据集的流向由源和汇的位置决定,需至少指定一个源或一个汇。
sinkIDs:指定的汇对应的网络结点的结点 ID 数组。网络数据集的流向由源和汇的位置决定,需至少指定一个源或一个汇。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中设置的权值字段信息集合对象(FacilityAnalystSetting.WeightFieldInfos)中某一个权值字段信息对象的名称(WeightFieldInfo.Name)。
nodeTypeField:指定的用于存储结点类型的字段。该字段是网络结点数据集中的字段,如果不存在则创建该字段,要求为整型字段。结点类型分为源点、汇点和普通结点。
返回值说明:
创建流向成功返回 true;失败返回 false。
使用该方法创建流向需要传入一个设施网络分析环境设置对象(FacilityAnalystSetting)作为参数。FacilityAnalystSetting 用于设置设施网络分析所需要的各个参数,包括网络数据集及其拓扑信息字段、网络权值信息及障碍信息等。在创建流向时,除指定网络数据集即其拓扑信息字段外,还需要通过 FacilityAnalystSetting 的 Direction 属性指定一个用于存储结果流向的字段。该字段要求为弧段属性表中的一个整型字段,如果不存在则创建该字段。有关 FacilityAnalystSetting 类的详细介绍,请参阅第 6 章。
创建流向成功后,会在网络数据集中写入两方面内容:一是流向,写入 Direction 属性指定的字段中,其可能的值就是表 5.1所介绍的四个代表流向的值;二是结点类型,写入 nodeTypeField 参数指定的字段中,其值及含义见表 5.2:
表 5.2 结点类型
结点类型 |
含义 |
0 |
表示该结点既不是源,也不是汇,是普通结点 |
1 |
表示该结点为源点 |
2 |
表示该结点为汇点 |
如果用于设施分析的网络数据集存在等级,那么就需要在建立流向的基础上,再为网络数据集建立等级,建立等级通过 NetworkBuilder 类的 BuildFacilityNetworkHierarchies 方法实现:
语法:
public static Boolean BuildFacilityNetworkHierarchies(FacilityAnalystSetting facilityAnalystSetting, Int32[] sourceIDs, Int32[] sinkIDs, String weightName, String hierarchyField, Boolean isLoopValid)
参数说明:
facilityAnalystSetting:指定的设施网络分析环境设置对象。注意,为该对象的 NetworkDataset 属性所指定的网络数据集必须是建立了流向的网络数据集,且障碍弧段(BarrierEdges)和障碍结点(BarrierNodes)的设置将会无效,因为障碍弧段和障碍结点只在进行设施网络相关分析操作时有效,与网络拓扑结构无关。
sourceIDs:指定的源对应的网络结点 ID 数组。
sinkIDs:指定的汇对应的网络结点ID数组。
weightName:指定的权值字段信息对象的名称,即设施网络分析环境中设置的权值字段信息集合对象(FacilityAnalystSetting.WeightFieldInfos)中某一个权值字段信息对象的名称(WeightFieldInfo.Name)。
hierarchyField:指定的用于存储等级的字段。该字段是网络结点数据集中的字段,如果不存在则创建该字段,要求为整型字段。
isUncertainDirectionValid:指定不确定流向是否有效。指定为 true,表示不确定流向有效,具有不确定流向的弧段仍然参与分析;指定为 false,分析时遇到不确定流向将停止在该方向上继续查找。流向字段的值为 2 时代表该弧段的流向为不确定流向。详细介绍请参阅 BuildFacilityNetworkDirections 方法的介绍。
返回值说明:
创建等级成功返回 true,否则 false。
使用该方法创建等级需要传入一个设施网络分析环境设置对象(FacilityAnalystSetting)作为参数。通过该对象,主要是设置待创建等级的网络数据集及其拓扑信息字段,以及流向字段。对于流向字段,如果不指定或指定的字段不存在,则默认流向全部为 0,即与弧段的数字化方向相同。
该方法可以通过 weightName 参数指定权值信息,系统根据权值找到设施网络的主干,主干的等级最高,然后根据流向,主干上游的弧段等级依次降低。该方法认为主干是从源到汇的最小花费路径,如果网络具有多个源或多个汇,则计算所有源到所有汇的最小花费路径,最终取花费最大的一条路径作为主干。
建立等级后,网络数据集的等级字段中保存了等级信息,等级字段以整数的形式记录等级,数值从 1 开始,等级越高数值越小。例如,河流建立等级后,一级河流的等级记录为 1,二级河流的等级记录为 2,以此类推。注意,值为 0 表示未能确定等级,通常是由于该弧段为不连通弧段导致。