??本文介紹基于C++ 語言GDAL庫,批量創(chuàng)建大量柵格遙感影像文件,并將數(shù)據(jù)批量寫入其中的方法。
??首先,我們來明確一下本文所需實現(xiàn)的需求。已知我們對大量遙感影像進行了批量讀取與數(shù)據(jù)處理操作——具體過程可以參考文章C++ GDAL批量讀取多時相柵格圖像并生成像元時間序列數(shù)組的方法(http://www.itdecent.cn/p/f056e1915a37);而隨后,就需要對我們處理后的柵格數(shù)據(jù)再進行輸出,即建立新的大量的柵格遙感影像,并將我們處理后的像元數(shù)據(jù)依次輸入進去。
??明確了具體需求,接下來就可以開始代碼的實踐;本文所用到的具體代碼如下。這里需要注意,在這里就僅將與本文需求有關的代碼放了上來,其他無關的代碼就省略了(所以以下代碼只是程序主函數(shù)中的一部分);大家在實踐過程中,依據(jù)自己的需求,將自己代碼與本文的代碼相結合就可以。
#include <iostream>
#include "gdal_priv.h"
//以下只列出柵格數(shù)據(jù)批量創(chuàng)建、寫入與導出的代碼,其他無關的代碼就省略了~
int pic_index_2 = 1;
for (auto x : my_file)
{
const char* pszFormat = "GTiff";
GDALDriver* poDriver;
GDALAllRegister();
poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
if (poDriver == NULL)
cout << "There is an error with poDriver!" << endl;
GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(mod_file.c_str(), GA_ReadOnly);
GDALDataset* poDstDS;
char** papszOptions = NULL;
papszOptions = CSLSetNameValue(papszOptions, "TILED", "YES"); //建立金字塔
papszOptions = CSLSetNameValue(papszOptions, "COMPRESS", "LZW");
int pos_need = x.rfind("CSI");
string file_name = x.substr(pos_need);
string out_file = out_path + "http://R_" + file_name;
poDstDS = poDriver->CreateCopy(out_file.c_str(), poSrcDS, FALSE, papszOptions, GDALTermProgress, NULL);
GDALRasterBand* poOutBand;
poOutBand = poDstDS->GetRasterBand(1);
poOutBand->RasterIO(GF_Write, 0, 0, nXSize, nYSize, out_pafScanline[pic_index_2 - 1], nXSize, nYSize, GDT_Float64, 0, 0);
pic_index_2++;
GDALClose((GDALDatasetH)poDstDS);
GDALClose((GDALDatasetH)poSrcDS);
}
delete[] pafScanline;
delete[] out_pafScanline;
delete[] pixel_paf;
delete[] pixel_paf_result;
pafScanline = NULL;
out_pafScanline = NULL;
pixel_paf = NULL;
pixel_paf_result = NULL;
??以上代碼的思路其實也非常簡單。首先,因為是需要對大量的柵格進行批量操作,所以代碼整體是在for循環(huán)中進行的,每一個循環(huán)都是對一個獨立的柵格文件的創(chuàng)建、數(shù)據(jù)寫入與文件保存操作;其中,"GTiff"表示我們將要生成的柵格文件是.tif格式的,如果大家需要生成別的格式的話可以修改這里;auto x : my_file表示從我們前期已經(jīng)獲取到的需要處理的柵格文件列表中遍歷(雖然我們這里是需要建立新的柵格文件,但由于我這里新的柵格文件的命名規(guī)則是與原有的柵格文件一致的,所以就還是從原有的文件列表中遍歷),my_file就是前期已經(jīng)獲取到的需要處理的柵格文件列表,具體獲取方法可以參考文章C++獲取文件夾中全部文件名稱并選出指定后綴的文件(http://www.itdecent.cn/p/85e324892c56)。
??接下來,就是基于GDAL庫來實現(xiàn)柵格數(shù)據(jù)的創(chuàng)建于寫入。在GDAL庫中,如果我們想用自己的數(shù)據(jù)生成柵格文件,首先需要基于CreateCopy()函數(shù)新建一個柵格文件,隨后通過RasterIO()函數(shù)寫入數(shù)據(jù)。其中,poSrcDS是一個指向模板柵格文件的指針;在我們用CreateCopy()函數(shù)新建柵格文件時,新的柵格文件的各項屬性,比如行數(shù)、列數(shù)、像元大小、坐標信息等,都直接與這個模板柵格文件保持一致。隨后,poDstDS則是指向我們此時將要新建的柵格文件的指針。
??接下來,我們通過CSLSetNameValue()函數(shù),配置一下將要生成的新的柵格文件的屬性,比如"TILED", "YES"表示柵格文件同時生成金字塔,"COMPRESS", "LZW"表示柵格文件通過LZW算法進行壓縮等。
??再接下來,是配置我們新的柵格文件的文件名的代碼部分。因為我們是需要批量生成大量的柵格文件的,所以其文件名肯定不能手動逐一修改;我這里就是直接在已有文件的文件名基礎上,增添了一個字母,作為新柵格文件的文件名;這里就是通過字符串的截取等操作來實現(xiàn)新的文件名的生成。其中,out_path是我們已經(jīng)定義過的變量,表示結果保存路徑。
??完成以上全部配置后,即可依據(jù)CreateCopy()函數(shù)進行新的柵格文件的創(chuàng)建。
??至此,我們僅僅是完成了GDAL庫中柵格文件的創(chuàng)建,但此時還沒有將數(shù)據(jù)導入進去,因此在資源管理器中也是看不到具體的新的柵格文件的。隨后,我們基于RasterIO()函數(shù),將數(shù)據(jù)寫入柵格文件即可;其中,out_pafScanline[pic_index_2 - 1]就是需要寫入到每一景遙感影像中的數(shù)據(jù)。
??完成以上工作后,我們就完成了對其中一景遙感影像的創(chuàng)建、寫入,此時資源管理器中就會看到這一景圖像的文件已經(jīng)存在。隨后,通過GDALClose()函數(shù)將剛剛指向的柵格遙感文件關閉,并進行下一次循環(huán)。對全部需要生成的柵格遙感影像文件都完成遍歷后,則通過delete[]、 = NULL等語句釋放內(nèi)存、取消指針。
??此時,即可在目標文件夾中看到我們批量生成的柵格文件。

??基于此,即可完成批量創(chuàng)建、寫入柵格數(shù)據(jù)的操作。