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取樣方式為雙線性取樣...