一種混合并行方式柵格影像金字塔構(gòu)建方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于地理空間信息處理技術(shù)領(lǐng)域,涉及一種混合并行方式柵格影像金字塔 構(gòu)建方法。
【背景技術(shù)】
[0002] 隨著衛(wèi)星傳感器技術(shù)以及無人機(jī)航拍技術(shù)的快速發(fā)展,遙感影像的空間和時(shí)間分 辨率都大幅度地提高,單幅遙感影像文件的數(shù)據(jù)量也急劇增加。對(duì)于大規(guī)模柵格影像進(jìn)行 快速顯示和服務(wù)發(fā)布時(shí),通過預(yù)先構(gòu)建金字塔是提高可視化和服務(wù)性能的有效手段,但大 數(shù)據(jù)量為金字塔的構(gòu)建效率帶來了巨大挑戰(zhàn)。已有串行算法以及商業(yè)遙感軟件構(gòu)建金字塔 的效率已遠(yuǎn)遠(yuǎn)跟不上數(shù)據(jù)的獲取速度,高效快速創(chuàng)建金字塔已經(jīng)成為柵格數(shù)據(jù)高效管理和 可視化必須要解決的重要問題。
[0003] 金字塔是一種柵格數(shù)據(jù)的多分辨率組織結(jié)構(gòu)。簡(jiǎn)單來說,金字塔結(jié)構(gòu)就是由原始 柵格影像開始,建立起一系列不同分辨率的柵格影像,不同分辨率的柵格影像對(duì)應(yīng)不同的 金字塔級(jí)。同時(shí),金字塔也是柵格影像的一種有損壓縮方式。構(gòu)建金字塔以后,可以改善柵 格影像顯示性能,當(dāng)用戶需要對(duì)柵格影像進(jìn)行不同分辨率地放大、縮小或平移時(shí),通過選擇 一個(gè)與用戶視圖相近分辨率的數(shù)據(jù)進(jìn)行可視化,從而系統(tǒng)只需進(jìn)行少量的計(jì)算和查詢就可 以返回結(jié)果,不需要進(jìn)行逐級(jí)采樣計(jì)算,大大減少數(shù)據(jù)顯示時(shí)間。
[0004] 并行構(gòu)建金字塔主要有三種思路。一種是基于GPU(Graphic Processing Unit,圖 形處理單元)進(jìn)行并行加速,利用GPU的計(jì)算能力加快金字塔的構(gòu)建速度,這種方法與GPU硬 件能力相關(guān),會(huì)提高系統(tǒng)架構(gòu)的成本;另一種是利用分布式集群系統(tǒng),將大規(guī)模柵格影像文 件的金字塔構(gòu)建任務(wù)劃分為多個(gè)子任務(wù),在多個(gè)分布式節(jié)點(diǎn)上同時(shí)進(jìn)行。這種方法擴(kuò)展性 較好,可以充分利用分布式并行環(huán)境來處理大規(guī)模數(shù)據(jù),但需要將柵格影像分布存儲(chǔ)在多 個(gè)節(jié)點(diǎn),數(shù)據(jù)的分布存儲(chǔ)以及結(jié)果的合并都是比較耗時(shí)的。還一種是基于MPI (Message Passing Interface,消息傳遞接口)的多進(jìn)程方式進(jìn)行影像金字塔的并行構(gòu)建,這種方法 利用共享外存的高性能集群,實(shí)現(xiàn)對(duì)柵格影像并行重采樣,然后將重采樣結(jié)果并行寫入到 文件系統(tǒng),這種方法現(xiàn)階段存在一些問題,由于任務(wù)劃分的不同容易產(chǎn)生黑邊現(xiàn)象以及類 型溢出。目前基于MPI以及0penMP(0pen Muti-Processing,共享存儲(chǔ)并行編程)利用共享外 存的高性能集群系統(tǒng)采用多進(jìn)程與多線程混合并行方式的大規(guī)模影像金字塔構(gòu)建方式研 究較少。
【發(fā)明內(nèi)容】
[0005] 針對(duì)上述技術(shù)問題,本發(fā)明提供一種混合并行方式柵格影像金字塔構(gòu)建方法。本 發(fā)明利用多進(jìn)程技術(shù)對(duì)任務(wù)進(jìn)行劃分,當(dāng)單個(gè)進(jìn)程任務(wù)過重時(shí),每個(gè)進(jìn)程內(nèi)部可采用多線 程技術(shù)對(duì)任務(wù)進(jìn)行細(xì)分進(jìn)行二級(jí)并行,不僅解決了傳統(tǒng)并行構(gòu)建金子塔常見的黑邊現(xiàn)象, 而且實(shí)現(xiàn)了金字塔框架文件的高效創(chuàng)建,金字塔并行重采樣,以及重采樣數(shù)據(jù)并行寫入。具 體技術(shù)方案包括步驟如下:
[0006] (S1)初始化設(shè)定金字塔級(jí)數(shù)level、進(jìn)程總個(gè)數(shù)η和金字塔級(jí)數(shù)迭代初始值lev為0 級(jí);消息傳遞接口(記為:MPI)為每個(gè)進(jìn)程分配一個(gè)進(jìn)程號(hào)i,0<i〈n,作為該進(jìn)程的唯一標(biāo) 識(shí),其中i,level,n為整數(shù);后續(xù)可以通過對(duì)該進(jìn)程號(hào)描述相應(yīng)進(jìn)程的操作;
[0007] (S2)獲取原始柵格影像,各進(jìn)程讀取原始柵格影像的元數(shù)據(jù)信息;所述柵格影像 的元數(shù)據(jù)信息包括原始柵格影像的長,寬,波段數(shù),數(shù)據(jù)類型;
[0008] (S3)指定一個(gè)進(jìn)程為主進(jìn)程,創(chuàng)建空金字塔框架文件,并對(duì)創(chuàng)建的空金字塔框架 文件采用多線程技術(shù)進(jìn)行結(jié)構(gòu)組織;具有過程為:主進(jìn)程根據(jù)金字塔級(jí)數(shù)和柵格影像的元 數(shù)據(jù)信息計(jì)算待創(chuàng)建空的金字塔框架文件的大小;若金字塔框架文件不超過4GB,則創(chuàng)建 GeoTIFF格式的金字塔文件;如果金字塔文件大小超過4GB,則創(chuàng)建BigTIFF格式的金字塔文 件;其中,GeoTIFF表示地理參考標(biāo)簽影像文件格式,BigTIFF表示大規(guī)模標(biāo)簽影像文件格 式;主進(jìn)程采用多線程的方式并行設(shè)置相應(yīng)標(biāo)記位把數(shù)據(jù)區(qū)和標(biāo)簽區(qū)的位置劃分出來;而 后將每層金字塔的元數(shù)據(jù)信息寫入金字塔文件中標(biāo)簽區(qū)相應(yīng)標(biāo)記位,將數(shù)據(jù)區(qū)預(yù)留;所述 金字塔的元數(shù)據(jù)信息主要包括該層金字塔的長、寬、波段數(shù)、數(shù)據(jù)類型和該層金字塔各條帶 數(shù)據(jù)在數(shù)據(jù)區(qū)內(nèi)的物理偏移位置。
[0009] (S4)數(shù)據(jù)任務(wù)劃分:按照行劃分的方式把柵格影像的數(shù)據(jù)量平均劃分給各個(gè)進(jìn) 程,所述行劃分方式具體如下:以像素為單位,柵格影像的長為Xsize,寬為Ysize,波段個(gè)數(shù) 為nBands,進(jìn)程總數(shù)為n,則每個(gè)進(jìn)程分配得到數(shù)據(jù)量DataSize等于(Ysize/n) XXsize X nBands;每個(gè)進(jìn)程根據(jù)進(jìn)程號(hào)計(jì)算其所分配得到的數(shù)據(jù)塊在原始影像上的邏輯偏移位置; [0010]具體計(jì)算方式如下:假設(shè)當(dāng)前進(jìn)程的進(jìn)程號(hào)為i(〇^i〈n),則該進(jìn)程所讀取數(shù)據(jù)的 邏輯偏移位置DataOffset為i X (Ysize/n) XXsize;
[0011] (S5)讀取數(shù)據(jù):如果每個(gè)進(jìn)程分配的數(shù)據(jù)量DataSize < 2147483647各個(gè)進(jìn)程根據(jù) 步驟(S4)中的數(shù)據(jù)劃分的邏輯偏移位置,采用GDAL類庫的RasterlO函數(shù)將柵格影像的各波 段數(shù)據(jù)依次讀取到內(nèi)存;
[0012] 如果每個(gè)進(jìn)程分配的數(shù)據(jù)量DataSize>2147483647,即超過整型上限出現(xiàn)類型溢 出的情況,進(jìn)一步將每個(gè)進(jìn)程下再細(xì)分多個(gè)線程,細(xì)分后的多個(gè)線程再對(duì)該進(jìn)程的數(shù)據(jù)塊 進(jìn)行細(xì)分,具體細(xì)分過程如下:將DataSize不斷除以2進(jìn)行二分,直到滿足以下條件 2147483647x2k- 1《DataSize < 2147483647X2k為止,k為二分次數(shù),取整數(shù);而后采用 OpenMP技術(shù)在該進(jìn)程下細(xì)分2kf子線程,將進(jìn)程的數(shù)據(jù)量DataSize平均分配給其2k個(gè)子線 程,則每個(gè)子線程讀取的數(shù)據(jù)量為DataSize/2 k。當(dāng)子線程對(duì)父進(jìn)程的數(shù)據(jù)細(xì)分后,各線程 分別計(jì)算其相對(duì)父進(jìn)程內(nèi)存空間起始位置的偏移值,具體計(jì)算方法如下:假設(shè)當(dāng)前線程的 線程號(hào)為it(0 < it〈2k),it取整數(shù),則其偏移值為it X (DataSize/2k)。各線程根據(jù)相對(duì)父進(jìn) 程的偏移值以及父進(jìn)程的邏輯偏移位置,計(jì)算得到各線程從柵格影像上讀取數(shù)據(jù)的邏輯偏 移位置tDataOffset等于Data0ffset+it X (DataSize/2k)。由于各子線程是共享父進(jìn)程的 內(nèi)存空間,因此各線程根據(jù)其偏移值tDataOffset利用GDAL類庫的RasterlO函數(shù)將 DataSize/2k個(gè)數(shù)據(jù)并行獨(dú)立讀取到父進(jìn)程的內(nèi)存空間中。
[0013] (S6)各個(gè)進(jìn)程根據(jù)當(dāng)前金字塔級(jí)數(shù)采用最鄰近內(nèi)插算法依次對(duì)步驟(S5)中讀取 的數(shù)據(jù)進(jìn)行對(duì)應(yīng)粒度為2 lev的重采樣,lev為當(dāng)前金字塔級(jí)數(shù);將各波段重采樣后的結(jié)果存 入內(nèi)存中;
[0014] (S7)并行寫出結(jié)果,各個(gè)進(jìn)程根據(jù)進(jìn)程號(hào)以及波段號(hào)解算各波段在結(jié)果文件中的 寫入偏移位置;根據(jù)寫入偏移位置采用MPI的MPI_File_write_at函數(shù)將內(nèi)存中各波段重采 樣后的結(jié)果依次并行寫入金字塔文件;
[0015] 具體方法如下:首先利用libtiff類庫的TIFFGetField函數(shù)獲取到該層金字塔數(shù) 據(jù)區(qū)起始偏移位置ovrOffset,設(shè)當(dāng)前進(jìn)程的進(jìn)程號(hào)為i,波段號(hào)為iband,0Siband〈 nBands,iband為整數(shù);以像素為單位當(dāng)前層級(jí)金字塔大小為ovrXSize XovrYSize,貝lj各進(jìn) 程寫入偏移位置為ovrOff set+ovrXSize X ovrYSize X iband+resBuff size,resBuff size為 前i個(gè)進(jìn)程重采樣數(shù)據(jù)大小之和。
[0016] (S8)將當(dāng)前金字塔級(jí)數(shù)加1,如果當(dāng)前金字塔級(jí)數(shù)小于等于設(shè)定金字塔級(jí)數(shù),則返 回步驟(S6);如果當(dāng)前金字塔級(jí)數(shù)大于設(shè)定金字塔級(jí)數(shù),則金字塔構(gòu)建完畢。
[0017] 采用本發(fā)明獲得的有益效果:本發(fā)明的有益效果是:(1)本發(fā)明所生成的柵格影像 金字塔文件與地理空間數(shù)據(jù)抽象庫GDAL(Geospatial Data Abstract Library,地理數(shù)據(jù) 抽象庫)生成的金字塔文件格式一致,GDAL是一種被廣泛應(yīng)用的金字塔構(gòu)建工具,其創(chuàng)建的 金字塔文件能夠被當(dāng)前絕大多數(shù)地理信息系統(tǒng)軟件直接使用,可以無縫集成到各種地理信 息應(yīng)用中。(2)本發(fā)明構(gòu)建金字塔效率高。創(chuàng)建空金字塔文件時(shí),選擇主進(jìn)程為0號(hào)進(jìn)程,采 用多線程技術(shù)加快了創(chuàng)建速度,而且創(chuàng)建時(shí)預(yù)先規(guī)劃好金子塔標(biāo)簽區(qū)和數(shù)據(jù)區(qū)的位置,使 得標(biāo)簽區(qū)和數(shù)據(jù)區(qū)內(nèi)部可以連續(xù)緊湊排列,而標(biāo)簽區(qū)和數(shù)據(jù)區(qū)之間則相互獨(dú)立互不影響, 為后面重采樣數(shù)據(jù)能夠快速并行寫入創(chuàng)造了條件。(3)本發(fā)明算法并行程度高。各個(gè)進(jìn)程在 并行從原始影像讀取相應(yīng)數(shù)據(jù),并行對(duì)其所屬數(shù)據(jù)重采樣,并行將采樣數(shù)據(jù)寫入金字塔文 件。(4)本發(fā)明算