本文档以某项目水动力模型数据为例,介绍如何将带有时间维度的原始数据导入SuperMap iDesktopX,并生成时序模型瓦片,以及如何在SuperMap iClient3D for WebGL/WebGPU中可视化表达时序模型瓦片。
文档将从以下几个方面分别进行说明:
软件与数据准备章节提供如何准备软件环境和所需数据的要点。
基于水动力模型数据输出的中转数据,数据格式包括*.shp、*.xlsx、*.txt、*csv。
SuperMap GIS支持通过点集+约束面或者三角网+要素两种方式生成时序模型瓦片。目前,通常直接采用SuperMap iDestopX通过点集+约束面方式生成时序模型瓦片。
只能采用SuperMap iObject Java通过三角网+要素方式生成时序模型瓦片,仅该方式支持多要素追加。
点集+约束面方式生成时序模型瓦片是指基于原始的时序点位数据及约束面数据生成S3M瓦片数据。如果原始数据包含点数据和约束面数据,可以将点和面数据导入SuperMap iDesktopX后,直接进行瓦片生成操作。
如果与本应用示例数据一样,原始数据只有约束面数据,可以按照以下操作方法先从面数据中提取点数据,再进行瓦片生成操作。建议根据具体数据情况合理进行操作。
该流程是通过数据导入、坐标设定、类型转换等相关功能,将*.shp格式的原始点位数据导入SuperMap iDesktopX,并转成三维点数据集。具体操作步骤如下:
该流程主要将点数据中多时刻的属性信息写入三维点数据集属性表中。这里是将示例点数据中多时刻的水深信息写入三维点数据集的属性表中。具体操作步骤如下:
注意:
(1)当“模拟结果.txt”里没有点的位置信息时,可以通过上述方法,借助组件代码将“水深”信息导入点数据集。
(2)如果“模拟结果.txt”记录了点的位置信息,可以直接将其导入成点数据集,并通过追加列的方式将不同时刻的水深值储存到属性表中。
注意:
(1)由于原始数据的范围是不规则的,所以生成时序模型瓦片时需要指定瓦片范围进行约束。
(2)生成时序模型瓦片时,必须勾选必要的时序字段。
该流程首先详细说明了包含矢量数据集的已有数据源的数据组成及操作,然后基于SuperMap iObject Java 11.2.0实现了时序模型瓦片生成和多要素追加。具体操作步骤如下:
如果原始数据为NC三角网数据,需要通过自定义开发将NC数据转换为面数据集,并建议将三角网中的点及单个要素信息(例如水深、水温等)存储为单个三维点数据集。
如下图所示的三角面的结点ID分别为28(t1:第一个结点)、43(t2:第二个结点)、42(t3:第三个结点)。
该流程主要介绍如何使用11.2.0及更高版本的SuperMap iObject Java生成时序模型瓦片。主要操作步骤及关键代码如下:
在SuperMap iDesktopX,将章节2中得到的时序模型瓦片数据添加到场景中,并保存场景和工作空间。
SuperMap iServer将上一步骤得到的工作空间发布为三维服务,具体操作见SuperMap iServer帮助文档。
通过代码在SuperMap iClient3D for WebGL/WebGPU加载上一步发布的三维服务,并采用分层设色的方式进行数据的可视化表达。主要参考代码如下:
promise.then(function (layers) { layer = layers[0]; updateLayerHyp(layer); layer.temporalSetting = new SuperMap3D.TemporalSetting(); layer.temporalSetting.location = 0; layer.temporalSetting.changeZValue = true; layer.minTransparentAlpha = 1;
// 更新图层分层设色函数 function updateLayerHyp(layer, colorIndex = 0, step = 24) { // step 颜色表插入的总数 // 图层上的时间总数,11.11 temporalCount,主版本外挂-图层上的时间总数 _temporalInfo let temporalInfo = layer._temporalInfo; temporalCount = temporalInfo.length > 0 ? temporalInfo[colorIndex].count : layer.temporalCount; let minValue = layer._hypMinCategory; let maxValue = layer._hypMaxCategory; let hyp = new SuperMap3D.HypsometricSetting(); hyp.ColorTable = createColorTable(); hyp.DisplayMode = SuperMap3D.HypsometricSettingEnum.DisplayMode.FACE; hyp.Opacity = 1.0; hyp.LineInterval = 1.0; hyp.ColorTableMaxKey = maxValue; hyp.ColorTableMinKey = minValue; //设置非法值颜色 hyp.noValueColor = new SuperMap3D.Color(1.0, 0.0, 0.0, 1); hyp.MaxVisibleValue = maxValue; hyp.MinVisibleValue = minValue; hyp.filterMode = SuperMap3D.HypsometricSettingEnum.FilterMode.NEAREST; layer.hypsometricSetting = { hypsometricSetting: hyp, analysisMode: SuperMap3D.HypsometricSettingEnum.AnalysisRegionMode.ARM_ALL, }; }
// 创建颜色表 function createColorTable(keys, colors, alphas) { let colorTable = new SuperMap3D.ColorTable(); colorTable.insert(0.0, SuperMap3D.Color.fromCssColorString("#00A2FF").withAlpha(0)); colorTable.insert(0.01, SuperMap3D.Color.fromCssColorString("#0082FF").withAlpha(0.3)); colorTable.insert(0.05, SuperMap3D.Color.fromCssColorString("#008CFF").withAlpha(0.50)); colorTable.insert(0.1, SuperMap3D.Color.fromCssColorString("#0096FF").withAlpha(0.70)); colorTable.insert(0.15, SuperMap3D.Color.fromCssColorString("#0096FF").withAlpha(0.70)); colorTable.insert(0.30, SuperMap3D.Color.fromCssColorString("#00B9FF").withAlpha(0.70)); colorTable.insert(0.40, SuperMap3D.Color.fromCssColorString("#00C4FF").withAlpha(0.70)); colorTable.insert(0.48, SuperMap3D.Color.fromCssColorString("#00A0FF").withAlpha(0.80)); colorTable.insert(0.56, SuperMap3D.Color.fromCssColorString("#9AFF00").withAlpha(0.80)); colorTable.insert(0.60, SuperMap3D.Color.fromCssColorString("#00FF8C").withAlpha(0.80)); colorTable.insert(0.64, SuperMap3D.Color.fromCssColorString("#FFC400").withAlpha(0.80)); colorTable.insert(0.72, SuperMap3D.Color.fromCssColorString("#FF7B00").withAlpha(0.80)); colorTable.insert(0.80, SuperMap3D.Color.fromCssColorString("#0089FF").withAlpha(0.80)); colorTable.insert(0.88, SuperMap3D.Color.fromCssColorString("#0089FF").withAlpha(0.80)); colorTable.insert(0.96, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.80)); colorTable.insert(1.04, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.88)); colorTable.insert(1.12, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.90)); colorTable.insert(1.20, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.90)); colorTable.insert(1.28, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.90)); colorTable.insert(1.36, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.90)); colorTable.insert(1.44, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.90)); colorTable.insert(1.52, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.90)); colorTable.insert(1.61, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(0.90)); colorTable.insert(10.97198486328125, SuperMap3D.Color.fromCssColorString("#005CE6").withAlpha(1.0)); return colorTable }
v11i(2024)正式版产品包里我们提供了多时序多要素水场范例可以参考
注意:
(1)如果只在SuperMap iClient3D for WebGL/WebGPU 11.1.1中实现数据可视化,建议使用SuperMap iDesktopX 11.1.1生成时序模型瓦片。
(2)如果在SuperMap iClient3D for WebGL/WebGPU 11.2.0及以上版本中实现数据可视化, SuperMap iDesktopX的版本不受限制。