设施网络分析 |
使用 SuperMap 组件产品提供的设施网络分析功能进行分析的前提是构建网络数据集,即将待分析事物抽象为点和线,然后利用网络数据模型赋予抽象的点和线一定的拓扑关系,从而模拟现实世界中的常见网络和公共基础设施的网络结构。
SuperMap 组件产品的 NetworkBuilder 类提供网络数据集构建的方法,可以通过线数据集及可选的点数据集构建网络。另外,还可以通过网络数据集追加功能向已有网络追加点、线或者网络数据集。
SuperMap 组件产品的 NetworkBuilder 类提供了三个 BuildNetwork 方法,满足在不同数据基础和层次之上构建网络数据集。下面分别进行介绍:
方法一:通过单个线数据集构建网络模型数据集。可以设置保存的非系统字段。
语法:
通过此方法构建网络数据集时,会在线与线相交处打断。
语法:
public static DatasetVector BuildNetwork(DatasetVector lineDataset, String[] lineFieldNames, Datasource outputDatasource, String networkDatasetName )
参数说明:
lineDataset:指定的用于构建网络数据集的线数据集。
lineFieldNames:指定的结果网络数据集中需要保存的线数据集非系统字段名称的数组。
outputDatasource:指定的用于存储结果数据集的数据源。
networkDatasetName:指定的结果网络数据集的名称。
返回值说明:
返回建立好的网络数据集,网络数据集属于矢量数据集类型。
方法二:通过多个线数据集和点数据集构建网络数据集。可以设置保存的非系统字段及打断模式。
语法:
public static DatasetVector BuildNetwork(DatasetVector[] lineDatasets, DatasetVector[] pointDatasets, String[] lineFieldNames, String[] pointFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode networkSplitMode, Double tolerance)
参数说明:
lineDatasets:指定的用于构建网络数据集的线数据集数组,该数组中包含了一个或多个用来构建网络数据集的线数据集。
pointDatasets:指定的用于构建网络数据集的点数据集数组,该数组中包含了一个或多个用来构建网络数据集的点数据集。可选。
lineFieldNames:指定的结果网络数据集中需要保存的线数据集数组中的非系统字段名称的数组。
pointFieldNames:指定的结果网络数据集中需要保存的点数据集数组中的非系统字段名称的数组。
outputDatasource:指定的用于存储结果数据集的数据源。
networkDatasetName:指定的结果网络数据集的名称。
networkSplitMode:指定的打断模式。
tolerance:指定的容限值。用于判断点数据集中的点是否可以处理为网络上的结点的容限值。要求不能小于 0。
返回值说明:
返回建立好的网络数据集,网络数据集属于矢量数据集类型。
方法三:通过单个线数据集和点数据集以及已知的表达拓扑关系的字段构建网络数据集。
当已有的线、点数据集中的线、点对象分别对应着待构建网络的弧段和结点,并具有描述二者空间拓扑关系的信息,即线数据集含有弧段 ID、弧段起始结点 ID 和终止结点 ID 字段,点数据集含有点对象的结点 ID 字段时,可以采用本方法构建三维网络数据集。
使用此方式构建网络数据集成功后,结果对象数与源数据的对象数一致,即线数据中一个线对象作为一个弧段写入,点数据中一个点对象作为一个结点写入,并且保留点、线数据集的所有非系统字段到结果数据集中。
例如,对于用于建立管网而采集的管线、管点数据,管线和管点均使用唯一固定编码来标识。管网的特点之一是管点只位于管线的两端,因此管点对应了待构建管网的所有结点,管线对应了待构建管网的所有弧段,不需要在管线与管线相交处打断。在管线数据中,记录了管线对象两端的管点信息,即起始管点编码和终止管点编码,也就是说管线和管点数据中已经蕴含了二者空间拓扑关系的信息,因此适合使用此方法构建网络数据集。
语法:
public static DatasetVector BuildNetwork(DatasetVector lineDataset, DatasetVector pointDataset, String[] lineFieldNames, String edgeIDField, String fromNodeField, String toNodeField, String nodeIDField, Datasource outputDatasource, String networkDatasetName)
参数说明:
lineDataset:指定的用于构建网络数据集的线数据集。
pointDataset:指定的用于构建网络数据集的点数据集。
edgeIDField:指定的线数据集中表示弧段 ID 的字段。如果指定为 null 或空字符串,或指定的字段不存在,则自动使用 SMID 作为弧段 ID。仅支持 16 位整型、32 位整型字段。
fromNodeField:指定的线数据集中表示弧段的起始结点 ID 的字段。仅支持 16 位整型、32 位整型字段。
toNodeField:指定的线数据集中表示弧段的终止结点 ID 的字段。仅支持 16 位整型、32 位整型字段。
nodeIDField:指定的点数据集中表示结点 ID 的字段。仅支持 16 位整型、32 位整型字段。
outputDatasource:指定的用于存储结果数据集的数据源。
networkDatasetName:指定的结果网络数据集的名称。
返回值说明:
返回建立好的网络数据集,网络数据集属于矢量数据集类型。
注意:
1. 线数据集数组必须至少包含一个元素,而点数据集数组是可选的,如果将 pointDatasets 指定为一个空数组,此时,将通过多个线数据集来构建网络数据集。显然,此时无论采用哪种打断方式,都只会在线线相交处打断。
2. 参与构建的点数据集的点对象不是全部都会添加到网络数据集中,只有在线上的点对象是有效的参与点(点线距离在指定的容限范围内);
3. 指定了点数据集的保留字段后,只有点数据集的有效参与点的这些字段的值将赋给对应的网络结点,其他结点的相应字段信息为0或空。
一旦构建网络的原数据发生变化,原有网络就会过时,如果不及时更新网络,就可能影响分析结果的正确性。通过将新增数据追加到原有网络的方式,可以不必重新构建网络而得到较新的网络。如图 5-1 所示,某区域新建了若干道路(红色线),将这些道路抽象为线数据,追加到扩建之前所构建的网络上,从而更新了路网。
图 4‑1 通过网络数据集追加更新路网 |
通过 NetworkBuilder 类的 AppendToNetwork 方法可以实现对网络数据集进行追加。
语法:
public static Boolean AppendToNetwork(DatasetVector networkDataset, DatasetVector[] datasets)
参数说明:
networkDataset:指定的被追加的网络数据集。
datasets:指定的待追加的数据,可以是点、线或网络数据集。
返回值说明:
返回一个布尔值,指示是否追加成功。如果成功,返回 true,否则返回 false。
该方法可以实现向已有网络中追加点、线或网络数据集,并且可以同时追加多个相同或不同类型的数据集。例如,同时追加一份点数据和两份线数据。注意,如果追加的数据具有多种类型,系统将按照先追加网络,再追加线,最后追加点的顺序来依次追加。下面分别介绍向网络中追加点、线和网络的方式和规则。
1. 向网络追加点
点被追加到已有网络时,将成为网络中新的结点。需要注意,待追加的点必须在已有网络的弧段上。追加后,在弧段上该点位置处增加新的结点,该弧段将自动在新增结点处断开为两条弧段,如图 5-2 中的点 a、点 d。如果待追加的点不在网络上,即不在弧段上,也不与结点重叠,将被忽略,不会追加到网络上,因为孤立结点在网络中并无地学意义。图 5-2 中的点 b 就属于这种情况。 如果待追加的点与已有网络的结点重叠,则将待追加点与重叠结点合并,如图 5-2 中的点 c。
图 5-2 向已有网络追加点 |
2. 向网络追加线
线被追加到已有网络后,将成为网络中新的弧段,并且在线的端点、与其他线(或弧段)的交点处打断并增加新的结点。这里需要注意,待追加的线不能存在与已有网络弧段重叠或部分重叠,否则会导致追加后的网络存在错误。图 5-3 展示了将线追加到网络的前后。
图 5-3 向已有网络追加线 |
3. 向网络追加网络
将一个网络追加到已有网络后,二者将成为一个网络,如图 5-4 所示。待追加网络与被追加网络叠加出现弧段相交的情形时,在相交处会添加新的结点,从而建立新的拓扑关系。注意,与追加线相同,向已有网络中追加网络时,需要确保这两个网络不存在弧段的重叠或部分重叠,否则会导致追加后的网络存在错误。
图 5-4 向已有网络追加网络 |
使用该方法进行网络数据集追加时,还需要注意以下事项:
1. 该方法将直接修改被追加的网络数据集,不会生成新的网络数据集。
2. 待追加的点、线或网络数据集必须与被追加的网络数据集具有相同的坐标系。
3. 待追加的点、线或网络数据集中,如果存在与网络数据集相同(名称和类型都必须相同)的属性字段,那么这些属性值会自动保留到追加后的网络数据集中;如果不存在相同的字段,则不保留。其中,点数据集、网络数据集的结点数据集的属性,保留到被追加网络的结点属性表中;线数据集的属性,保留到被追加网络的弧段属性表中。
SuperMap的网络数据集(Network)属于矢量数据集(DatasetVector),它由网络弧段和网络结点构成,并记录了二者的拓扑关系。网络数据集包含一个弧段(线类型)数据集和一个结点(点类型)数据集,其中弧段数据集为主数据集,结点数据集为子数据集。在弧段属性表和结点属性表中,存储有表达弧段和结点之间的拓扑关系的字段。下面进行详细说明。
4.1 节中介绍的方法一和方法二,在建立网络数据集的同时会进行适当的拓扑处理,如将复杂线对象打散、在线与线相交处打断(由设置的打断模式决定)等,以保证建立的网络数据集的正确性。这两个方法构建的网络数据集,其拓扑关系字段是系统字段,分别为:
弧段 ID 字段:SMEDGEID,记录了作为弧段唯一标识的弧段 ID,位于网络数据集的弧段属性表中;
结点 ID 字段:SMNODEID,记录了作为结点唯一标识的结点 ID,位于网络数据集的结点属性表中;
起始结点 ID 字段:SMFNODE,记录了对应弧段的起始结点的结点 ID,与结点 ID 字段的值具有对应关系,位于网络数据集的弧段属性表中;
终止结点 ID 字段:SMTNODE,记录了对应弧段的终止结点的结点 ID,与结点 ID 字段的值具有对应关系,位于网络数据集的弧段属性表中。
而对于方法三,由于完全按照用户指定的描述网络拓扑关系的字段来构建网络数据集,因此,构建的网络数据集的弧段 ID、弧段起始结点 ID、弧段终止结点 ID 和结点 ID 字段即为调用此方法时指定的字段,而不再是 SMEDGEID、SMFNODE、SMTNODE、SMNODEID 等系统字段。