






摘" 要:在使用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—),女,漢族,湖北武漢人,教授級高級工程師,碩士,研究方向:城市排水防澇、水環境治理。