GDAL中MEM格式的簡單使用示例

2021-06-20 14:28:15 字數 1772 閱讀 5736

gdal庫中提供了一種記憶體檔案格式——mem。如何使用mem檔案格式,主要有兩種,一種是通過別的檔案使用createcopy方法來建立乙個mem;另外一種是影象資料都已經儲存在記憶體中了,然後使用記憶體資料塊來構造乙個mem。第一種方式比較簡單,這裡主要說明下第二種方式。

首先看看mem的說明文件,位址為:www.gdal.org/frmt_mem.html。從裡面我們可以看到mem檔案支援幾乎所有的空間資料資訊,包括投影,座標,gcp,元資料等資訊。下面就主要看看怎麼從乙個記憶體資料塊來構造乙個mem檔案。mem檔案的資料名稱如下:

mem:::option=value[,option=value...]

例如:mem:::datapointer=342343408,pixels=100,lines=100,bands=3,datatype=byte,pixeloffset=3,lineoffset=300,bandoffset=1

可以看到mem檔名開頭有mem後接三個英文冒號(:::),解析來由一系列的選項=值的方式來組成,具體選項和說明如下:

其中前三項為必填項,必須指定,其餘五項為選填項,最後三項和rasterio函式的最後三個引數的意思相同。

下面是乙個簡單的示例**,主要作用就是從乙個大影象中讀取512*512的大小的影象,然後將讀取出來的影象構造乙個mem檔案,並將該檔案儲存為乙個png影象出來。

void gdal_mem_test()

; //構造mem的檔名

sprintf_s(amemstring, 256, "mem:::datapointer=%d,pixels=%d,lines=%d", pdata, 512, 512);

//開啟mem檔案

gdaldataset *pmemds = (gdaldataset*) gdalopen(amemstring, ga_readonly);

gdaldriver *pdriver = getgdaldrivermanager()->getdriverbyname("png");

gdaldataset *poutds = pdriver->createcopy("d:\\data\\landsat\\p139r26_5t19900902_nn2_sub.png", pmemds, false, null, null, null);

gdalclose((gdaldataseth) psrcds);

gdalclose((gdaldataseth) pmemds);

gdalclose((gdaldataseth) poutds);

delete pdata;

}

裁切的原始影象如下圖所示,圖中的紅色區域大致為**中讀取出來的區域,右下角為鷹眼圖。

下圖是構造的mem並輸出的結果,可以看出影象的區域與上圖中的紅色區域中的一樣。對於需要從影象中裁切一塊資料除了使用rasterio和cereate方式之外,還可以使用mem,比較方便,不需要複雜的**即可完成工作;同時對於某些演算法需要將資料做成乙個臨時檔案放到磁碟上,然後再處理的情況,可以考慮使用這種方式,即不將資料寫入磁碟,所有的資料都在記憶體中進行處理,可以很大程度上提高演算法的效率。

需要注意的是,mem檔案大小是和你的系統記憶體大小有關係。如果使用32位程式的話,處理的資料保守估計不會超過2gb,如果是64位程式的話,只和你機器的記憶體大小有關係了。

使用GDAL的MEM記憶體檔案儲存臨時檔案

在使用gdal編寫演算法的時候,經常會將計算的中間結果存在乙個臨時的影象檔案中,然後使用完再將其刪除,如果臨時檔案就乙個的話,建立乙個也無所謂,但是當乙個複雜的演算法中可能會出現很多個臨時檔案的時候 我在編寫hariss角點自動匹配演算法的時候有4個臨時檔案 這種情況下總覺得臨時檔案很不爽,此外第乙...

在C 中初次使用GDAL

如果要處理柵格資料,特別是格式轉換,地理空間資料抽象庫 gdal 是非常好的。我想使用gdal進行生物多樣性建模專案,所以我看了一下gdal的c 繫結。按照如下步驟你就可以在vs 2010以及vs 2012使用gdal了,所以您需要做的是 設定系統環境變數。在path系統變數中新增包含c progr...

使用GDAL庫中的RPC校正問題

最近將gdal庫更新至1.11版本之後,發現之前寫的rpc像方改正模型校正的結果偏差特別大 更新版本之前結果和pci處理的結果一致 所以初步判斷是gdal庫的bug,經過各個引數修改發現原來是指定的dem取樣方式導致的。當指定dem的取樣方式為最鄰近時,校正結果偏差很大,當dem取樣方式為雙線性取樣...