GDAL源碼剖析(六)之GDAL開發及其調試

來源:互聯網
上載者:User
寫在開頭:最近工作太忙,沒時間更新,今天抽空更新一篇,上篇部落格是四,這篇是六,中間還有一篇第五篇,主要將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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.