类 NetworkBuilder3D
- java.lang.Object
-
- com.supermap.realspace.networkanalyst.NetworkBuilder3D
-
public class NetworkBuilder3D extends Object
三维网络建模类。该类提供三维网络数据集的构建,以及为三维网络数据集创建流向等功能。- 为什么使用三维网络?
- 三维网络数据集的构建方式
- 已有的三维点、线数据不需要打断,并具有表达点线拓扑关系的字段(对应网络数据集的弧段 ID、结点 ID、起始结点 ID 和 终止结点 ID),例如采集管点和管段来建立管网,可以使用
buildNetwork
方法; - 仅由三维线数据集构建,可通过设置打断模式确定是否在线线相交处打断,详见
buildNetwork
方法; - 由三维点(可选)、线数据集共同构建,可通过设置打断模式确定是否在点线相交、线线相交处打断,详见
buildNetwork
方法。 - 创建流向
传统的以二维平面展现网络数据的方式,在一定程度上限制了信息的表达,尤其是在复杂的空间位置关系上,从而不可避免地影响了网络分析的准确性和可用性。三维网络是对现实中的网络的真实模拟,而非抽象模拟,因此能够全方位的展现信息。
例如,多层结构的建筑物内的通道数据(包括楼道、楼梯和电梯等),在二维显示上无法直观地区分各楼层的通道,而从三维视图上,则可以清晰直观地了解各个楼层的通道分布情况。再如,种类繁多且纵横交错的城市管网,仅通过二维数据难以清晰地表达管线的实际布设情况。二维数据中相交的两条管线,可能实际上并没有交叉,而只是架设的高度不同。而三维管网则能够直观的表达管线的布设、空间位置关系和拓扑关系,如下图所示。
三维网络数据集是进行三维网络分析的数据基础。与二维的网络模型相同,三维的网络模型分为三维设施网络模型和三维交通网络模型;同样使用弧段和结点及二者的空间拓扑关系来描述网络。二者的根本区别在于三维网络模型使用(x,y,z)表达空间位置。
本类提供了三种构建网络数据集的方法(三个 buildNetwork 重载方法),满足在不同的数据基础之上构建三维网络数据集:
需要特别强调的是,用于构建三维网络数据集的数据必须具有相同的坐标系,否则构建失败。
为三维网络数据集创建流向之后,才能够进行各种设施网络分析。因为设施网络的重要特点就是具有方向,即介质(水流、电流等)会根据网络本身的规则在网络中流动。详见
buildFacilityNetworkDirections
方法。
-
-
方法概要
所有方法 静态方法 具体方法 已过时的方法 限定符和类型 方法和说明 static void
addSteppedListener(SteppedListener l)
添加一个进度条事件(SteppedEvent
)的监听器。static boolean
buildFacilityNetworkDirections(FacilityAnalystSetting3D facilityAnalystSetting, int[] sourceIDs, int[] sinkIDs, String nodeTypeField)
根据指定的源和汇的位置,为三维网络数据集创建流向。static DatasetVector
buildNetwork(DatasetVector line3D, DatasetVector point3D, String[] lineFieldNames, String[] pointFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance)
通过三维点(可选)、线数据构建三维网络数据集,可以设置保存的非系统字段及打断模式。static DatasetVector
buildNetwork(DatasetVector line3D, DatasetVector point3D, String[] lineFieldNames, String[] pointFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance, SteppedListener... listeners)
通过三维线数据构建三维网络数据集,可以设置保存的非系统字段及打断模式。static DatasetVector
buildNetwork(DatasetVector line3D, DatasetVector point3D, String edgeIDField, String fromNodeField, String toNodeField, String nodeIDField, Datasource outputDatasource, String networkDatasetName)
static DatasetVector
buildNetwork(DatasetVector line3D, DatasetVector point3D, String edgeIDField, String fromNodeField, String toNodeField, String nodeIDField, Datasource outputDatasource, String networkDatasetName, SteppedListener... listeners)
根据三维点、线数据及其已有的表达弧段结点拓扑关系的字段,构建三维网络数据集。static DatasetVector
buildNetwork(DatasetVector line3D, String[] lineFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance)
static DatasetVector
buildNetwork(DatasetVector line3D, String[] lineFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance, SteppedListener... listeners)
通过三维线数据构建三维网络数据集,可以设置保存的非系统字段及打断模式。static NetworkCheckResult3D
check(NetworkCheckParameter3D parameter, SteppedListener... listeners)
对三维网络数据集进行数据检查,返回三维交通/设施网络数据检查结果对象。static boolean
fixRingEdgeErrors(DatasetVector networkDataset, Collection<Integer> errorIDs)
自动修复环形数据。static boolean
fixRingEdgeErrors(DatasetVector networkDataset, Collection<Integer> errorIDs, String edgeIDField, String fromNodeIDField, String toNodeIDField, String nodeIDField)
自动修复环形数据。static void
removeSteppedListener(SteppedListener l)
移除一个进度条事件(SteppedEvent
)的监听器。
-
-
-
方法详细资料
-
buildFacilityNetworkDirections
public static boolean buildFacilityNetworkDirections(FacilityAnalystSetting3D facilityAnalystSetting, int[] sourceIDs, int[] sinkIDs, String nodeTypeField)
根据指定的源和汇的位置,为三维网络数据集创建流向。创建流向以后的三维网络数据集才可以进行各种设施网络分析。设施网络是具有方向的网络,因此,在创建网络数据集之后,必须为其创建流向,才能够用于进行各种设施网络路径分析、连通性分析、上下游追踪等。
流向是指网络中资源流动的方向。网络中的流向由源和汇决定:资源总是从源点流出,流向汇点。该方法通过给定的源和汇, 以及设施网络分析参数设置为三维网络数据集创建流向。创建流向成功后,会在网络数据集中写入两方面的信息:流向和结点类型。
- 流向
- 结点类型
流向信息将写入网络数据集的子线数据集的流向字段中,该字段由
FacilityAnalystSetting3D
类的setDirectionField
方法设置,如果不存在则创建该字段。流向字段的值共有四个:0,1,2,3,其含义如下图所示。以线段 AB 为例:
0 代表流向与数字化方向相同。线段 AB 的数字化方向为 A-->B,且 A 为源点,因此 AB 的流向为从 A 流到 B,即与其数字化方向相同。
1 代表流向与数字化方向相反。线段 AB 的数字化方向为 A-->B,且 A 为汇点,因此 AB 的流向为从 B 流向 A,即与其数字化方向相反。
2 代表不确定流向。A 和 B 均为源点,则资源既可以从 A 流向 B,又可以从 B 流向 A,这就构成了一个不确定流向。
3 代表不连通边,也称未初始化方向。线段 AB 与源点、汇点所在的结点不连通,则称为不连通边。
注:
数字化方向是对象绘制时的方向,即对象的节点序列的方向。
建立流向后,系统还会将结点类型信息写入指定的网络数据集的子点数据集的结点类型字段中。结点类型分为源点、汇点和普通结点。 下表列出了结点类型字段的值及其含义:
- 参数:
facilityAnalystSetting
- 指定的三维设施网络分析环境设置对象。注意:在构建设施网络流向时,参数 facilityAnalystSetting 的障碍弧段(setBarrierEdges)和障碍结点(setBarrierNodes)方法的设置无效, 因为障碍弧段和障碍结点只在进行设施网络相关分析时有效,与网络拓扑结构无关。sourceIDs
- 指定的源对应的网络结点 ID 数组。sinkIDs
- 指定的汇对应的网络结点 ID 数组。nodeTypeField
- 指定的结点类型字段名称。该字段是网络结点数据集中的字段,如果不存在则创建该字段。字段值及其含义见备注部分。- 返回:
- 一个布尔值,代表流向是否创建成功。如果成功,返回 true,否则返回 false。
- 示范代码:
- 以下代码示范了如何为三维线数据集创建流向。
/** * 为三维网络数据集创建流向。 * @param network 指定的要创建流向的三维网络数据集。 */ private void buildFacilityNetworkDirectionsExample(DatasetVector network) { // 设置三维设施网络分析环境 FacilityAnalystSetting3D facilityAnalystSetting = new FacilityAnalystSetting3D(); facilityAnalystSetting.setNetworkDataset(network); facilityAnalystSetting.setDirectionField("direction"); facilityAnalystSetting.setEdgeIDField("SMEDGEID"); facilityAnalystSetting.setNodeIDField("SMNODEID"); facilityAnalystSetting.setFNodeIDField("SMFNODE"); facilityAnalystSetting.setTNodeIDField("SMTNODE"); facilityAnalystSetting.setTolerance(0.001); //由于创建流向不需要权值信息,因此可不设置WeightFieldInfos //但注意加载网络模型以及分析均需要设置权值 WeightFieldInfo3D weightFieldInfo = new WeightFieldInfo3D(); weightFieldInfo.setName("Length"); weightFieldInfo.setFTWeightField("SMLENGTH"); weightFieldInfo.setTFWeightField("SMLENGTH"); WeightFieldInfos3D weightFieldInfos = new WeightFieldInfos3D(); weightFieldInfos.add(weightFieldInfo); facilityAnalystSetting.setWeightFieldInfos(weightFieldInfos); // 指定用来建立网络流向的源所对应的网络结点 int[] sourceIDs = new int[] { 15 }; // 为三维网络数据集创建流向 boolean isSuccessful = NetworkBuilder3D.buildFacilityNetworkDirections(facilityAnalystSetting, sourceIDs, null, "nodeType"); if (isSuccessful) { System.out.println("建立流向成功!"); } else { System.out.println("建立流向失败!"); } }
-
buildNetwork
public static DatasetVector buildNetwork(DatasetVector line3D, DatasetVector point3D, String edgeIDField, String fromNodeField, String toNodeField, String nodeIDField, Datasource outputDatasource, String networkDatasetName, SteppedListener... listeners)
根据三维点、线数据及其已有的表达弧段结点拓扑关系的字段,构建三维网络数据集。输入的线和点数据集类型需要一致,即三维线数据集需要对应三维点数据集,山维线EPS数据集需要对应山维点EPS数据集。
当已有的三维线、三维点数据集中的线、点对象分别对应着待构建网络的弧段和结点,并具有描述二者空间拓扑关系的信息,即三维线数据集含有弧段 ID、弧段起始结点 ID 和终止结点 ID 的字段信息,三维点数据集含有点对象的结点 ID 字段信息时,可以采用本方法构建三维网络数据集。
使用此方式构建三维网络数据集成功后,结果对象数与源数据的对象数一致,即线数据中一个线对象作为一个弧段写入,点数据中一个点对象作为一个结点写入,并且保留点、线数据集的所有非系统字段到结果数据集中。
例如,对于用于建立管网而采集的管线、管点数据,管线和管点均使用唯一固定编码来标识。管网的特点之一是管点只位于管线的两端,因此管点对应了待构建管网的所有结点,管线对应了待构建管网的所有弧段,不需要在管线与管线相交处打断。在管线数据中,记录了管线对象两端的管点信息,即起始管点编码和终止管点编码,也就是说管线和管点数据中已经蕴含了二者空间拓扑关系的信息,因此适合使用此方法构建三维网络数据集。
需要强调的是,由于完全按照已有的弧段和结点信息构建,因此,无法避免结果网络数据集出现拓扑错误的情况,故应对构建的网络数据集进行数据检查,并根据错误信息对源数据进行修改,修改完成后再次构建新的三维网络数据集。
FacilityAnalyst3D
类的check
方法和TransportationAnalyst3D
类的check
方法分别用于三维设施网络分析和三维交通网络分析的网络数据集进行检查。注意:
- 用于构建网络的三维点、线数据集必须具有相同的坐标系。
- 使用此方式构建的网络数据集的弧段 ID、弧段起始结点 ID、弧段终止结点 ID 和结点 ID 字段即为调用此方法时指定的字段,而不再是 SMEDGEID、SmFNode、SmTNode、SMNODEID 等系统字段。
- 参数:
line3D
- 指定的用于构建三维网络数据集的三维线数据集。可以是三维线数据集和山维线EPS数据集。point3D
- 指定的用于构建三维网络数据集的三维点数据集。可以是三维点数据集和山维点EPS数据集。edgeIDField
- 指定的线数据集中表示弧段 ID 的字段。如果指定为 null 或空字符串,或指定的字段不存在,则自动使用 SMID 作为弧段 ID。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。fromNodeField
- 指定的线数据集中表示弧段的起始结点 ID 的字段。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。toNodeField
- 指定的线数据集中表示弧段的终止结点 ID 的字段。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。nodeIDField
- 指定的点数据集中表示结点 ID 的字段。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。outputDatasource
- 指定的用于存储结果数据集的数据源。networkDatasetName
- 指定的结果三维网络数据集的名称。listeners
- 用于接收进度条事件的监听器。- 返回:
- 构建的三维网络数据集。
- 抛出:
IllegalArgumentException
- 如果 lineDataset 参数指定的数据集的类型不是 Line3D,或 pointDataset 参数指定的数据集的类型不是 Point3DIllegalArgumentException
- 如果 edgeIDField、nodeIDField、fromNodeField、toNodeField 参数指定的字段的类型不是 Int16 或 Int32IllegalArgumentException
- 如果 nodeIDField、fromNodeField、toNodeField 指定的字段不存在- 示范代码:
- 以下代码示范了如何根据三维点、三维线数据集,以及其中的弧段、结点信息字段构建三维网络数据集。
假设在数据源“datasource”中存在一个名为“PipeLine3D”的三维线数据集、一个名为“PipePoint3D”的三维点数据集,并且在“PipeLine3D”的属性表中 有记录了弧段 ID 的字段“EdgeID”、记录了弧段起始结点 ID 的字段“FromNodeID”、记录了弧段终止 ID 的字段“ToNodeID”,在“PipePoint3D”的属性表中有记录了结点 ID 的字段“NodeID”,这四个字段描述了弧段(即线对象)与结点(即点对象)之间的拓扑关系。
private void buildNetworkExample(Datasource datasource) { // 获取用于构建三维网络数据集的三维线数据集和三维点数数据集 DatasetVector lineDataset = (DatasetVector) datasource.getDatasets().get("PipeLine3D"); DatasetVector pointDataset = (DatasetVector) datasource.getDatasets().get("PipePoint3D"); // 获取一个合法的名称作为结果网络数据集的名称 String networkName = datasource.getDatasets().getAvailableDatasetName("PipeNet"); // 构建三维网络数据集 DatasetVector resultNetwork = NetworkBuilder3D.buildNetwork( lineDataset, pointDataset, "EdgeID", "FromNodeID", "ToNodeID", "NodeID", datasource, networkName); }
-
buildNetwork
@Deprecated public static DatasetVector buildNetwork(DatasetVector line3D, DatasetVector point3D, String edgeIDField, String fromNodeField, String toNodeField, String nodeIDField, Datasource outputDatasource, String networkDatasetName)
已过时。 此方法已废弃,请使用支持进度监听的新方法NetworkBuilder3D.buildNetwork(DatasetVector, DatasetVector, String, String, String, String, Datasource, String, SteppedListener...)
替换。根据三维点、线数据及其已有的表达弧段结点拓扑关系的字段,构建三维网络数据集。输入的线和点数据集类型需要一致,即三维线数据集需要对应三维点数据集,山维线EPS数据集需要对应山维点EPS数据集。
当已有的三维线、三维点数据集中的线、点对象分别对应着待构建网络的弧段和结点,并具有描述二者空间拓扑关系的信息,即三维线数据集含有弧段 ID、弧段起始结点 ID 和终止结点 ID 的字段信息,三维点数据集含有点对象的结点 ID 字段信息时,可以采用本方法构建三维网络数据集。
使用此方式构建三维网络数据集成功后,结果对象数与源数据的对象数一致,即线数据中一个线对象作为一个弧段写入,点数据中一个点对象作为一个结点写入,并且保留点、线数据集的所有非系统字段到结果数据集中。
例如,对于用于建立管网而采集的管线、管点数据,管线和管点均使用唯一固定编码来标识。管网的特点之一是管点只位于管线的两端,因此管点对应了待构建管网的所有结点,管线对应了待构建管网的所有弧段,不需要在管线与管线相交处打断。在管线数据中,记录了管线对象两端的管点信息,即起始管点编码和终止管点编码,也就是说管线和管点数据中已经蕴含了二者空间拓扑关系的信息,因此适合使用此方法构建三维网络数据集。
需要强调的是,由于完全按照已有的弧段和结点信息构建,因此,无法避免结果网络数据集出现拓扑错误的情况,故应对构建的网络数据集进行数据检查,并根据错误信息对源数据进行修改,修改完成后再次构建新的三维网络数据集。
FacilityAnalyst3D
类的check
方法和TransportationAnalyst3D
类的check
方法分别用于三维设施网络分析和三维交通网络分析的网络数据集进行检查。注意:
- 用于构建网络的三维点、线数据集必须具有相同的坐标系。
- 使用此方式构建的网络数据集的弧段 ID、弧段起始结点 ID、弧段终止结点 ID 和结点 ID 字段即为调用此方法时指定的字段,而不再是 SMEDGEID、SmFNode、SmTNode、SMNODEID 等系统字段。
- 参数:
line3D
- 指定的用于构建三维网络数据集的三维线数据集。可以是三维线数据集和山维线EPS数据集。point3D
- 指定的用于构建三维网络数据集的三维点数据集。可以是三维点数据集和山维点EPS数据集。edgeIDField
- 指定的线数据集中表示弧段 ID 的字段。如果指定为 null 或空字符串,或指定的字段不存在,则自动使用 SMID 作为弧段 ID。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。fromNodeField
- 指定的线数据集中表示弧段的起始结点 ID 的字段。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。toNodeField
- 指定的线数据集中表示弧段的终止结点 ID 的字段。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。nodeIDField
- 指定的点数据集中表示结点 ID 的字段。仅支持 16 位整型、32 位整型字段、64位整型字段、文本型字段、宽字符类型字段、字符型字段。outputDatasource
- 指定的用于存储结果数据集的数据源。networkDatasetName
- 指定的结果三维网络数据集的名称。- 返回:
- 构建的三维网络数据集。
-
buildNetwork
public static DatasetVector buildNetwork(DatasetVector line3D, String[] lineFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance, SteppedListener... listeners)
通过三维线数据构建三维网络数据集,可以设置保存的非系统字段及打断模式。该方法仅通过三维线数据集来构建三维网络,需要注意打断模式的设置:
- 打断模式设置为
LINE_SPLIT_BY_POINT_AND_LINE
时,在线线相交处打断并添加网络结点; - 打断模式设置为
NONE
,不在任何位置打断,仅在线的两端点添加网络结点; - 不允许将打断模式设置为
LINE_SPLIT_BY_POINT
,否则抛出异常。
- 参数:
line3D
- 指定的用于构建三维网络数据集的三维线数据集。lineFieldNames
- 指定的结果网络数据集中需要保存的线数据集非系统字段名称的数组。outputDatasource
- 指定的用于存储结果三维网络数据集的数据源。networkDatasetName
- 指定的结果三维网络数据集的名称。networkSplitMode
- 指定的打断模式。注意,此时不允许设置“点打断线”(LINE_SPLIT_BY_POINT
)模式。tolerance
- 指定的打断容限,用于判断两条线是否相交。单位为米。如果一条线的节点到线的距离小于容限,则该点作为网络数据集的一个结点。listeners
- 用于接收进度条事件的监听器。- 返回:
- 构建的三维网络数据集。
- 打断模式设置为
-
buildNetwork
@Deprecated public static DatasetVector buildNetwork(DatasetVector line3D, String[] lineFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance)
已过时。 此方法已废弃,请使用支持进度监听的新方法NetworkBuilder3D.buildNetwork(DatasetVector, DatasetVector, String[], String[], Datasource, String, NetworkSplitMode3D, double, SteppedListener...)
替换。通过三维线数据构建三维网络数据集,可以设置保存的非系统字段及打断模式。该方法仅通过三维线数据集来构建三维网络,需要注意打断模式的设置:
- 打断模式设置为
LINE_SPLIT_BY_POINT_AND_LINE
时,在线线相交处打断并添加网络结点; - 打断模式设置为
NONE
,不在任何位置打断,仅在线的两端点添加网络结点; - 不允许将打断模式设置为
LINE_SPLIT_BY_POINT
,否则抛出异常。
- 参数:
line3D
- 指定的用于构建三维网络数据集的三维线数据集。lineFieldNames
- 指定的结果网络数据集中需要保存的线数据集非系统字段名称的数组。outputDatasource
- 指定的用于存储结果三维网络数据集的数据源。networkDatasetName
- 指定的结果三维网络数据集的名称。networkSplitMode
- 指定的打断模式。注意,此时不允许设置“点打断线”(LINE_SPLIT_BY_POINT
)模式。tolerance
- 指定的打断容限,用于判断两条线是否相交。单位为米。如果一条线的节点到线的距离小于容限,则该点作为网络数据集的一个结点。- 返回:
- 构建的三维网络数据集。
- 打断模式设置为
-
buildNetwork
public static DatasetVector buildNetwork(DatasetVector line3D, DatasetVector point3D, String[] lineFieldNames, String[] pointFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance, SteppedListener... listeners)
通过三维线数据构建三维网络数据集,可以设置保存的非系统字段及打断模式。该方法仅通过三维线数据集来构建三维网络,需要注意打断模式的设置:
- 打断模式设置为
LINE_SPLIT_BY_POINT_AND_LINE
时,在线线相交处打断并添加网络结点; - 打断模式设置为
NONE
,不在任何位置打断,仅在线的两端点添加网络结点; - 不允许将打断模式设置为
LINE_SPLIT_BY_POINT
,否则抛出异常。
- 参数:
line3D
- 指定的用于构建三维网络数据集的三维线数据集。lineFieldNames
- 指定的结果网络数据集中需要保存的线数据集非系统字段名称的数组。outputDatasource
- 指定的用于存储结果三维网络数据集的数据源。networkDatasetName
- 指定的结果三维网络数据集的名称。networkSplitMode
- 指定的打断模式。注意,此时不允许设置“点打断线”(LINE_SPLIT_BY_POINT
)模式。tolerance
- 指定的打断容限,用于判断两条线是否相交。单位为米。如果一条线的节点到线的距离小于容限,则该点作为网络数据集的一个结点。listeners
- 用于接收进度条事件的监听器。- 返回:
- 构建的三维网络数据集。
- 抛出:
IllegalArgumentException
- 如果 lineDataset 参数指定的数据集的类型不是 Line3DIllegalArgumentException
- 如果 networkSplitMode 参数指定为 NetworkSplitMode3D.LINE_SPLIT_BY_POINT LINE_SPLIT_BY_POINTIllegalArgumentException
- 如果 tolerance 小于 0- 示范代码:
- 以下代码示范了如何根据一个三维线数据集构建三维网络数据集。
假设在数据源“datasource”中存在一个名为“Roads3D”的三维线数据集,要求构建时在线线相交处打断,并保留线数据集的“Color”、“Radius”和“Coefficient”三个属性字段到结果网络数据集中。
private void buildNetworkExample(Datasource datasource) { // 获取用于构建三维网络数据集的三维线数据集 DatasetVector lineDataset = (DatasetVector) datasource.getDatasets().get("Roads3D"); // 获取一个合法的名称作为结果网络数据集的名称 String networkName = datasource.getDatasets().getAvailableDatasetName("RoadNet"); // 构建三维网络数据集 DatasetVector resultNetwork = NetworkBuilder3D.buildNetwork( lineDataset, new String[] { "Color", "Radius", "Coefficient" }, datasource, networkName, NetworkSplitMode3D.LINE_SPLIT_BY_POINT_AND_LINE, 0.02); }
- 打断模式设置为
-
buildNetwork
public static DatasetVector buildNetwork(DatasetVector line3D, DatasetVector point3D, String[] lineFieldNames, String[] pointFieldNames, Datasource outputDatasource, String networkDatasetName, NetworkSplitMode3D networkSplitMode, double tolerance)
通过三维点(可选)、线数据构建三维网络数据集,可以设置保存的非系统字段及打断模式。使用本方法构建三维网络数据集,必须指定三维线数据集,而三维点数据集是可选的。要获得符合需求的网络数据集,还需要注意打断模式的设置,打断模式直接影响着网络结点和弧段的确定:
- 打断模式指定为“点打断线”(
LINE_SPLIT_BY_POINT
),则仅在点线相交处打断线,在打断处添加网络结点,意味着仅由点数据来确定网络结点的位置; - 打断模式指定为“线线打断,同时点打断线”(
LINE_SPLIT_BY_POINT_AND_LINE
),则在线线相交处、点线相交处打断线,并在打断处添加网络结点,此时点数据作为线数据的补充,确定仅由线数据无法确定的那部分网络结点; - 打断模式指定为“不打断”(
NONE
),点数据是无效的,且线不会在相交处打断,只在线的端点处添加网络结点。
图:点线构建网络数据集
注意:
- 参与构建的三维点数据集的点对象不是全部都会添加到网络数据集中,只有在线上的点对象是有效的参与点(点线距离在指定的容限范围内);
- 指定了三维点数据集的保留字段后,只有有效参与点的这些字段的值将赋给对应的网络结点,其他结点的相应字段信息为0或空。
注意:用于构建网络的三维点、线数据集必须具有相同的坐标系。
- 参数:
line3D
- 指定的用于构建三维网络数据集的三维线数据集。point3D
- 指定的用于构建三维网络数据集的三维点数据集。可选。lineFieldNames
- 指定的结果网络数据集中需要保存的线数据集非系统字段名称的数组。pointFieldNames
- 指定的结果网络数据集中需要保存的点数据集非系统字段名称的数组。outputDatasource
- 指定的用于存储结果三维网络数据集的数据源。networkDatasetName
- 指定的结果三维网络数据集的名称。networkSplitMode
- 指定的打断模式。tolerance
- 指定的打断容限,用于判定点是否为网络数据集上的结点。单位为米。如果点到线的距离小于容限,则该点作为网络数据集的一个结点。- 返回:
- 构建的三维网络数据集。
- 抛出:
IllegalArgumentException
- 如果 lineDataset 参数指定的数据集的类型不是 Line3D,或 pointDataset 参数指定的数据集的类型不是 Point3DIllegalArgumentException
- 如果 tolerance 小于 0- 示范代码:
- 以下代码示范了如何根据一个三维线数据集和一个三维点数据集来构建三维网络数据集。
假设在数据源“datasource”中存在一个名为“Roads3D”的三维线数据集,一个名为“Devices3D”的三维点数据集,要求构建时在点与线相交处打断,并保留线数据集的“Color”、“Radius”和“Coefficient”,点数据集的“Date”、“Owner”属性字段到结果网络数据集中。
private void buildNetworkExample(Datasource datasource) { // 获取用于构建三维网络数据集的三维线数据集和三维点数数据集 DatasetVector lineDataset = (DatasetVector) datasource.getDatasets().get("Roads3D"); DatasetVector pointDataset = (DatasetVector) datasource.getDatasets().get("Devices3D"); // 获取一个合法的名称作为结果网络数据集的名称 String networkName = datasource.getDatasets().getAvailableDatasetName("DevicesNet"); // 构建三维网络数据集 DatasetVector resultNetwork = NetworkBuilder3D.buildNetwork( lineDataset, pointDataset, new String[] { "Color", "Radius", "Coefficient" }, new String[] { "Date", "Owner" }, datasource, networkName, NetworkSplitMode3D.LINE_SPLIT_BY_POINT_AND_LINE, 0.02); }
- 打断模式指定为“点打断线”(
-
fixRingEdgeErrors
public static boolean fixRingEdgeErrors(DatasetVector networkDataset, Collection<Integer> errorIDs)
自动修复环形数据。环形数据即弧段首尾ID相等,该方法自动将环形数据进行修复,修复方式将线自动打断为两根弧段。但如果用户网络分析需要使用转向表,则有可能需要修改对应的转向表。
- 参数:
networkDataset
- 指定的网络数据集。errorIDs
- 错误结点ID。- 返回:
- 一个布尔值,表示是否修复成功。如果成功,返回 true,否则返回 false。
-
fixRingEdgeErrors
public static boolean fixRingEdgeErrors(DatasetVector networkDataset, Collection<Integer> errorIDs, String edgeIDField, String fromNodeIDField, String toNodeIDField, String nodeIDField)
自动修复环形数据。环形数据即弧段首尾ID相等,该方法自动将环形数据进行修复,修复方式将线自动打断为两根弧段。但如果用户网络分析需要使用转向表,则有可能需要修改对应的转向表。
- 参数:
networkDataset
- 指定的网络数据集。errorIDs
- 错误结点ID。edgeIDField
- 弧段 ID 字段。fromNodeIDField
- 起始结点 ID 字段。toNodeIDField
- 终止结点 ID 字段。nodeIDField
- 结点 ID 字段。- 返回:
- 一个布尔值,表示是否修复成功。如果成功,返回 true,否则返回 false。
-
check
public static NetworkCheckResult3D check(NetworkCheckParameter3D parameter, SteppedListener... listeners)
对三维网络数据集进行数据检查,返回三维交通/设施网络数据检查结果对象。该方法用于对三维交通/设施网络数据集进行检查,给出错误信息,便于用户针对错误信息对数据进行修改,以避免由于数据错误导致网络分析错误。
该方法返回一个三维交通网络分析数据检查结果(NetworkCheckResult3D)对象,通过该对象的
getArcErrorInfos
方法和getNodeErrorInfos
方法可以获取弧段错误信息和结点错误信息。错误信息存储在字典中,键代表错误弧段或结点的 SMID,值代表错误类型。错误类型以数字表示,代表的具体错误含义如下表所示。- 参数:
parameter
- 网络数据集检查参数。listeners
- 进度信息。- 返回:
- 三维交通网络分析数据检查结果。
-
addSteppedListener
public static void addSteppedListener(SteppedListener l)
添加一个进度条事件(SteppedEvent
)的监听器。- 参数:
l
- 一个用于接收进度条事件的监听器。
-
removeSteppedListener
public static void removeSteppedListener(SteppedListener l)
移除一个进度条事件(SteppedEvent
)的监听器。- 参数:
l
- 一个用于接收进度条事件的监听器。
-
-
Copyright © 2021–2024 SuperMap. All rights reserved.