寫在開頭:最近工作太忙,沒時間更新,今天抽空更新一篇,上篇部落格是四,這篇是六,中間還有一篇第五篇,主要將GDAL中的Python工具集,儘快給大家更新。一、簡單的調用
關於GDAL的使用,網上的資料都很多,主要還是要熟悉GDAL的組織圖,類以及類的函數等,熟悉了,使用GDAL就不在話下了。最常用的就是動態庫的GDAL,當然你也可以使用靜態庫,這裡只是簡單的介紹使用動態GDAL庫來做開發。
首先開啟VS,建立一個工程,控制台的就成。然後在工程的屬性對話方塊中,找到【配置屬性】-【C/C++】-【常規】,右側的【附加元件封裝含目錄】中,將GDAL的include檔案夾路徑填寫到這裡,如:
第二、繼續在屬性對話方塊中,找到【配置屬性】-【連結器】-【常規】,右側的【附加庫目錄】中,將GDAL的lib檔案夾路徑填寫到這裡,如:
第三、在【配置屬性】-【連結器】-【輸入】,右側的【附加依賴項】中,將gdal_i.lib填寫到此處。然後點擊確定即可。至此,使用GDAL的環境全部搭建完成,剩下的就是在您的代碼中使用GDAL了。
將下面的代碼(代碼摘自GDAL官方指南:http://gdal.org/gdal_tutorial.html)貼到剛才建立的工程中的cpp檔案中,儲存後編譯,正常情況下會提示產生成功,然後運行,會在控制台上將映像的資訊輸出。
#include "gdal_priv.h"#include "cpl_conv.h" //for CPLMalloc() int main(){ //註冊檔案格式 GDALAllRegister(); const char* pszFile = "C:\\Test.img"; GDALDataset *poDataset; //使用唯讀方式開啟映像 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; int nBlockXSize, nBlockYSize; int bGotMin, bGotMax; double adfMinMax[2]; //讀取第一個波段 poBand = poDataset->GetRasterBand( 1 ); //擷取映像的塊大小並輸出 poBand->GetBlockSize(&nBlockXSize, &nBlockYSize ); printf( "Block=%dx%dType=%s, ColorInterp=%s\n", nBlockXSize, nBlockYSize, GDALGetDataTypeName(poBand->GetRasterDataType()), GDALGetColorInterpretationName( poBand->GetColorInterpretation())); //擷取該波段的最大值最小值,如果擷取失敗,則進行統計 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] ); //輸出映像的金字塔資訊 if( poBand->GetOverviewCount() > 0 ) printf( "Band has%d overviews.\n", poBand->GetOverviewCount() ); //輸出映像的顏色表資訊 if( poBand->GetColorTable() != NULL) printf( "Band hasa color table with %d entries.\n", poBand->GetColorTable()->GetColorEntryCount() ); float *pafScanline; int nXSize = poBand->GetXSize(); //讀取映像的第一行資料 pafScanline = (float*) CPLMalloc(sizeof(float)*nXSize); poBand->RasterIO(GF_Read, 0, 0, nXSize,1, pafScanline, nXSize,1, GDT_Float32, 0, 0 ); CPLFree(pafScanline); //關閉檔案 GDALClose((GDALDatasetH)poDataset);}
二、GDAL原始碼調試
在很多時候我們需要看看GDAL的內部實現,當然可以直接查看GDAL的原始碼,但是直接看原始碼,不能很好的理解,這時候就需要調試查看原始碼中變數的內容。調試GDAL的原始碼,需要GDAL的debug版本,以及編譯GDAL的時候的pdb等調試檔案。當然也可以把GDAL的原始碼加入到你的工程中,但是這樣太費時費力。
下面就有一個很簡單的方法,可以直接調試進GDAL的原始碼中,首先編譯一下GDAL的debug版本,將編譯產生的檔案,主要有gdal18.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal18.pdb,gdal18.ilk,gdal18.exp等檔案,將gdal18開頭的檔案拷貝到自己工程的組建目錄中,然後調試自己的程式,在執行到GDALOpen函數(或者其他GDAL的函數)時按F11鍵,就會進入到GDAL的原始碼中進行調試GDAL代碼。
三、GDAL使用樣本
1、使用GDAL進行映像裁切,參考http://blog.csdn.net/liminlu0314/article/details/6136512
2、使用GDAL進行映像重採樣,參考http://blog.csdn.net/liminlu0314/article/details/6130064
3、使用GDAL建立金字塔,參考http://blog.csdn.net/liminlu0314/article/details/6127755