作者:博哥
北京超图软件股份有限公司
中国•北京
地上地下各类管网、管线是一个城市重要的基础设施,它不仅具有规模大、范围广、管线种类繁多、空间分布复杂、变化大、增长速度快、形成时间长等特点,更重要的它还承担着信息传输、能源输送、污水排放等与人民生活息息相关的重要功能,也是城市赖以生存和发展的物质基础。
随着我国城镇化进程的不断深入,传统的二维管理模式已根本无法满足对管网、管线大数据信息分析、表达、应用的实际需要,三维管线管理逐渐替代二维管理模式。二维系统只有点、线表示管网,系统建设成本并不高,但是在三维场景中,需要使用三维管点模型、管线模型来展示管网系统,模型建设成本较高,管点模型的管口与管线管道的匹配效果差,并且业务属性信息需要从点、线数据集中再次录入到三维模型中,同时维护两套数据而无法满足实时更新的需求。
基于此,超图软件SuperMap GIS 8C版本新增基于二三维一体化技术的自适应管点符号,可由二维的点、线数据集生成三维网络数据集,根据管网走向、管线截面自动实时放样出管点符号模型,快速构建三维场景的同时大幅降低三维管网场景的建设成本,并且提高了三维管线、三维管点的显示性能,系统资源占用减少使得数据承载力大幅提升,进而满足更加庞大复杂的三维管网系统展示、管理及应用。
三维管线场景通常由三维管线和三维管点两类组成,具体包括以下元素:
1) 管线:包括圆管、方沟、管块、竖管等;
2) 管点:包括特征点、井和附属设施三大类;
* 特征点:包括弯头、直通、三通、四通、五通、多通、变径、盖堵、管帽等;
* 井:包括方井、圆井、井室、偏心井、雨篦等;
* 附属设施:包括阀门、水表、消防栓、控制柜、变压器、分线箱等;
不同元素采用不同方式实现快速构建三维管线场景(如图 1三维管线场景组成及展示方式)。通常采用线型符号构建三维管线、自适应管点符号构建三维管点,而部分特殊特征点、井和附属设施采用模型符号展示。其中采用自适应管点符号方式构建特征点是SuperMap GIS 8C新增的功能。
传统的以二维平面展现网络数据的方式,在一定程度上限制了信息的表达,尤其是在复杂的空间位置关系上,从而不可避免地影响了网络分析的准确性和可用性。三维网络是对现实中的网络的真实模拟,而非抽象模拟,因此能够全方位的展现信息。
例如,多层结构的建筑物内的通道数据(包括楼道、楼梯和电梯等),在二维显示上无法直观地区分各楼层的通道,而从三维视图上,则可以清晰直观地了解各个楼层的通道分布情况。再如,种类繁多且纵横交错的城市管网,仅通过二维数据难以清晰地表达管线的实际布设情况。二维数据中相交的两条管线,可能实际上并没有交叉,而只是架设的高度不同。而三维管网则能够直观的表达管线的布设、空间位置关系和拓扑关系,如下图所示。
SuperMap 组件产品使用NetworkBuilder3D类中的BuildNetwork()方法建立三维网络数据集, BuildNetwork重载方法构建三维网络数据集,如下:
方法一:通过具有表达拓扑关系字段的三维点、线数据集构建三维网络数据集。
使用该方法,三维点、线数据集不需要打断。
语法:
public static DatasetVector BuildNetwork(
DatasetVector line3D,
DatasetVector point3D,
string edgeIDField,
string fromNodeField,
string toNodeField,
string nodeIDField,
Datasource outputDatasource,
string networkDatasetName
)
参数说明:
line3D:指定的用于构建三维网络数据集的三维线数据集。
point3D:指定的用于构建三维网络数据集的三维点数据集。
edgeIDField:指定的线数据集中表示弧段 ID 的字段。如果指定为 null 或空字符串,或指定的字段不存在,则自动使用 SMID 作为弧段 ID。仅支持 16 位整型、32 位整型字段。
fromNodeField:指定的线数据集中表示弧段的起始结点 ID 的字段。仅支持 16 位整型、32 位整型字段。
toNodeField:指定的线数据集中表示弧段的终止结点 ID 的字段。仅支持 16 位整型、32 位整型字段。
nodeIDField:指定的点数据集中表示结点 ID 的字段。仅支持 16 位整型、32 位整型字段。
outputDatasource:指定的用于存储结果数据集的数据源。
networkDatasetName:指定的结果三维网络数据集的名称。
返回值说明:
返回构建的三维网络数据集,三维网络数据集属于矢量数据集类型。
方法二:通过线数据集构建三维网络数据集。
语法:
public static DatasetVector BuildNetwork(
DatasetVector line3D,
string[] lineFieldNames,
Datasource outputDatasource,
string networkDatasetName,
NetworkSplitMode3D networkSplitMode,
double tolerance
)
参数说明:
line3D:指定的用于构建三维网络数据集的三维线数据集。
lineFieldNames:指定的结果网络数据集中需要保存的线数据集非系统字段名称的数组。
outputDatasource:指定的用于存储结果三维网络数据集的数据源。
networkDatasetName:指定的结果三维网络数据集的名称。
networkSplitMode:指定的打断模式。此处不允许设置“点打断线”(LineSplitByPoint)模式。
tolerance:指定的打断容限,用于判断两条线是否相交。单位为米。如果一条线的节点到线的距离小于容限,则该点作为网络数据集的一个结点。
返回值说明:
返回构建的三维网络数据集。
注意打断模式设置:
• 打断模式设置为“线线打断,同时点打断线”(LineSplitByPointAndLine)时,在线线相交处打断并添加网络结点;
• 打断模式设置为“不打断”(None),不在任何位置打断,仅在线的两端点添加网络结点;
• 不允许将打断模式设置为“点打断线”(LineSplitByPoint),否则抛出异常。
方法三:通过三维点(可选)、线数据构建三维网络数据集。
语法:
public static DatasetVector BuildNetwork(
DatasetVector line3D,
DatasetVector point3D,
string[] lineFieldNames,
string[] pointFieldNames,
Datasource outputDatasource,
string networkDatasetName,
NetworkSplitMode3D networkSplitMode,
double tolerance
)
参数说明:
line3D:指定的用于构建三维网络数据集的三维线数据集。
point3D:指定的用于构建三维网络数据集的三维点数据集。可选。
lineFieldNames:指定的结果网络数据集中需要保存的三维线数据集非系统字段名称的数组。
pointFieldNames:指定的结果网络数据集中需要保存的三维点数据集非系统字段名称的数组。
outputDatasource:指定的用于存储结果三维网络数据集的数据源。
networkDatasetName:指定的结果三维网络数据集的名称。
networkSplitMode:指定的打断模式。
Tolerance:指定的打断容限,用于判定点是否为网络数据集上的结点。单位为米。如果点到线的距离小于容限,则该点作为网络数据集的一个结点。
返回值说明:
返回构建的三维网络数据集。
注意打断模式设置:
• 打断模式指定为“点打断线”(LineSplitByPoint),则仅在点线相交处打断线,在打断处添加网络结点,意味着仅由点数据来确定网络结点的位置;
• 打断模式指定为“线线打断,同时点打断线”(LineSplitByPointAndLine),则在线线相交处、点线相交处打断线,并在打断处添加网络结点,此时点数据作为线数据的补充;
• 打断模式指定为“不打断”(None),点数据是无效的,且线不会在相交处打断,只在线的端点处添加网络结点。
在SuperMap桌面产品采用构建三维网络和自定义构建三维网络两种方式生成三维网络数据集。
此方式适用于根据三维点和线数据集,或者三维点和网络数据集,或者三维线数据集生成三维网络数据集。
操作步骤:
1) 在“数据”选项卡的“拓扑”组中,单击“拓扑构网”下拉按钮,选择“构建三维网络”,弹出如下图所示的“构建三维网络数据集”对话框。
此方式适用于根据已存在拓扑关系的三维点、线数据集生成三维网络数据集。
操作步骤:
1) 在“数据”选项卡的“拓扑”组中,单击“拓扑构网”下拉按钮,选择“自定义构建三维网络”。弹出如下图所示的“自定义构建三维网络数据集”对话框。
将三维网络数据集加载到三维场景中,通过GeoStyle3D.AltitudeMode 属性将其高度模式设置为AbsoluteUnderGround地下绝对模式,通过设置Scene.Underground属性和GlobalImage. Transparency 属性来开启地下和设置透明度。
桌面操作步骤
1) 选中网络数据集,选择“添加到新的球面场景”中;
2) 分别选中三维网络数据集管线与管点图层,在“风格设置”选项卡中设置图层“高度模式”为绝对高度,如果数据来源于地下,设置“数据来自”地下;
针对三维管线场景中的不同元素,可采用不同方式实现快速构建三维管线场景,通常采用三维线型符号构建三维管线、自适应管点符号构建三维管点,而部分特殊特征点、井和附属设施则采用三维点符号展示。在这一章中主要介绍如何新建三维线型符号、新建自适应管点符号和新建三维点符号。
自适应管点自动生成技术是在SuperMap GIS 8C中新加入的特性,引入该技术可以解决场景中的弯头、三通、四通等管点与管线的匹配问题。由于三维网络数据集保存了结点与哪些弧段相连的拓扑信息,根据这些拓扑信息,结点可以自动生成与管线相接的弯头、三通、四通等管点符号。
SuperMap GIS 8C版本新增SymbolPipeNode类,该类继承于Symbol,表示自适应管点符号,用来改变自适应管点符号的样式。
新增SymbolPipeNodeSetting类,它包含了管点符号的参数名称、参数值、取值范围等,是描述参数的元信息,通过设置“CoverLength”、“SliceNum”两个参数值定义不同种类的管点符号。
• 参数“CoverLength”类型为Double,默认值为“0.015”,表示管点符号的箍的长度,当设置该参数值为“0”时,表示该符号不带箍;
• 参数“SliceNum”类型为Int32,默认值为“1”,表示管点符号弯头的平滑度,数值越大,弯头效果越平滑。
以下代码为组件中实现获取自适应管点参数并设置新值:
SymbolPipeNode m_symbolPipeNode = new SymbolPipeNode();
SymbolPipeNodeSetting [] settings = m_symbolPipeNode.GetSettings();
for (int i = 0; i < settings.Length; i++)
{
SymbolPipeNodeSetting setting = settings[i];
if (setting.Name == “CoverLength”)
{
//取出CoverLength参数的值
Double coverLength = (Double)(setting.Value);
//设置CoverLength参数的值
setting.Value = 0.02;
break;
}
}
桌面操作步骤
1) 在“工作空间管理器”的“资源”双击“点符号库”或右键选择“加载点符号库”,打开“点符号库”对话框;
2) 点击“新建”下拉选择“新建三维自适应符号”,打开“三维自适应管点符号编辑器”对话框;
桌面操作步骤
1) 在“工作空间管理器”的“资源”双击“线型符号库”或右键选择“加载线符号库”,打开“线型符号库”对话框;
2) 点击“新建”下拉选择“新建三维线型”,打开“三维线型符号编辑器”对话框;
桌面操作步骤
1) 在“工作空间管理器”的“资源”双击“点符号库”或右键选择“加载点符号库”,打开“点符号库”对话框;
2) 点击“新建”下拉选择“新建三维符号”,打开“三维点符号编辑器”对话框;
在上一章中已完成了对三维管点、管线符号的创建,接下来将利用这些符号快速构建三维管线场景。
根据实际场景中管线的复杂程度,通过配置管线符号构建三维管线分为两种方式:
1) 通过设置管线图层的图层风格使用一种管线符号;
2) 通过创建自定义专题图使用两种或两种以上的管线符号。
当一个图层的管线所使用的线型符号、颜色、宽度一样,在组件产品中只需要设置图层的符号、线颜色、线宽度,即设置几何对象风格类GeoStyle3D的LineSymbolID、LineColor和LineWidth属性;
注意事项
• 图层上线宽度(GeoStyle3D.LineWidth)的最小值为0.1米,设置更小的值将被当做0.1米处理。
• 如果需要指定比0.1米更小的管线宽度,可使用Layer3DSettingVector类中的SymbolScaleXField和SymbolScaleYField属性控制。这两个属性设置线型符号在横向、纵向缩放比例的字段名称,这个缩放比例存在于数据的属性字段中,可分别设置每条管线的横向、纵向缩放比例。
• 建议使用时指定管线宽度(GeoSyle3D.LineWidth)为1,然后通过SymbolScaleXField和SymbolScaleYField属性控制管线的实际线宽。
桌面操作步骤
1) 选择管线图层,右键选择“图层风格”,打开“线型符号选择器”对话框;
如果一个图层的管线所使用的线型符号、颜色和线宽不同,在组件产品中通过制作三维自定义专题图(Theme3DCustom类)来设置多类型的线型符号。
LineSymbolIDExpression属性:获取或设置对应线型符号编号所在的字段;
LineColorExpression属性: 获取或设置对应线型颜色所在的字段;
LineWidthExpression属性: 获取或设置对应线型宽度所在的字段;建议使用SymbolScaleXField和SymbolScaleYField控制线宽。
桌面操作步骤
1) 选择管线图层,右键选择“制作专题图”,打开“制作专题图”页面;
三维管点分为特征点、井和附属设施三大类别的要素,SuperMap GIS 8C新增采用自适应管点符号方式构建直通、三通、四通、弯头等特征点,而部分特殊特征点、井和附属设施继续采用模型符号展示这类具有复杂结构、特殊外表的管点。
根据实际场景中管点符号的复杂程度,通过配置管点符号构建三维管点分为两种方式:
当一个图层的所有管点使用一种管点符号时,在组件中只需要设置管点图层的图层风格为管点符号即可,即设置几何对象风格类GeoStyle3D.MarkerSymbolID属性。
桌面操作步骤
1) 选择管点图层,右键选择“图层风格”,打开“点符号选择器”对话框;
2) 在“点符号选择器”中选择“三维模型”,选择新建的自适应管点符号;
对于管点图层,井、阀门、变电箱等这一类具有复杂结构、特殊外表的管点,通常采用模型符号。那么如何使得管点图层有的能显示为自适管点,有的显示为模型符号呢?即通过使用三维自定义专题图 (Theme3DCustom类),三维自定义专题图允许用户为图层指定若干字段,利用图层中每个对象的字段值表示这个对象的显示特征,可设置其模型符号、旋转、缩放、颜色等属性。
通过制作自定义专题图,根据符号ID的值显示为不同类型管点,符号ID取值有以下几种情况:
• 当管点为直通、三通、四通、弯头等特征点时,显示为自适应符号,符号ID设为已创建的自适应管点符号ID或设为0;
• 当管点为阀门、消防栓、井等特殊管点时,显示为模型符号,符号ID设为符号库中已存在的模型符号ID;
• 当管点为普通管段时,符号ID设为-1。
注意:由于专题图没有存储网路拓扑关系,使用自定义专题图构建自适应管点时,需要调用接口Layer3D.SetParentLayer()设置管点图层的父图层为对应的管线图层。
桌面操作步骤
1) 选择管点图层,右键选择“制作专题图”,打开“制作专题图”页面;
1) 为什么自适应管点显示不出来?
自适应管点显示不成功的原因大致有以下几点,请检查是否设置正确:
• 检查管点图层和对应的管线图层的高度模式、底部高程是否一致,如果没有,请设置一致;
• 检查是否设置管点图层的父图层。这种问题常见于通过设置自定义专题图图层生成自适应管点,由于专题图没有存储拓扑关系,需要设置其父图层为对应的管线图层,设置完成后刷新图层,自适应管点才能显示。
设置父图层方法:
1)在SuperMap GIS桌面产品中,图层管理器选择该专题图,右击选择“关联图层风格”,弹出的对话框中设置目标图层为对应的管线图层(如图 27 桌面产品中设置“父图层”);
2)在SuperMap GIS组件产品中,则调用Layer3D.SetParentLaye()接口,并检查返回的结果是否为true,设置后需要刷新图层。