GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。
下載:
這里不介紹編譯方法,只下載和使用已經編譯好的版本:
GDAL主頁:http://www.gdal.org/,里面有下載、API、支持格式列表及說明等信息,
另外還有一個比較好的API網頁
http://geoinformatics.tkk.fi/doc/Geo-GDAL/html/class_geo_1_1_g_d_a_l.html#92b259b91236580e33369984929f33d5
在主頁中,有Download鏈接,http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries,里面包含各平台的庫文件下載,
這里介紹C#下的使用方法,進入http://www.gisinternals.com/sdk/進行下載,頁面中有4種下載類型,其中第三種包含源代碼,其它均只包含DLL及可執行文件,主要是版本不同
在該頁面中,根據自己使用的Windows版本及VS版本下載相應的庫文件
引用:
由於本人使用C#進行開發,這里用C#為例:
下載Release版本的包(不包含源代碼),將解壓后bin目錄下所有DLL以及bin\gdal\csharp目錄下的8個DLL文件(gdal_csharp,gdal_wrap,gdalconst_csharp,gdalconst_wrap,ogr_csharp,ogr_warp,osr_csharp,osr_wrap)拷貝到VS項目的程序文件夾bin中
注:解壓目錄中bin\gdal-data文件夾包含了一些庫定義的信息以及坐標信息等,也可以拷貝到VS項目的程序文件夾bin(要啟用gdal-data文件夾,還需要在程序中進行注明,使用 Gdal.SetConfigOption("GDAL_DATA", Application.StartupPath + "\\gdaldata"); 該語句中的路徑根據實際情況變動)
在VS中,添加對gdal_csharp,gdalconst_csharp,ogr_csharp,osr_csharp四個DLL的引用
這樣,就可以在程序中使用GDAL庫了
添加了對GDAL庫的引用后,開始使用GDAL庫函數前,需要進行注冊,
使用using OSGeo.GDAL;來引用GDAL的命名空間,
在程序中使用 Gdal.AllRegister();語句進行注冊
GDAL使用時有一些環境變量,可以通過設置這些變量來更改全局設置
使用Gdal.SetConfigOption(string key, string value);函數來進行設置
其中Key代表環境變量名,Value代表環境變量的值,可用變量名及取值范圍可參考
http://trac.osgeo.org/gdal/wiki/ConfigOptions#GDALOptions 以及
http://geoinformatics.tkk.fi/doc/Geo-GDAL/html/class_geo_1_1_g_d_a_l.html#92b259b91236580e33369984929f33d5
(兩個地方都好像不太全)
如果重復為某個變量賦值,那么以最后那一次為准
其中使用比較多的有:
GDAL_FILENAME_IS_UTF8 中文路徑名
GDAL_DATA DATA文件路徑
GDAL_CACHEMAX 最大緩存區大小(IN BYTE),可以用Gdal.SetCacheMax函數代替
HFA_USE_RRD IMG文件是否生成RRD格式的金字塔
……
引用庫文件並注冊完畢后,即可使用GDAL庫函數來打開影像文件
GDAL庫中打開影像文件非常簡單,使用Gdal.Open(string path,Acess eAcess)即可
第一個參數為影像路徑,第二個參數為權限,分只讀和可寫兩種
該函數返回值為Dataset類型
可以從該Dataset中獲取到一些影像的基本信息,例如影像寬度和高度,波段數,坐標變換參數,坐標信息等
注:該函數獲取到的Dataset中只包含影像的信息,並不包含影像所有像素的信息,要得到像素信息,需要用ReadRaster函數讀取到數組中。
例
Dataset ds = Gdal.Open(rasterPath,Access.GA_ReadOnly)
int rasterX = ds.RasterXSize; //影像寬度
int rasterY = ds.RasterYSize; //影像高度
int bandCount = ds.RasterCount; //波段數
double tmpD = new double[6];
ds.GetGeoTransform(tmpD); //影像坐標變換參數
string proj = ds.GetProjection(); //影像坐標系信息(WKT格式字符串)
……
注:這里的GeoTransform(影像坐標變換參數)的定義是:通過像素所在的行列值得到其左上角點空間坐標的運算參數
例如:某圖像上(P,L)點左上角的實際空間坐標為:
Xp = GeoTransform[0] + P * GeoTransform[1] + L * GeoTransform[2];
Yp = GeoTransform[3] + P * GeoTransform[4] + L * GeoTransform[5];
在創建影像前,需要先引用GDAL庫的注冊函數Gdal.AllRegister()
1:GDAL支持的影像格式
首先要明確GDAL所支持的影像格式,
http://www.gdal.org/formats_list.html 中列出了GDAL支持的影像格式,每一種影像格式在GDAL中都對應一種驅動(Driver),
網頁中表格
第一列(Long Format Name)為影像格式的描述,點擊該列還可通過鏈接查看該格式的詳細信息,其中包括該格式的創建參數
第二列(Code)為該格式在GDAL中的代碼,也是驅動的名稱,
第三列(Creation)代表該格式是否支持創建影像
第四列(Georeferencing)未知,可能是指是否支持對該格式賦予空間信息
第五列(Maximum file size)為影像大小限制
第六列(Compiled by default)指是否默認支持該格式,還是需要其它插件的支持
2:獲取驅動
在GDAL中創建影像,先需要明確待創建影像的格式,並獲取到該影像格式的驅動:
Driver d = Gdal.GetDriverByName("HFA");
使用該函數獲取影像格式的驅動,其中參數為驅動名稱,可以在上文中表格第二列查得,例如HFA即為Erdas Img的驅動名
3:驅動的屬性(元數據)
對每一種驅動(Driver),都有一些屬性,通過d.GetMetadata("")可以獲取到,結果是一個字符串數組,內容與網頁上查到的基本相同,包括:是否允許創建,是否拷貝創建,支持的像素濃度類型,支持的創建參數等
4:調用Create函數創建影像
獲取驅動后,使用
[csharp] view plaincopy
- d.Create(string uft8_path,int xSize,int ySize,int bands,DataType eType,string[] options)
函數即可創建影像
該函數的參數為:
uft8_path:影像路徑
xSize:寬度(像素值)
ySize:高度
bands:波段數
DataType:像素深度,可以設為Byte,Float,Int等等
options:創建影像的可選項設置,GDAL對不同的格式設置了不同的創建參數,詳細信息參考上文中影像格式的介紹
該函數返回值為Dataset,與上一篇文件中打開影像得到的Dataset相同,可以在此基礎上對影像數據進行操作
Create函數的示例代碼:
[csharp] view plaincopy
- 1)Dataset dsout = d.Create(this.cut_savePathBox.Text, width, height, bands.Length, DataType.GDT_Byte, null);
- 2)Dataset dsout = d.Create(this.cut_savePathBox.Text, width, height, bands.Length, DataType.GDT_Byte, n new string[] { "AUX=YES", "STATISTICS=YES" });
5:調用CreateCopy函數進行拷貝創建
CreateCopy函數支持從已打開的影像創建一個拷貝的影像,保留原影像的一些基本信息,例如寬高,波段數,坐標,偏移等
[csharp] view plaincopy
- d.CreateCopy(string utf8_path,Dataset src,int strict,string [] options,GDALProcessFuncDelegate callback,string callback_data)
參數如下:
utf8_path:路徑
src:打開的影像數據
strict:取值是0或者1,取值為非的時候說明即使不能精確匹配地由原數據轉化為目標數據,程序也照樣執行CreateCopy方法,不會產生致命錯誤。這種錯誤有可能是輸出格式不支持輸入數據格式象元的數據類型,或者是目標數據不支持寫入空間參考等等[該參數介紹轉自http://www.gissky.net/Article/645.htm]
options:與Create函數相同
callback,callback_data:傳入一個委托,可用於實時顯示創建數據的進度,不需要時可設為NULL
例如:
[csharp] view plaincopy
- Dataset ds = d.CreateCopy(path,dsin,1,null,null,null);