一、TIN地形数据简介
SuperMap GIS中的三维地形切片一般有两种,DEM地形和TIN(不规则三角网),它们是表示数字高程模型的两种方法。DEM地形是普通地形切片,没有TIN地形的特征点多,生成时间比TIN要快,适用于只作展示的场景。TIN(Triangulated Irregular Network) 指不规则三角网,是针对连续三维空间的不规则划分,其最小单元为不规则三角形。TIN 可以减少数据冗余,表达经度更高,同时在计算效率方面比较有优势,在地理信息系统中有广泛应用。 如交通,道路、桥梁、隧道设计、施工;水利,水利设施、水利发电等;城市建筑,施工、填挖方等。
TIN(不规则三角网)
(左图是TIN地形数据添加到球面场景效果,右图是TIN地形添加到球面场景,对TIN地形图层右键属性里设置填充轮廓的效果)
二、TIN地形数据格式
TIN地形是由栅格数据集(Grid规则格网)切三维缓存而来,格式为.sct。
SCT(SuperMap Cache Terrain)三维地形缓存文件,是SuperMap自己的一种文件格式,是将数据量大的地形数据预处理形成缓存目录。
数据量大的地形数据按照全球格网剖分模型,采用四叉树剖分法对大数据量的地形数据进行分层分块。
1.SuperMap的四叉树格网是按经纬网建立的全球统一格网剖分模型,范围上从经度-180度到180度分成列,从纬度-90度到90度分成行,随着视点的移动缩放,格网也就一分为四按四叉树分割原理进行分割,行列数各扩大2倍。
2.对于地形数据,SuperMap分割的数据是合法的SuperMap Dem经纬度数据集,最精细层数据(最大分辨率)满足的150*150像素的尺寸大小,每个文件都是二进制bit流组成的*.bil格式文件,大小是44KB。分层分块后所得的每一个bil文件的编号为这个文件所在全球格网的行列号。
3.保存分层分块数据的缓存目录结果,类似金字塔。
层:存放数据的根节点,每层存放了不同比例尺下的数据;
行列:按照全球统一格网对球体进行剖分,会将球体剖分成N行2N列,行列号也组成了每个数据文件的名字。
4.形成缓存目录后,在缓存目录中同时生成的一个文件,该文件对生成的缓存进行了详细描述。例如缓存层数、缓存地理范围、缓存文件类型等,而这个文件就是SCT文件,该文件可以使用文本编辑器打开浏览。系统通过加载SCT文件,获得缓存信息,从而将预处理后的地形数据作为一个图层显示在三维场景窗口中,我们称该图层为地形图层。
其中,预处理生成的缓存文件扩展名为*.bil。
追根溯源,下图列出了SuperMap支持导入的栅格文件格式:
三、TIN地形数据处理
3.1 导入数据集
数据源右键——【导入数据集】,会弹出如下图参数框,可进行设置。
编码类型:对Grid栅格数据,可以采用四种压缩编码方式,即 DCT、SGL、LZW 和 复合编码。其中 DCT 和复合编码为有损压缩编码方式,SGL和LZW为无损压缩编码方式。
- 注意:栅格数据集只支持LZW、SGL,当原编码方式为DCT、复合编码时,可选择SGL的编码方式。8位影像的非灰色度调色板不支持DCT编码,可转为LZW的编码方式。
数据集类型:设置导入数据的类型。导入栅格数据的结果类型有影像数据集和栅格数据集2个选项供用户选择。选择“影像数据集”项,则将数据文件导入为影像数据集;选择“栅格数据集”项,则将数据文件导入为 GRID 数据集。
波段导入模式:用于设置在导入多波段影像数据,如 Erdas Image 文件(*.img)和 TIFF 文件(*.tif)时,影像数据的波段导入模式。系统提供了多波段、多个单波段和合成波段3种方式。 多个单波段:将多波段数据导入为一个单波段数据集。
多波段:将多波段数据导入为一个多波段数据集。在多波段数据集的属性窗口中,定位到图像属性项,可以查看其波段表信息。
合成波段:将多波段数据导入为一个单波段数据集。合成后的数据集只有一个波段。注意:目前此导入模式只适用于将8位多波段的数据导入为一个24位或者32位的单波段数据集。
创建影像金字塔:勾选该复选框,在导入影像数据时,将对导入数据创建影像金字塔。
坐标参考文件:在导入影像文件(仅对 tif 文件有效)时,可以导入*.tfw 坐标参考文件。
3.2 生成TIN地形缓存
工作空间管理器里选中栅格数据集,右键【生成缓存】,弹出生成场景缓存对话框,见下图:
- 数据列表区域:
数据集:显示了用于生成TIN地形缓存的数据集名称。
数据源:显示了用于生成TIN地形缓存的数据集所在的数据源的名称。
缓存类型:显示了所要生成的三维缓存的类型,在此为“TIN地形”。缓存类型为下拉按钮,下拉列表中列出了所选数据所支持的所有缓存类型,用户可从中进行选择。
场景类型:场景类型分为球面和平面,如果栅格数据集是投影坐标系,场景类型既可以选择平面也可以选择球面,根据自己的项目场景定。如果栅格数据集是地理坐标系,场景类型只能选择球面。
2.TIN地形缓存参数的设置:
缓存名称:在“缓存名称”右侧的文本框中输入缓存名称,即缓存根目录的名称。
缓存路径:在“缓存路径”右侧的文本框中输入缓存的输出路径,可以为本地路径,也可以为网络路径。用户还可以通过文本框后的“浏览”按钮来选择路径。
存储类型:系统提供了3种缓存类型,紧凑、原始和块存储。紧凑表示采用一定的压缩,在建立缓存时对数据进行压缩。原始表示不对数据进行压缩,保留数据的原始信息。块存储表示将数据存储在固定长度的块中。 若生成块存储类型的地形(TIN)缓存,不支持低版本兼容。
块大小(像素):提供32*32,64*64以及128*128,默认为64*64。
开始层、结束层:自动获取层编号,开始层和结束层均可修改,底层根据数据精度获取层的范围,修改层级的值不可超过此范围。
精细层误差:直接在文本框内输入误差数值,结束层级一致时,误差值越小越精细,单位为米。
线程数:设置参与生成缓存的线程数,使缓存生成更加高效。
缓存时是否进行压缩:默认勾选“压缩”复选框,用户可自行决定是否勾选。
是否生成带法线:默认不勾选“带法线”复选框,用户可自行决定是否勾选。
高精度:默认勾选“压缩”复选框,仅高精度的TIN数据支持TIN的相关运算操作,例如提取三维数据(TIN)。
保留精度值:默认不勾选“带法线”复选框,保留原始数据精度值,勾选后结束层和精细层误差都会改变。主要是针对精度值比较高的DEM数据。
3.设置“瓦片范围”。在“瓦片范围”区域进行设置,有下面两种方式:
*勾选“默认”复选框,默认采用数据集的范围,左上右下四个文本框显示了系统默认范围。
*不勾选“默认”复选框,用户可自定义范围。有两种方式,一种是通过选择范围数据集,取选择的数据集的范围。另一种是直接在左上右下四个文本框中输入范围值。
4.默认勾选“显示进度条”,单击“生成”按钮,执行TIN地形缓存生成操作。每个TIN地形缓存单独存放在一个文件夹下,其中 *.sct 为缓存配置文件。
3.3 IDesktop场景加载TIN地形
工作空间管理器中选中场景,右键新建球面场景,【图层管理器】——【地形图层】——【添加地形缓存】,打开三维缓存文件,选择本地的.sct文件,点击【打开】,双击地形图层定位即可。
3.4 发布服务
参考文章地址:SuperMap GIS发布三维服务流程
3.5 WebGL场景加载
3.5.1 viewer初始化加载
viewer初始化加载时,URL地址为:http://localhost:8090/iserver/services/3D-XXX/rest/realspace/datas/XXX1,这里支持以上三种数据类型发布服务得到的URL地址。
关键代码:
var viewer = new Cesium.Viewer('cesiumContainer',{
//创建地形服务提供者的实例,url为SuperMap iServer发布的TIN地形服务
terrainProvider : new Cesium.CesiumTerrainProvider({
url : 'http://localhost:8090/iserver/services/3D-mongodb-DEM25BeijingDEM1010/rest/realspace/datas/BeijingDEM1010',
isSct : true,//地形服务源自SuperMap iServer发布时需设置isSct为true
invisibility:true
}),
});
3.5.2 scene.open加载
scene.open加载时,URL地址为:http://localhost:8090/iserver/services/3D-XXX/rest/realspace,这里仅支持以工作空间形式发布服务的URL地址,因为该方式发布的服务scenes下有场景有图层。反之,如果scenes节点下没有任何scene或者layers节点下没有任何layer,那scene.open是加载不出来任何图层的。
关键代码:
var viewer = new Cesium.Viewer('cesiumContainer');
var scene = viewer.scene;
var promise=scene.open("http://localhost:8090/iserver/services/3D-DiXingYingXiang1010/rest/realspace");
四、可能遇到的报错及解决方案
问题一:多个TIN地形合并后,生成的地形带有黑块
- 问题分析:TIN地形所对应的原始数据栅格数据,它们的无效值(空值)不一致。
- 解决方案:
思路:
1、导入 TIF 文件时,选择栅格数据集类型,勾选创建影像金字塔;
2、选中栅格数据集,右键查看栅格数据集的属性,发现其空值并不是-9999;
3、在该项目中,要对多个栅格生成的 TIN 地形进行合并,要求其空值统一为-9999,因此直接修改属性中的空值为-9999;
4、将栅格数据集添加到地图中,查询无效区域的栅格值,发现其空值不是-9999,需要将其转变为新的空值:-9999;
5、通过代数运算里面的 con 函数进行重新赋值,得到一个新的栅格数据集,并重新计算新栅格数据集的极值。此处 con 函数的作用是把小于-9999 的值(浅绿色区域)改为-9999,其它地方不变。
主要操作步骤:在菜单【数据】——【数据处理】——【栅格】——【代数运算】,通过代数运算Con函数实现,如Con([test.grid]<-9999,-9999,[test.grid]),意思是将test数据源下grid数据集值小于-9999的栅格全部赋值为-9999,其它栅格保持栅格值不变。
问题二:对修改后的栅格数据集生成TIN 地形缓存,发现TIN地形带有黑块
- 问题分析:在生成 TIN 地形缓存的 LOD 层时,会用到栅格数据的影像金字塔,而影像金字塔是导入TIF时创建的,如果对栅格数据集进行了修改,却没有更新影像金字塔,导致二者不再对应。使得同一位置的点在不同的层级被赋予了不同的高程值,产生了黑块。
- 解决方案:把原来的影像金字塔删除,然后再重新创建影像金字塔即可。
问题三:存在异常值导致的高精度 TIN 与低精度 TIN 合并之后,在精细 TIN 边缘处出现塌陷
- 问题分析:
1.生成 DSM 时,在有效值与地表之间产生了过渡数据。
2.在对高精度地形进行镶嵌等操作的过程中,引入了类似噪点的异常值。
3.也可能是其它原因导致精细地形数据中出现了实际地形高程范围之外的数据。
- 解决方案:
1.打开高精度栅格数据集的属性框,查看其高度范围,即属性框-栅格栏中的极值。
2.选择【三维数据】——【TIN工具】——【去除无效值】功能,根据数据本身的高度范围,填写高程值范围(即步骤1中的极值)。此操作是为了将高程值范围之外的数据在后面的 TIN 合并过程中,被视为无效值处理。
3.使用三维数据下TIN工具栏中TIN合并缓存工具,将处理后的高精度 TIN 与原来的低精度 TIN 合并。
注意:TIN合并缓存工具时一定要注意,需要将高精度地形缓存放到TIN缓存1的位置,低精度地形缓存放到TIN缓存2的位置。
问题四:TIN地形添加到场景中存在裂缝
- 问题分析:裙边高度过小。
- 解决方案:
当TIN地形存在裂缝时,在场景属性里开启“Tin地形裙边”可避免显示地形裂缝,从而提升TIN地形的显示效果。裙边高度过小会导致地形裂缝仍然存在,目前支持设置裙边高度,取值范围为[0,+∞],单位为米,当取值为0时,采用默认计算的高度值。
问题五:对TIN地形在图层属性面板做坡度坡向分析没有效果
- 问题分析:坡度坡向分析只支持带法线的TIN地形。
- 解决方案:切TIN地形缓存时需要勾选“带法线”。
问题六:在三维场景中,加入带法线的TIn地形缓存,发现使用坡度坡向,淹没分析均无效果?
- 问题分析:三维分析功能栏中的坡度坡向、淹没分析功能在10.1.0以前版本iDesktop中只适用于栅格地形(这个有版本限制,10.1.0以前版本不支持,10.1.0版本及其以后版本支持TIN地形在这里做坡度坡向、淹没分析)
- 解决方案:倾斜摄影模型和TIN地形数据的淹没分析功能是通过数据对应的图层属性面板实现的。
问题七:二维线添加到场景中被TIN地形遮挡了,怎样生成和TIN地形匹配的三维线?
- 问题分析:二维线的高程和TIn地形的高程不匹配。
- 解决方案:使用【三维数据】——【TIN工具】——【提取三维数据】功能对二维线提取匹配地形的三维线。
问题八:用三维面(路基三维面)对地形缓存(地形缓存16级,生成缓存前地形tif格网2米)进行了挖洞操作,有些桥下挖洞前地形是平整的,挖完洞后地形有很多不规则凸起。
- 问题分析:TIN地形挖洞时参数设置里的约束边界设置的是硬约束,硬约束是裁剪结果边界高程和裁剪面边界高程值一致,所以会出现挖完洞后地形有很多不规则凸起的现象。
- 解决方案:TIN地形挖洞时参数设置里的约束边界设置为软约束。
问题九:TIN地形挖洞如果用软约束在面边界周围放大后会出现很多小洞
- 问题分析:这个是计算误差,避免不了,目前底层还没有精确的算法。
- 解决方案:
方案一:采用硬约束挖洞后将凸起的部分镶嵌压平。
方案二:将路基三维面洞口封闭(见下图),这样对数据要求比较高,建议用代码封闭,手工操作会比较耗时。然后对封闭的面数据进行硬约束操作。这样处理的原因就是遵循硬约束是以挖洞面的边界高程来计算挖洞地形高程的。
方案三:将开挖面在【三维数据】-【TIN工具】-【提取三维数据】中提取贴合TIN地形的三维面,将提取出来的三维面添加到球面场景中,高度模式设置为贴地,【三维地理设计】-【TIN地形操作】-【挖洞】时选择这个面,进行【硬约束】挖洞即可。(最优)
问题十:想将TIN地形表现的更夸张立体些该怎么做?
- 问题分析:当前场景中地形数据的垂直夸张程度不满足需求。
- 解决方案:
设置【场景属性】——【地形缩放比例】。
“地形缩放比例”为1时,表示不对地形数据进行缩放的原始状态;当设置大于1的数值时,表示对地形的垂直比例进行放大,即夸张地形的起伏度,从而更为直观地展示模拟地球表面的地形状况。
注意:若用户需在三维场景中进行地形的可视性或可视域分析,仅在“地形缩放比例”为1的情况下进行分析,才能保证结果正确。