《GDAL源码剖析与开发指南》一一1.9 简单的调用
本節書摘來自異步社區出版社《GDAL源碼剖析與開發指南》一書中的第1章,第1.9節,作者:李民錄 更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
1.9 簡單的調用
GDAL源碼剖析與開發指南
關于GDAL的使用,關鍵是要熟悉GDAL的組織結構、類以及類的函數等。最常用的就是動態庫的GDAL,當然我們也可以使用靜態庫,這里只是簡單地介紹使用動態GDAL庫來做開發。
下面我們簡單地使用C++、C#、Python和Java 4種語言分別進行示例,來說明如何使用GDAL進行開發。
1.9.1 C ++使用GDAL
首先我們打開Visual Studio2008,新建一個Win32的控制臺工程(名字叫GDALCppTest),然后在工程的屬性對話框中,找到“配置屬性”→“C/C++”→“常規”,在右側的“附加包含目錄”中將GDAL的include文件夾路徑填寫到輸入框,如圖1-14所示。
我們繼續在屬性對話框中找到“配置屬性”→“鏈接器”→“常規”,在右側的“附加庫目錄”中將GDAL的lib文件夾路徑填寫完整,如圖1-15所示。
最后在“配置屬性”→“鏈接器”→“輸入”,在右側的“附加依賴項”中將gdal_i.lib填寫完整。然后點擊“確定”按鈕即可。至此,使用GDAL的環境全部搭建完成,剩下的就是在代碼中使用GDAL了。
我們將以下代碼復制到剛才新建工程中的cpp文件中,保存后編譯。正常情況下系統會提示生成成功,然后我們將GDAL編譯出來的gdal110.dll及其依賴的dll文件復制到編譯出來的exe所在目錄,最后運行,會在控制臺上輸出圖像的一些信息。
#include "gdal\_priv.h" int main() {//注冊文件格式GDALAllRegister();const char* pszFile = "C:\\Test.img";//使用只讀方式打開圖像GDALDataset *poDataset = (GDALDataset*) GDALOpen( pszFile, GA\_ReadOnly );if( poDataset == NULL ){printf( "File: %s不能打開!\n",pszFile);return 0;}//輸出圖像的格式信息printf( "Driver:%s/%s\n",poDataset->GetDriver()->GetDescription(),poDataset->GetDriver()->GetMetadataItem( GDAL\_DMD\_LONGNAME) );//輸出圖像的大小和波段個數printf( "Size is%dx%dx%d\n",poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),poDataset->GetRasterCount());//輸出圖像的投影信息if( poDataset->GetProjectionRef() != NULL )printf( "Projectionis `%s'\n", poDataset->GetProjectionRef() );//輸出圖像的坐標和分辨率信息double adfGeoTransform[6];if( poDataset->GetGeoTransform( adfGeoTransform) == CE\_None ){printf( "Origin =(%.6f,%.6f)\n",adfGeoTransform[0], adfGeoTransform[3]);printf( "PixelSize = (%.6f,%.6f)\n",adfGeoTransform[1], adfGeoTransform[5]);}//讀取第一個波段GDALRasterBand *poBand = poDataset->GetRasterBand( 1 );//獲取該波段的最大值最小值,如果獲取失敗,則進行統計int bGotMin, bGotMax;double adfMinMax[2];adfMinMax[0] = poBand->GetMinimum( &bGotMin);adfMinMax[1] = poBand->GetMaximum( &bGotMax);if( ! (bGotMin&& bGotMax) )GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);printf( "Min=%.3fd,Max=%.3f\n", adfMinMax[0], adfMinMax[1] );int nXSize = poBand->GetXSize();float *pafScanline = new float[nXSize];//讀取圖像的第一行數據poBand->RasterIO(GF\_Read, 0, 0, nXSize,1, pafScanline, nXSize,1, GDT\_Float32, 0, 0 );delete []pafScanline;//關閉文件GDALClose((GDALDatasetH)poDataset); }執行的結果如圖1-16所示。
1.9.2 C#使用GDAL
我們首先打開Visual Studio 2008,新建一個Visual C#的控制臺應用程序(名字叫GDALCSTest),然后在工程的“引用”點擊右鍵,打開“添加引用”對話框,找到瀏覽標簽頁,將GDAL以_cshrp.dll結尾的四個dll添加到工程中,如圖1-17所示。
接下來我們將下面的代碼復制到剛才新建工程中的Program.cs文件中,保存后編譯。正常情況下系統會提示生成成功,然后我們將GDAL編譯出來的gdal110.dll及其依賴的dll文件復制到編譯出來的exe所在目錄,最后運行,會在控制臺上輸出圖像的一些信息。
需要值得注意的是,在64位的系統下,如果GDAL編譯的時候是32位的,那么選擇編譯C#工程的時候,我們要使用X86編譯才能正常運行,否則會報錯。
using System; using OSGeo.GDAL; using OSGeo.OSR; namespace GDALCSTest {class Program{static void Main(string[] args){Console.WriteLine("");try{//注冊文件格式Gdal.AllRegister();string strFile = "F:\\Work\\GDAL源碼剖析\\GDALTest\\Test.tif";//使用只讀方式打開圖像Dataset ds = Gdal.Open(strFile, Access.GA\_ReadOnly);if (ds == null){Console.WriteLine("不能打開:" + strFile);System.Environment.Exit(-1);}Driver drv = ds.GetDriver();if (drv == null){Console.WriteLine("Can't get driver.");System.Environment.Exit(-1);}//輸出圖像的格式信息Console.WriteLine("Dirver :" + drv.GetDescription());Console.WriteLine("Using driver " + drv.LongName);//輸出圖像的大小和波段個數Console.WriteLine(" RasterCount: " + ds.RasterCount);Console.WriteLine(" RasterSize (" + ds.RasterXSize + "," + ds.RasterYSize + ")");//輸出圖像的投影信息Console.WriteLine(" Projection: " + ds.GetProjectionRef());//輸出圖像的坐標和分辨率信息double[] adfGeoTransform = new double[6];ds.GetGeoTransform(adfGeoTransform);Console.WriteLine("Origin =(" + adfGeoTransform[0] + "," + adfGeoTransform[3] + ")");Console.WriteLine("PixelSize = (" + adfGeoTransform[1] + "," + adfGeoTransform[5] + ")");Console.WriteLine("");//讀取第一個波段Band band = ds.GetRasterBand(1);double val;int hasval;band.GetMinimum(out val, out hasval);if (hasval != 0)Console.WriteLine(" Minimum: " + val.ToString());band.GetMaximum(out val, out hasval);if (hasval != 0)Console.WriteLine(" Maximum: " + val.ToString());int nXSize = ds.RasterXSize;float[] pafScanLine;pafScanLine = new float[nXSize];band.ReadRaster(0,0, nXSize, 1, pafScanLine, nXSize, 1, 0, 0);}catch (Exception e){Console.WriteLine("Application error: " + e.Message);}}} }1.9.3 Python使用GDAL
在使用Python版本GDAL之前,我們首先要確保GDAL的Python版本安裝成功,否則無法按照下面的步驟進行安裝。
按照1.7.3小節的python編譯步驟進行編譯,之后我們將GDAL所有的dll文件復制到python版本的GDAL安裝目錄中,如圖1-18所示。
接下來我們使用記事本等工具,將以下代碼復制進去,保存為GDALPythonTest.py。
from osgeo import gdal from osgeo.gdalconst import * gdal.AllRegister() #使用只讀方式打開圖像 ds = gdal.Open("F:\Work\GDAL源碼剖析\GDALTest\Test.tif",GA\_ReadOnly) #輸出圖像的格式信息 print ds.GetDriver().ShortName #輸出圖像的大小和波段個數 print ds.RasterXSize print ds.RasterYSize print ds.RasterCount #輸出圖像的投影信息 print ds.GetProjectionRef() #輸出圖像的坐標和分辨率信息 adfGeoTransform = ds.GetGeoTransform() print adfGeoTransform[0] print adfGeoTransform[3] print adfGeoTransform[1] print adfGeoTransform[5] band = ds.GetRasterBand(1) #讀取圖像的第一行數據 data = band.ReadRaster( 0, 0, ds.RasterXSize, 1, ds.RasterXSize, 1, band.DataType )我們在開始菜單中的Python目錄中打開“IDLE(Python GUI)”,在彈出的程序中,使用文件菜單中的打開命令打開剛才保存的GDALPythonTest.py文件,如圖1-19所示,然后按“F5”運行,即可輸出影像的一些信息,如圖1-20所示。
**
1.9.4 Java使用GDAL**
Java使用GDAL,這里使用的IDE是Eclipse。我們使用Eclipse新建一個工程,名字叫GDALJavaTest,然后在這個工程中新建一個名為GDALTestApp的類,打開GDALTestApp.java,將里面的代碼修改為以下代碼內容,然后保存,如圖1-21所示。
我們將之前編譯Java版本GDAL時生成的五個文件(dll和jar文件)復制到工程所在文件夾中,然后點擊“工程”右鍵,選擇“Build Path->configure build path”,彈出“屬性”對話框,然后切換到“libraries”標簽,點擊“Add Jars…”,選擇gdal.jar和名字中有ini的dll文件,添加到lib中,如圖1-22所示,然后確定,編譯運行即可。
**
1.9.5 調試GDAL源代碼**
很多時候我們需要查看GDAL的源代碼以了解它的內部實現,為了更好地理解源代碼,可以通過調試查看源代碼中變量的內容。
調試GDAL的源代碼,需要GDAL的debug版本以及編譯GDAL的時候生成的pdb等調試文件。此外我們也可以把GDAL的源代碼加入到自己的工程中,但是這樣太費時費力。
這里介紹一個很簡單的方法:首先編譯一下GDAL的debug版本(具體步驟可以參考1.6節的內容),將編譯生成的文件(主要有gdal110.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal110.pdb,gdal110.ilk,gdal110.exp等)復制到自己工程的生成目錄中,然后調試自己的程序,在執行到GDALOpen函數(或者其他GDAL的函數)時按“F11”鍵,就可以進入到GDAL的源代碼中進行調試。
對于使用C#語言來說,也可以跨語言來對GDAL進行調試。首先我們要確保GDAL庫編譯時使用debug版本,同時編譯的C#版本也是debug版本。在執行調試時我們需要將GDAL的C#版本中八個dll文件及其對應的pdf等文件全部復制到測試程序輸出目錄,然后在測試目錄的屬性中勾選“啟用非托管代碼調試”,最后啟動,按“F11”鍵即可進入GDAL源碼。
總結
以上是生活随笔為你收集整理的《GDAL源码剖析与开发指南》一一1.9 简单的调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《信息物理融合系统(CPS)设计、建模与
- 下一篇: 《Excel 职场手册:260招菜鸟变达