com.supermap.analyst.networkanalyst
类 NetworkBuilder

java.lang.Object
  继承者 com.supermap.analyst.networkanalyst.NetworkBuilder

public class NetworkBuilder
extends java.lang.Object

网络建模类。该类是网络分析的建模工具,目前提供根据单个线数据集或多个线和点数据集构建网络数据集,根据设施网络分析的对象创建设施网络流向和创建设施网络等级,以及创建转向表等功能。


方法摘要
static void addSteppedListener(SteppedListener l)
          添加一个进度条事件(SteppedEvent)的监听器。
static boolean appendToNetwork(DatasetVector networkDataset, DatasetVector[] datasets)
          向已有的网络数据集追加数据,可以追加点、线或网络。
static boolean buildFacilityNetworkDirections(FacilityAnalystSetting facilityAnalystSetting, int[] sourceIDs, int[] sinkIDs, java.lang.String weightName, java.lang.String nodeTypeField)
          根据指定网络数据集中源与汇的位置,为网络数据集创建流向。
static boolean buildFacilityNetworkHierarchies(FacilityAnalystSetting facilityAnalystSetting, int[] sourceIDs, int[] sinkIDs, java.lang.String weightName, java.lang.String hierarchyField, boolean isLoopValid)
          为具有流向的网络数据集创建等级,并在指定的等级字段中写入网络数据集的等级信息。
static DatasetVector buildNetwork(DatasetVector[] lineDatasets, DatasetVector[] pointDatasets, Datasource outputDatasource, java.lang.String networkDatasetName, NetworkSplitMode networkSplitMode, double tolerance)
          已过时。 使用 buildNetwork 替代。 通过线数据集数组和点数据集数组构建网络数据集。
static DatasetVector buildNetwork(DatasetVector[] lineDatasets, DatasetVector[] pointDatasets, java.lang.String[] lineFieldNames, java.lang.String[] pointFieldNames, Datasource outputDatasource, java.lang.String networkDatasetName, NetworkSplitMode networkSplitMode, double tolerance)
          通过线数据集数组和点数据集数组(可选)构建网络数据集,可以设置保存的非系统字段及打断模式。
static DatasetVector buildNetwork(DatasetVector lineDataset, DatasetVector pointDataset, java.lang.String edgeIDField, java.lang.String fromNodeField, java.lang.String toNodeField, java.lang.String nodeIDField, Datasource outputDatasource, java.lang.String networkDatasetName)
          根据点、线数据及其已有的表达弧段结点拓扑关系的字段,构建网络数据集。
static DatasetVector buildNetwork(DatasetVector lineDataset, Datasource outputDatasource, java.lang.String networkDatasetName)
          已过时。 使用 buildNetwork 替代。 通过指定的线数据集、数据源和数据集名称来构建网络模型数据集。
static DatasetVector buildNetwork(DatasetVector lineDataset, java.lang.String[] lineFieldNames, Datasource outputDatasource, java.lang.String networkDatasetName)
          通过线数据集构建网络数据集,可以设置保存的非系统字段。
static NetworkCheckResult check(NetworkCheckParameter parameter, SteppedListener... listeners)
          对交通/设施网络数据集和转向表进行数据检查,返回交通/设施网络分析数据检查结果对象。
static DatasetVector createTurnTable(DatasetVector networkDataset, QueryParameter queryParameter, Datasource outputDatasource, java.lang.String outputDatasetName)
          创建转向表数据集。
static boolean fixRingEdgeErrors(DatasetVector networkDataset, java.util.Collection<java.lang.Integer> errorIDs)
          自动修复环形数据。
static boolean fixRingEdgeErrors(DatasetVector networkDataset, java.util.Collection<java.lang.Integer> errorIDs, java.lang.String edgeIDField, java.lang.String fromNodeIDField, java.lang.String toNodeIDField, java.lang.String nodeIDField)
          自动修复环形数据。
static void removeSteppedListener(SteppedListener l)
          移除一个进度条事件(SteppedEvent)的监听器。
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法详细信息

buildNetwork

@Deprecated
public static DatasetVector buildNetwork(DatasetVector lineDataset,
                                                    Datasource outputDatasource,
                                                    java.lang.String networkDatasetName)
已过时。 使用 buildNetwork 替代。 通过指定的线数据集、数据源和数据集名称来构建网络模型数据集。

参数:
lineDataset - 指定的线数据集。
outputDatasource - 输出数据源。
networkDatasetName - 输出的网络模型数据集的名称。
返回:
新构建的网络模型数据集,矢量数据集类型。
示例:
以下代码示范了如何通过指定的线数据集、数据源和数据集名称来构建网络模型数据集。
 public void BuildNetwork1(DatasetVector lineDataset, Datasource outputDatasource)
        {
            //返回一个合法的名称作为网络模型数据集的名称
            String networkName = outputDatasource.getDatasets().getAvailableDatasetName("BusNet");

            //构建网络模型数据集
            DatasetVector datasetNet = NetworkBuilder.buildNetwork(lineDataset, outputDatasource, networkName);
        }
 

buildNetwork

@Deprecated
public static DatasetVector buildNetwork(DatasetVector[] lineDatasets,
                                                    DatasetVector[] pointDatasets,
                                                    Datasource outputDatasource,
                                                    java.lang.String networkDatasetName,
                                                    NetworkSplitMode networkSplitMode,
                                                    double tolerance)
已过时。 使用 buildNetwork 替代。 通过线数据集数组和点数据集数组构建网络数据集。

参数:
lineDatasets - 指定的线数据集数组。
pointDatasets - 指定的点数据集数组。
outputDatasource - 指定的输出数据源。
networkDatasetName - 指定输出的网络数据集的名称。
networkSplitMode - 指定的打断模式。详细信息请参见 NetworkSplitMode 类。
tolerance - 点数据集中的点是否可以处理为网络上的结点的容限值。
返回:
新构建的网络数据集,矢量数据集类型。
示例:
以下代码示范了如何利用多个线数据集和点数据集构建网络数据集。
 public void BuildNetwork(DatasetVector[] lineDatasets,DatasetVector[] pointDatasets,Datasource outputDatasource)
        {
            //返回一个合法的名称作为网络模型数据集的名称
            String networkName = outputDatasource.getDatasets().getAvailableDatasetName("buildNetwork");

            //构建网络模型数据集
            DatasetVector datasetNet = NetworkBuilder.buildNetwork(lineDatasets, pointDatasets, outputDatasource, networkName, NetworkSplitMode.NONE, 0.5);
        }

buildNetwork

public static DatasetVector buildNetwork(DatasetVector lineDataset,
                                         DatasetVector pointDataset,
                                         java.lang.String edgeIDField,
                                         java.lang.String fromNodeField,
                                         java.lang.String toNodeField,
                                         java.lang.String nodeIDField,
                                         Datasource outputDatasource,
                                         java.lang.String networkDatasetName)
根据点、线数据及其已有的表达弧段结点拓扑关系的字段,构建网络数据集。

当已有的线、点数据集中的线、点对象分别对应着待构建网络的弧段和结点,并具有描述二者空间拓扑关系的信息,即线数据集含有弧段 ID、弧段起始结点 ID 和终止结点 ID 字段,点数据集含有点对象的结点 ID 字段时,可以采用本方法构建三维网络数据集。

使用此方式构建网络数据集成功后,结果对象数与源数据的对象数一致,即线数据中一个线对象作为一个弧段写入,点数据中一个点对象作为一个结点写入,并且保留点、线数据集的所有非系统字段到结果数据集中。

例如,对于用于建立管网而采集的管线、管点数据,管线和管点均使用唯一固定编码来标识。管网的特点之一是管点只位于管线的两端,因此管点对应了待构建管网的所有结点,管线对应了待构建管网的所有弧段,不需要在管线与管线相交处打断。在管线数据中,记录了管线对象两端的管点信息,即起始管点编码和终止管点编码,也就是说管线和管点数据中已经蕴含了二者空间拓扑关系的信息,因此适合使用此方法构建网络数据集。

注意,使用此方式构建的网络数据集的弧段 ID、弧段起始结点 ID、弧段终止结点 ID 和结点 ID 字段即为调用此方法时指定的字段,而不再是 SmEdgeID、SmFNode、SmTNode、SmNodeID 等系统字段(设定的字段类型为文本型除外)。

参数:
lineDataset - 指定的用于构建网络数据集的线数据集。
pointDataset - 指定的用于构建网络数据集的点数据集。
edgeIDField - 指定的线数据集中表示弧段 ID 的字段。如果指定为 null 或空字符串,或指定的字段不存在,则自动使用 SMID 作为弧段 ID。支持 16 位整型、32 位整型和文本字段。当指定字段为文本类型时,弧段ID还是以系统字段SmEdgeID为准,最好是通过 getFieldNameBySign 获取。
fromNodeField - 指定的线数据集中表示弧段的起始结点 ID 的字段。支持 16 位整型、32 位整型和文本字段。当指定字段为文本类型时,弧段的起始结点 ID还是以系统字段SmFNode为准,最好是通过 getFieldNameBySign 获取。
toNodeField - 指定的线数据集中表示弧段的终止结点 ID 的字段。支持 16 位整型、32 位整型和文本字段。当指定字段为文本类型时,弧段的终止结点 ID还是以系统字段SmTNode为准,最好是通过 getFieldNameBySign 获取。
nodeIDField - 指定的点数据集中表示结点 ID 的字段。支持 16 位整型、32 位整型和文本字段。当指定字段为文本类型时,结点 ID还是以系统字段SmNodeID为准,最好是通过 getFieldNameBySign 获取。
outputDatasource - 指定的用于存储结果数据集的数据源。
networkDatasetName - 指定的结果网络数据集的名称。
返回:
构建的网络数据集。

buildFacilityNetworkDirections

public static boolean buildFacilityNetworkDirections(FacilityAnalystSetting facilityAnalystSetting,
                                                     int[] sourceIDs,
                                                     int[] sinkIDs,
                                                     java.lang.String weightName,
                                                     java.lang.String nodeTypeField)
根据指定网络数据集中源与汇的位置,为网络数据集创建流向。创建流向以后的网络数据集才可以进行各种设施网络分析。

设施网络是具有方向的网络,因此,在创建网络数据集之后,必须为其创建流向,才能够用于进行各种设施网络路径分析、连通性分析、上下游追踪等。

流向是指网络中资源流动的方向。网络中的流向由源和汇决定:资源总是从源点流出,流向汇点。该方法通过给定的源和汇,以及设施网络分析参数设置为三维网络数据集创建流向。创建流向成功后,会在网络数据集中写入两方面的信息:流向和结点类型。

参数:
facilityAnalystSetting - 指定的设施网络分析环境设置对象。注意:在构建设施网络流向时,支持设置参数 facilityAnalystSetting 的障碍弧段(BarrierEdges)和障碍结点(BarrierNodes)属性。
sourceIDs - 源对应的网络结点 ID 数组。源与汇都是用来建立网络数据集的流向的。网络数据集的流向与源和汇的位置决定。
sinkIDs - 交汇 ID 数组。汇对应的网络结点 ID 数组。源与汇都是用来建立网络数据集的流向的。网络数据集的流向与源和汇的位置决定。
weightName - 给定的权值字段信息对象的名称,即 WeightFieldInfo.getName() 方法的返回值。
nodeTypeField - 结点类型字段名称,结点类型分为源结点、交汇结点、普通结点。该字段是网络结点数据集中的字段,如果不存在则创建该字段。
返回:
如果创建成功返回 true,否则 false。
示例:
以下代码示范了如何基于网络数据集构建能够用于设施网络分析的网络数据集,即为网络数据集建立流向和等级。下面函数中操作的网络数据集为安装目录\SampleData\City\下的 Changchun.udb 数据源中的名为 RoadNet 的网络数据集。
 public void BuildNetworkForFacilityAnalyst(DatasetVector networkDataset)
        {
            //设置用于建立流向和等级的设施网络分析环境
            FacilityAnalystSetting facilityAnalystSetting = new FacilityAnalystSetting();
            facilityAnalystSetting.setNetworkDataset ( networkDataset);
            facilityAnalystSetting.setDirectionField ("Direction");
            facilityAnalystSetting.setEdgeIDField ("SmID");
            facilityAnalystSetting.setNodeIDField ("SmNodeID");
            facilityAnalystSetting.setFNodeIDField ("SmFNode");
            facilityAnalystSetting.setTNodeIDField ("SmTNode");
            facilityAnalystSetting.setTolerance (0.0015);
            WeightFieldInfo weightFieldInfo = new WeightFieldInfo();
            weightFieldInfo.setName ("Length");
            weightFieldInfo.setFTWeightField ("SmLength");
            weightFieldInfo.setTFWeightField ("SmLength");
            WeightFieldInfos weightFieldInfos = new WeightFieldInfos();
            weightFieldInfos.add(weightFieldInfo);
            facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos);

            //指定用来建立网络流向的源所对应的网络结点
            int[] sourceIDs = new int[] {3534};

            //调用方法为网络数据集建立流向
            boolean isDirectionSuccessful = NetworkBuilder.buildFacilityNetworkDirections(facilityAnalystSetting, sourceIDs, null, "Length", "NodeType");

            //在建立流向的基础上为网络数据集建立等级
            boolean isHierarchiesSuccessful = NetworkBuilder.buildFacilityNetworkHierarchies(facilityAnalystSetting,sourceIDs, null,"Length","Grade",false);
        }

buildFacilityNetworkHierarchies

public static boolean buildFacilityNetworkHierarchies(FacilityAnalystSetting facilityAnalystSetting,
                                                      int[] sourceIDs,
                                                      int[] sinkIDs,
                                                      java.lang.String weightName,
                                                      java.lang.String hierarchyField,
                                                      boolean isLoopValid)
为具有流向的网络数据集创建等级,并在指定的等级字段中写入网络数据集的等级信息。

为网络数据集建立等级,首先,该网络数据集必须已经建立了流向,即建立等级的方法所操作的网络数据集必须具有流向信息,也就是说等级建立方法中的 FacilityAnalystSetting 类型的参数对象中的网络数据集必须指定为已经建立了流向的网络数据集。

等级字段中以整数的形式记录等级,数值从 1 开始,等级越高数值越小,如河流建立等级后,一级河流的等级记录为 1,二级河流的等级记录为 2,以此类推。注意,值为 0 表示未能确定等级,通常是由于该弧段为不连通弧段导致。

参数:
facilityAnalystSetting - 设施网络分析环境设置对象。注意:在构建设施网络等级时,支持设置参数 facilityAnalystSetting 的障碍弧段(BarrierEdges)和障碍结点(BarrierNodes)属性。
sourceIDs - 源 ID 数组。
sinkIDs - 交汇 ID 数组。
weightName - 给定的权值字段信息对象的名称,即 WeightFieldInfo.getName() 方法的返回值。
hierarchyField - 给定的等级字段名称。
isLoopValid - 指定环路是否有效。当该参数为 true 时,环路有效;而当参数为 false 时,环路无效。
返回:
如果创建成功返回 true,否则 false。

createTurnTable

public static DatasetVector createTurnTable(DatasetVector networkDataset,
                                            QueryParameter queryParameter,
                                            Datasource outputDatasource,
                                            java.lang.String outputDatasetName)
创建转向表数据集。

在交通网络分析中,可以使用转向表存储完成转弯需要的花费。转弯是指从一个弧段经过中间结点抵达另外一个邻接弧段的过程。转弯耗费即完成转弯所需要的花费。

转向表是一个纯属性表数据集,每一条记录代表一个转弯,一般有起始弧段字段(FromEdgeID)、终止弧段字段(ToEdgeID)、结点标识字段(NodeID)和转弯耗费字段(TurnCost)四个字段,这些字段与弧段、结点中的字段相关联,表中的每条记录表示一种通过路口的方式以及所需要的耗费。转弯耗费通常是有方向性的,转弯的负耗费值一般为禁止转弯(不通行)。

例如,在对道路进行网络分析的时候,我们经常会遇到十字路口、三岔口等情况,可以通过转向耗费为转弯方式赋予权值,为如何转向提供一定的参考。如某些道路车多或道路状况差,或转向该路段的红灯等待时间较长,花费就应较高一些,而某些道路不通行禁止转入等,可将花费设置为负值。如下图所示,左面为一个十字路口的示意图,右面的表格为该十字路口所对应的转向表,转向表中记录了402结点所在的十字口处车辆的所有转向方式(共16种)和转弯所需的耗费等信息。

注意,使用该方法为网络数据集创建的转向表,其转弯花费(TurnCost 字段)均为 0。用户可根据应用的实际情况对转向表的权值进行修改。对于禁止通行的转弯需要设置权值为负数。

参数:
networkDataset - 指定的网络数据集。
queryParameter - 指定的查询参数。
outputDatasource - 指定的输出数据源。
outputDatasetName - 输出数据集的名称。
返回:
转向表数据集。

buildNetwork

public static DatasetVector buildNetwork(DatasetVector lineDataset,
                                         java.lang.String[] lineFieldNames,
                                         Datasource outputDatasource,
                                         java.lang.String networkDatasetName)
通过线数据集构建网络数据集,可以设置保存的非系统字段。

通过此方法构建网络数据集时,会在线与线相交处打断。

参数:
lineDataset - 指定的用于构建网络数据集的线数据集。
lineFieldNames - 指定的结果网络数据集中需要保存的线数据集非系统字段名称的数组。
outputDatasource - 指定的用于存储结果数据集的数据源。
networkDatasetName - 指定的结果网络数据集的名称。
返回:
构建的网络数据集。

buildNetwork

public static DatasetVector buildNetwork(DatasetVector[] lineDatasets,
                                         DatasetVector[] pointDatasets,
                                         java.lang.String[] lineFieldNames,
                                         java.lang.String[] pointFieldNames,
                                         Datasource outputDatasource,
                                         java.lang.String networkDatasetName,
                                         NetworkSplitMode networkSplitMode,
                                         double tolerance)
通过线数据集数组和点数据集数组(可选)构建网络数据集,可以设置保存的非系统字段及打断模式。

注意:

  1. 线数据集数组必须至少包含一个元素,而点数据集数组是可选的,如果将 pointDatasets 指定为一个空数组,此时,将通过多个线数据集来构建网络数据集。显然,此时无论采用哪种打断方式,都只会在线线相交处打断。
  2. 参与构建的点数据集的点对象不是全部都会添加到网络数据集中,只有在线上的点对象是有效的参与点(点线距离在指定的容限范围内);
  3. 指定了点数据集的保留字段后,只有点数据集的有效参与点的这些字段的值将赋给对应的网络结点,其他结点的相应字段信息为0或空。

参数:
lineDatasets - 指定的用于构建网络数据集的线数据集数组。
pointDatasets - 指定的用于构建网络数据集的点数据集数组。可选。
lineFieldNames - 指定的结果网络数据集中需要保存的线数据集数组中的非系统字段名称的数组。
pointFieldNames - 指定的结果网络数据集中需要保存的点数据集数组中的非系统字段名称的数组。
outputDatasource - 指定的用于存储结果数据集的数据源。
networkDatasetName - 指定的结果网络数据集的名称。
networkSplitMode - 指定的打断模式。
tolerance - 指定的用于判定点是否为网络数据集上的节点的容限值(也可理解为打断容限)。当打断模式为拓扑处理方式(即 NetworkSplitMode.TOPOLOGY_PROCESSING)时,该值即为进行拓扑处理操作所使用的容限值。单位与用于构建网络数据集的点、线数据集的单位相同。
返回:
构建的网络数据集。
抛出:
java.lang.NullPointerException - 如果 lineDatasets 为 null 或长度为 0
java.lang.NullPointerException - 如果 tolerance 小于 0

appendToNetwork

public static boolean appendToNetwork(DatasetVector networkDataset,
                                      DatasetVector[] datasets)
向已有的网络数据集追加数据,可以追加点、线或网络。

网络数据集一般由线数据(以及点数据)构建而成。一旦构建网络的数据发生变化,原有网络就会过时,如果不及时更新网络,就可能影响分析结果的正确性。通过将新增数据追加到原有网络的方式,可以不必重新构建网络而得到较新的网络。如下图所示,某区域新建了若干道路(红色线),将这些道路抽象为线数据,追加到扩建之前所构建的网络上,从而更新了路网。

此方法支持向已有网络追加点、线以及网络数据集,并且可以同时追加多个相同或不同类型的数据集,例如,同时追加一份点数据和两份线数据。注意,如果追加的数据具有多种类型,系统将按照先追加网络,再追加线,最后追加点的顺序来依次追加。下面分别介绍向网络中追加点、线和网络的方式和规则。

注意:

  1. 该方法将直接修改被追加的网络数据集,不会生成新的网络数据集。
  2. 待追加的点、线或网络数据集必须与被追加的网络数据集具有相同的坐标系。
  3. 待追加的点、线或 网络数据集中,如果存在与网络数据集相同(名称和类型都必须相同)的属性字段,那么这些属性值会自动保留到追加后的网络数据集中;如果不存在相同的字段,则不保留。其中,点数据集、网络数据集的结点数据集的属性,保留到被追加网络的结点属性表中;线数据集的属性,保留到被追加网络的弧段属性表中。

参数:
networkDataset - 指定的被追加的网络数据集。
datasets - 指定的待追加的数据,可以是点、线或网络数据集。
返回:
一个布尔值,指示是否追加成功。如果成功,返回 true,否则返回 false。
从以下版本开始:
SuperMap iObjects Java 7.0.0

fixRingEdgeErrors

public static boolean fixRingEdgeErrors(DatasetVector networkDataset,
                                        java.util.Collection<java.lang.Integer> errorIDs)
自动修复环形数据。

环形数据即弧段首尾ID相等,该方法自动将环形数据进行修复,修复方式将线自动打断为两根弧段。但如果用户网络分析需要使用转向表,则有可能需要修改对应的转向表。

参数:
networkDataset - 指定的网络数据集。
errorIDs - 错误结点ID。
返回:
一个布尔值,表示是否修复成功。如果成功,返回 true,否则返回 false。

fixRingEdgeErrors

public static boolean fixRingEdgeErrors(DatasetVector networkDataset,
                                        java.util.Collection<java.lang.Integer> errorIDs,
                                        java.lang.String edgeIDField,
                                        java.lang.String fromNodeIDField,
                                        java.lang.String toNodeIDField,
                                        java.lang.String nodeIDField)
自动修复环形数据。

环形数据即弧段首尾ID相等,该方法自动将环形数据进行修复,修复方式将线自动打断为两根弧段。但如果用户网络分析需要使用转向表,则有可能需要修改对应的转向表。

参数:
networkDataset - 指定的网络数据集。
errorIDs - 错误结点ID。
edgeIDField - 弧段 ID 字段。
fromNodeIDField - 起始结点 ID 字段。
toNodeIDField - 终止结点 ID 字段。
nodeIDField - 结点 ID 字段。
返回:
一个布尔值,表示是否修复成功。如果成功,返回 true,否则返回 false。

check

public static NetworkCheckResult check(NetworkCheckParameter parameter,
                                       SteppedListener... listeners)
对交通/设施网络数据集和转向表进行数据检查,返回交通/设施网络分析数据检查结果对象。

该方法用于对交通/设施网络数据集和转向表进行检查,给出错误信息,便于用户针对错误信息对数据进行修改,以避免由于数据错误导致交通网络分析错误。

注意,该方法需要在设置网络分析环境(setAnalystSetting 方法)之后调用,但不需要加载网络模型(load 方法)。

如果在网络分析环境(TransportationAnalystSetting)中没有指定转向表,则不会检查转向表。

该方法返回一个网络分析数据检查结果(NetworkCheckResult)对象,通过该对象的 getArcErrorInfos 方法和 getNodeErrorInfos 方法可以返回网络数据集的弧段错误信息和结点错误信息;通过 getTurnErrorInfos 方法可以返回转向表的错误信息。错误信息分别存储在三个映射(HashMap)中,键代表错误弧段或结点的 SMID,值代表错误类型。错误类型以数字表示,代表的具体错误含义如下表所示。

  1. 对网络数据集进行检查的结果错误类型如下表所示:
  2. 对转向表进行检查的结果错误类型如下表所示:

参数:
parameter - 网络数据集检查参数。
listeners - 进度信息。
返回:
交通/设施网络分析数据检查结果。

addSteppedListener

public static void addSteppedListener(SteppedListener l)
添加一个进度条事件(SteppedEvent)的监听器。

参数:
l - 一个用于接收进度条事件的监听器。

removeSteppedListener

public static void removeSteppedListener(SteppedListener l)
移除一个进度条事件(SteppedEvent)的监听器。

参数:
l - 一个用于接收进度条事件的监听器。