摘" 要:在使用OSGEarth三维地球引擎进行大规模地理空间数据可视化时,细节层次(Level of Detail, LOD)技术通过动态调整地形和模型的细节层次,在保证视觉质量的同时,显著降低了计算负载和资源消耗。但在分开叠加影像层与地形层在线服务数据时,由于两类数据服务层级精度不匹配,渲染时将出现白块、断层塌陷等视觉问题,文章提出了一种通过实时重采样自动创建子瓦片的方案,对影像图层与地形图层的精细层级不同的问题进行双线性重采样,有效解决白块和断层塌陷等现象,拥有良好的应用前景。
关键词:OSGEarth;分开叠加;子瓦片;白块;断层塌陷;实时重采样
中图分类号:TP311.1;TP391.4 文献标识码:A 文章编号:2096-4706(2025)03-0105-05
A Solution to the Problem of Separating and Overlying Online Services Based on OSGEarth
LIU Jia1,2, CHEN Cuizhen3, LIU Min4, ZHANG Zhixin1,2, LIU Da1,2
(1.Network and Information Center, Changjiang Water Resources Commission, Wuhan" 430010, China; 2.Technology Innovation Center of Digital Enablement for River Basin Management, Changjiang Water Resources Commission, Wuhan" 430010, China; 3.Wuhan Water Research Institute, Wuhan" 430010, China; 4.Wuhan Service Flood Control and Information Center, Wuhan" 430010, China)
Abstract: When the OSGEarth 3D Earth Engine is used for large-scale geospatial data visualization, the LOD (Level of Detail) technology dynamically adjusts the level in detail of terrain and models to significantly reduce computational load and resource consumption while ensuring visual quality. However, when separating and overlying online service data for image and terrain layers separately, visual problems such as white blocks and fault collapse will occur during rendering due to the mismatch in accuracy between the two types of data service levels. This paper proposes a solution for automatically creating sub tiles through real-time resampling, which effectively solves phenomena such as white blocks and fault collapse and has a good application prospect.
Keywords: OSGEarth; separating and overlying; sub tile; white block; fault collapse; real-time resampling
0" 引" 言
随着地理信息系统学科的不断发展,三维化已成为该领域的一个重要发展趋势,并在各行各业的应用中日益成熟。这种转变不仅提升了技术的可视性和交互性,更重要的是,通过空间维度的拓展,为各行业开发更多可能性的服务和挖掘信息提供了更多机会。
OSGEarth作为专门针对GIS开发设计的三维开源场景库,因其高性能、可扩展性、可移植性和开源的特点,在推出以来受到广大开源爱好者的青睐。它成功地应用于各行各业中,并促进了开源地理信息系统不断完善和扩展。OSGEarth基于GDAL和OGC等多种驱动器,能够读取各种类型的GIS数据,并通过插件模式支持加载市面上众多类型的三维模型格式。这种灵活性和多功能性使得OSGEarth成为一个强大的工具,为用户提供丰富的功能和可视化体验。
1" OSGEarth场景数据与加载
1.1" OSGEarth传统三维地形场景数据结构
OSGEarth三维全球地形场景搭建的传统方式主要基于DEM和DOM原始数据,通过OSG提供的地形生成工具VirtualPlanetBuilder处理生成一系列四叉树金字塔结构的散列瓦片文件[1]。这些瓦片文件以二进制的.ive格式或文本存储的.osg格式进行存储。每个ive文件代表一节点瓦片,包含瓦片金字塔索引、父子节点关系、纹理、高程等信息。如图1所示,这些数据采用WGS84坐标系,切片规则遵循Google Maps方式,即坐标起始点位于左上角。切片从第一级zoom = 0开始,包含两张(TMS)瓦片,之后每个地形父节点瓦片最多拥有四个子节点[2]。按照全球WGS84坐标范围,换算第一级的地理分辨率是:resFact = 180.0/256 = 0.703 125(1张切片),之后每放大一级,地理分辨率对应上一级父节点分辨率1/2。每个影像瓦片都包含256×256像素[3],地形瓦片存放72个浮点数类型的高程差值数据,共占用288个字节[4]。
1.2" OSGEarth场景调度渲染机制
OSGEarth三维地球场景渲染调度采用瓦片分层式多通道融合技术(MP),并继承了OSG的插件驱动机制。渲染调度时,首先通过引擎驱动(OSGEarth_engine_mp)构建一个值为空的WGS84参考椭球引擎,其结构与上述的四叉树数据结构一致[5],在渲染过程中,根据分辨率设置不同视距与视域下所需显示层级的瓦片数据,并采用最普遍的分辨率层次LOD(Level of Detail)调度方式。通过这种方式,根据地形模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,提高了调用数据的运行速度,同时保证了显示模型数据的精密度,从而获得高效率的渲染运算[6]。
如图2所示,OSGEarth调度过程中,通过插件驱动按需读取瓦片中所需地形与影像数据。通过在计算当前视距与各瓦片数据的显示范围,可以确定当前对应显示层级与瓦片行列号TileKey。每个图层通过Driver生成一个TileSource对象,包含对数据进行读取和处理方法。采用TileSource方法创建TileMode,从而快速显示指定所需显示范围影像数据与地形数据,并挂接至相应的树节点TileNode下。当OSG在渲染过程中通过文件中所保存其子节点信息进行索引调度,通过节点的索引号TileKey创建瓦片模型TileMode,在获取子节点的瓦片模型时TileMode将进行判断是否同时包含影像数据与高程数据,都不包含时将停止向下索引,从而完成三维地形的快速索引与分层显示。
参考椭球引擎的每个瓦片树节点TileNode都由瓦片节点代理TileNodeRegistry负责管理,TileNodeRegistry存储了每个已经创建出来的瓦片节点的引用,指向具体创建瓦片所需各图层数据的插件引擎(Driver)。keyNodeFactory计算在LOD方式调度下视角范围内所需加载与卸载瓦片的对应层级行列。
1.3" 存在的问题
在构建三维地形场景时,使用原始的DOM(Digital Orthophoto Map)和DEM(Digital Elevation Model)数据可能需要较高的数据处理门槛。为了简化数据处理流程,市面上存在许多免费在线影像服务,例如天地图、ArcGIS Online等,它们提供了高分辨率的影像数据,并能满足许多应用场景的需要。此外,许多行业机构为了方便数据的共享和管理更新,也通过GIS地图服务发布OGC标准格式的影像或地形数据。OSGEarth作为面向GIS开发设计的三维开源场景库,其使用的世界坐标系WGS84切片方式与互联网上常见的OGC-WMTS切片标准保持一致,支持将DEM地形数据和DOM影像数据通过在线服务分开加载的方式构建三维地形场景。根据OSGEarth的官方使用手册,OSGEarth支持使用多种驱动加载各种格式的在线影像地图数据,包括GDAL、MBTiles、TMS、WMS、XYZ、Microsoft Bing、Cesium Ion、ESRI ArcGIS Server、MapboxGL等。
然而,在实际操作中,叠加两类数据服务有时会导致影像层出现白块或地形断层的现象。这是因为分开加载DOM影像与DEM地形数据可能导致高程服务瓦片层级与影像服务瓦片层级不匹配。当渲染至精细高层瓦片时,如果影像图层的瓦片最大层级大于高程层级数,则可能导致地形数据缺失,从而出现地形断开或凸起的现象。反之,如果地形高层瓦片层级数大于影像瓦片层级数,则可能出现缺失的影像数据,导致白块现象。这些现象不仅影响视觉效果,也与实际情况不符。解决这些问题可能需要进一步调整数据服务的瓦片层级设置,以确保地形和影像数据的一致性和完整性。
2" 子节点瓦片的创建与重采样
本文针对影像瓦片单独叠加至地形上的方式将无法保证影像的层级数与地形层级数一致性,从而出现白块或平面断层的现象,提出一种OSGEarth改进方法,能够自动创建子瓦片与数据重采样,接入在线地图服务,并利用上层父节点数据进行动态创建与重采样,填充至自动创建的子瓦片中,代替直接返回0的调度机制,并解决其造成的白块或断层现象,以保障数据渲染的连贯性。
2.1" OSGEarth子瓦片创建
OSGEarth在渲染引擎在调度过程中,需创建TMS参考椭球四叉树下各子瓦片,从根节点开始,计算当前视距与各瓦片数据的显示范围,确定当前对应显示层级与瓦片节点。每个瓦片包含TileKey类记录瓦片的层级lod、行号tile_x、列号tile_y,瓦片对应的地理信息GeoExten。通过GeoExten计算创建每个瓦片TileModel的分辨率是否满足当前视角下精细度范围。如果满足,则直接读取该瓦片数据,如果低于分辨率需求,则继续创建子瓦片;如果高于分辨率精细度需求,则返回其创建父节点瓦片。
TileSource指向该瓦片内包含影像与地形数据的图层类型获取方式,并创建当前视角下瓦片节点模型类TileModel对象过程中。每一影像数据图层将创建一个ImageLayer类对象,而高程图层将创建一个HeightFieldLayer类对象。通过ImageLayer实现地表纹理的贴图;通过ElevationLayer实现地球表面地形几何数据的构建。ElevationLayer充当了类似HeightMap(高程数据)的功能。读取对应瓦片的影像数据_colorData与高程网格数据_elevationData填充至TileModel中进行实时渲染。
2.2" OSGEarth瓦片插值重采样
除了在创建瓦片通过计算GeoExten分辨率控制瓦片层级外,在ImageLayer与HeightFieldLayer读取具体数据时,如若无对应的_colorData与_elevationData数据,即便分辨率不满足调度需求,渲染瓦片也将不再创建子瓦片。分开加载在线地形与影像市,会存在某层级瓦片只有影像或地形一方存在数据的情况,此时基于仍采用传统调度方案,那么缺失精细层数据的一类将默认将瓦片填充为0。这就是其影像白块或者地形塌陷断裂的缘由。为了解决这个问题,可以通过父节点插值返回ImageLayer或HeightFieldLayer图层所需数据的方式,从而避免白块或者地形断裂。
以OSGEarth瓦片高程插值为例,首先OSGEarth会根据LOD属性行列号获取当前索引对应的瓦片,即osgTerrain::TerrainTile类对象tile。判断当前瓦片是否存在,如果存在则直接返回tile包含的osg::HeightField类高程数据;否则,需要对瓦片采用获取上层瓦片进行重采样获取[7]。
在对子瓦片内的高程网进行内插需要注意,每个瓦片内的高程值采用规则三角网的方式构建,每个高程点记录了该点坐标与高程值。瓦片中记录的高程点数据不一定是按照四分的方式记录,行列号不再是简单的两倍关系。所以在内插时需注意父瓦片中高程点与子瓦片中高程点的行列号的推算。此外,如果对影像与高程同时采样的情况下,为了防止无限重采样下去,在OSG检索时,应当设置最大层级返回。
目前广泛使用的三种方法为最邻近内插法、双线性内插法和三次卷积法[8]。最邻近法的实时性最强,双线性次之,三次卷积法的耗时最多。对影像进行缩放操作,最邻近法得到的效果最差,三次卷积法的效果最好,双线性法介于二者之间[9]。本文采用二元函数的线性插值方法进行重采样,该方法是一元函数线性插值方法的直接推广[10],将一维空间中的线段推广为二维空间中的矩形,由此产生二维线性插值。已知平面上一点P与该点周边矩形域内四个定点A,B,C,D及其函数值为:f(A),f(B),f(C),f(D),则点P的函数值为:Q11 = (x1 , y1),Q12 = (x1 , y2),Q21 = (x2 , y1)及Q22 = (x2 , y2)的函数值为:
2.3" 实现过程
实现过程如下:
1)由于采用了四叉树进行索引管理,父瓦片的行列号可以通过对当前瓦片行列号左移一位来获取:
TileKey parentKey = currentKey -gt; createParentKey();
2)获取父瓦片高程数据:
osgTerrain::Layer* elevationLayer = parenttile-gt;getElevationLayer();
osgTerrain::HeightFieldLayer* parentLayer = dynamic_cast lt; osgTerrain :: HeightFieldLayer* gt;(elevationLayer);
osg::ref_ptrlt;osg::HeightFieldgt;parentHeightField =new osg::HeightField (*parentLayer-gt;getHeightField());
3)获取父瓦片的附近高程三角网的高程点间隔与瓦片对应的高程点的范围:
//高程点间隔
float parentXInterval = parentHeightField -gt; getXInterval();
float parentYInterval = parentHeightField -gt; getYInterval();
//父瓦片高程点行数与列数
int prowNum = parentHeightField -gt;getNumRows();
int pcolunmNum = parentHeightField -gt;getNumColumns();
//瓦片中对应的地理坐标范围
osg::Vec3 parentOrigin = parentHeightField -gt;getOrigin();
osg::Vec3 childOrigin = osg::Vec3(key.getExtent().xMin(), key.getExtent().yMin() ,currentOrigin.z());
4)计算子瓦片与父瓦片中高程点对应的间隔与点行列号的关系:
//父瓦片对应到子瓦片范围内的高程点数
int unitX = (prowNum-1)/upLayerNum;
int unitY = (pcolunmNum-1)/upLayerNum;
//子瓦片的起始高程点与父瓦片起始高程点行列差
int detaOrignX = (childOrigin.x() - currentOrigin.x())/pXInterval;
int detaOrignY = (childOrigin.y() - currentOrigin.y())/pYInterval;
5)内插。经典的插值算法有:双线性插值、多项式插值、最小二乘插值等。根据对精度以及速度的不同需求可以选择不同的算法。根据速度需求本文采用了线性插值方式:
for (int i = 0; i lt; prowNum * 2 ; i=i+2) {
for (int j = 0; j lt; pcolunmNum * 2; j=j+2) {
int parenti = Math.floor(i/2);
int parentj = Math.floor(j/2)
double p11 = parentHeightField[parenti][parentj];
double p12 = parentHeightField[parenti][parentj + 1];
double p21 = parentHeightField[parenti + 1][parentj];
double p22 = parentHeightField[parenti + 1][parentj];
double childeField[i][j] = 3/4 * ( 3/4 * p11 + 1/4 * p21) + 1/4 * ( 3/4 * p12 + 1/4 * p22)
double childeField[i+1][j] = 3/4 * ( 1/4 * p11 + 3/4 * p21) + 1/4 * ( 3/4 * p12 + 1/4 * p22)
double childeField[i][j+1] = 1/4 * ( 3/4 * p11 + 1/4 * p21) + 3/4 * ( 1/4 * p12 + 3/4 * p22)
double childeField[i+1][j+1] = 1/4 * ( 1/4 * p11 + 3/4 * p21) + 3/4 *( 1/4 * p12 + 3/4 * p22)
}
}
2.4" 实现效果
当分开叠加地形与影像服务,影像分辨率层级高于地形多拥有的层级时将出现如图3所示的地形断层问题,通过上述重采样方案,对地形缺失的层级使用父瓦片数据进行重采样补充,获得图4平缓过度的效果。同理,当影像分辨率层级低于地形拥有的层级时,将出现图5的白块效果,采用本文方案采样补充后,可获得图6的效果。
3" 结" 论
OSGEarth为创建交互式地理空间可视化提供了一个强大而灵活的平台,使其成为广泛的GIS应用程序的宝贵工具。本文在总结了现有OSGEarth场景数据加载技术的基础上,在对于三维GIS场景中DOM数据与DEM数据分层叠加,并对影像图层与地形图层的精细层级不同的问题进行双线性重采样,解决其造成的影像白块或地形断层塌陷问题。兼顾渲染速度的同时,使得地面纹理和地形过渡更加平滑自然。该方案将使得OSGEarth易于数据的更新,使其更加适用于网络服务型的三维GIS技术,因此将拥有良好的应用前景。但当分开叠加的影像与地形分辨率层级差距过大时,本文使用的双线性重采样,将导致放大精细查看时影像或者地形出现马赛克式的边缘噪声,故下一步可考虑叠加这类分辨层级差距较大的服务,在重采样时同时使用平滑滤波进行改进。
参考文献:
[1] 张尚弘,乐世华,姜晓明.基于VPB和osgGIS的流域三维虚拟环境建模方法 [J].水力发电学报,2012,31(3):94-98.
[2] 王振武,吕小华,韩晓辉.基于四叉树分割的地形LOD技术综述 [J].计算机科学,2018,45(4):34-45.
[3] 赵敬红.基于OpenSceneGraph的大地形可视化方法研究 [D].长沙:中南大学,2009.
[4] 朱俊洁,陶伟,殷明阳.地形平滑中瓦片高程数据的快速调度方法 [J].现代计算机,2021(12):146-150.
[5] GOODCHILD M F. Discrete Global Grids for Digital Earth [C]//International Conference on Discrete Global Grids.California:Santa Barbara,2000:1-8.
[6] 周俊全.基于osgEarth的海量地理数据加载的三维地球研究 [D].南昌:华东交通大学,2023.
[7] 王锐,钱学雷.Open Scene Graph三维渲染引擎设计与实践 [M].北京:清华大学出版社,2009.
[8] ZEMČÍK P,PŘIBYL B,HEROUT A,et al. Accelerated Image Resampling for Geometry Correction [J].Journal of Real-time Image Processing,2013,8(4):369-377.
[9] 艾梦池,程效军.数字影像重采样方法实现及对比分析 [J].辽宁工程技术大学学报:自然科学版,2015,34(12):1382-1387.
[10] 黄泽纯.基于统计学习的DEM尺度上推方法研究 [D].成都:西南交通大学,2019.
作者简介:柳嘉(1991—),女,汉族,江西宜春人,工程师,硕士,研究方向:水利数字孪生;通信作者:陈翠珍(1984—),女,汉族,湖北武汉人,教授级高级工程师,硕士,研究方向:城市排水防涝、水环境治理。