C++ GDAL批量創(chuàng)建柵格文件并寫入數(shù)據(jù)

??本文介紹基于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ù)的操作。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容