GDAL綜合整理--6:GDAL部分類說明

在網上看到這篇文章寫得非常全面,而且是中文的,就轉過來了,學習一下
其中有部分內容是重複的,不過不影響,非常好的資料

主要轉自http://blog.csdn.net/liminlu0314?viewmode=contents


GDALMajorObject

所有核心類的父類是GDALMajorObject,它定義了一些操作元數據的屬性和方法供子類繼承。

元數據:data about date 描述數據的數據,majorobject使用GDALMultiDomainMetadata對象存儲元數據。該對象存在一個域名列表和一個元數據內容列表。用戶傳入域名以及元數據內容已進行數據設置。可序列化爲xml。

GDALDriverManager

管理GDALDriver的類,存儲了GDALDriver的數目以及列表。

可以通過序號以及名稱來獲取處理對象數據對應的driver。

使用一個全局變量static volatileGDALDrvierManager poDM管理,在register數據驅動時,通過GetGDALDriverManage這個全局函數,新建或獲取,然後通過RegisterDriver添加對應驅動。

GDALDriver

數據驅動類,只定義了成員方法,沒有成員變量,通過函數指針來實現對於不同的驅動類型採用不同的方式。

有Create方法創建數據集,Delete刪除數據集,Rename重命名數據集,CopyFile,CreateCopy

另外定義了其他函數指針,算是接口了。

在註冊的時候,根據對象類型創建driver,並設置driver的描述,元數據等,並設置函數指針爲對應數據集的靜態函數。如poDriver->pfnOpen = JDEMDataset::Open。其中Open方法爲JDEMDataset中的靜態函數。

GDALDataSet

一套關聯柵格波段,通常來自一個文件。

數據成員包括GDALDriver指針,波段的數目大小,波段列表,引用計數,是否被共享。等信息。以及一個GDALDefaultOverViews對象。提供一個IRasterIO接口給派生類使用,作爲讀取數據的接口。其他方法以及接口介紹如下:

 

 

#include <gdal_priv.h>

GDALDataset的繼承圖表:

GDALMajorObject 《 GDALDataset  《 GDALPamDataset

 

所有成員列表:

 

公有成員函數

Virtual ~GDALDataset()

     銷燬一個打開的GDALDataset

Int GetRasterXSize(void)

         取出柵格寬度,單位像素

Int GetRasterYSize()

         取得柵格高度,單位像素

Int GetRasterCount()

         取得該dataset中柵格波段數目

GDAlRasterBand * GetRasterBand(int)

         爲一個dataset取得波段對象

Virtual void FlushCache(void)

         刷新所有寫入的緩存數據到磁盤

Virtual const char * GetProjectionRef(void)

         取得該dataset的投影定義字符

Virtual CPLErr SetProjection (const char *)

         爲該dataset 設置投影參考字符

Virtual CPLErr GetGeoTransform (double *)

         取得仿射投影變換系數

Virtual CPLErr SetGeoTransform(double *)

         設置仿射投影變換系數

Virtual CPLErr AddBand (GDALDataType eType, char **papszOptions=NULL)

         爲dataset增加波段

Virtual void * GetInternalHandle(const char *)

         取得格式細節的內部有意義的句柄

Virtual GDALDriver * GetDriver(void)

         取得dataset有關係的驅動

Virtual char ** GetFileList(void)

         取得文件構成數據集

Virtual int GetGCPCount()

         取得GCPs的數目

Virtual const char * GetGCPProjection()

         得到GCP的輸出投影

Virtual const GDAL_GCP * GetGCPs()

         取得GCPs

Virtual CPLErr SetGCPs(int nGCPCount, const GDAL_GCP * pasGCPList,const char * pszGCPProjection)

         制定GCPs

Virtual CPLErr AdviseRead(int nXOff, int nYOff, int nXSize, int nYSize,int nBufXSize, int nBuffYSize, GDALDataTyoe eDT, int nBandCount, int *panBandList, char ** papszOptions)

         向驅動告知即將進行的讀請求

Virtual CPLErr CreateMaskBand (int nFlags)

         爲dataset增加一個掩膜

Virtual GDALAsyncReader * BeginAsyncReader(int nXOff, int nYOff, int nXSize, int nYsize,void *pBuf, int nBufXSize, int nBufYSize, GDALDataType eBufType, intnBandCount, int *panBandMap, int PixelSpace, int nLineSpace, int nBandSpace,char **papszOptions)

         設置異步數據請求

Virtual void EndAsyncReader(GDALAsyncReader *)

         結束一個異步請求

CPLerr RasterIO(GDALRWFlag, int, int, int, int, void *, int, int, GDALDataType, int, int*,int,int,int)

         從多個波段中讀寫一定區域的圖像

Int Reference()

          Dataset引用總數加一

Int Dereference ()

         Dataset引用總數減一

GDALAccess GetAcess()

 

Int GetShared()

         返回共享標誌

Void MarkAsShared()

         把dataset標記爲共享可用

CPLErr BuildOverviews (const char *, in,int*, int, int*,GDALProgressFunc, void *)

         構建柵格預覽視圖

 

靜態公有成員函數

 

Static GDALDataset** GetOpenDatasets(int * pnDatasetCount)

         取得所有打開的GDAL dataset 的句柄

 

 

保護成員列表

void RasterInitialize (int, int)

void SetBand (int, GDALRasterBand *)virtualCPLErr IBuildOverviews (const char *, int, int *, int, int *, GDALProgressFunc,void *)virtual CPLErr IRasterIO (GDALRWFlag, int, int, int, int, void *, int,int, GDALDataType, int, int *, int, int, int)CPLErr          BlockBasedRasterIO (GDALRWFlag, int, int, int, int, void *,int, int, GDALDataType, int, int *, int, int, int)void BlockBasedFlushCache ()

 

保護屬性

GDALDriver *  poDriver

GDALAccess eAccess

int nRasterXSize

int nRasterYSize

int nBands

GDALRasterBand **  papoBands

int bForceCachedIO

int nRefCount

int bShared

GDALDefaultOverviews  oOvManager

 

友元

class GDALDriver

class GDALDefaultOverviews

class GDALProxyDataset

class GDALRasterBand

GDALDatasetH GDALOpen(const char *, GDALAccess)

        以GDALDataset的格式打開柵格文件

GDALDatasetH GDALOpenShared(const char *, GDALAccess)

         以GDALDataset的格式打開柵格文件

 

 

詳細說明

一套關聯柵格波段,通常來自一個文件。

一個dataset包封了一個或多個柵格波段

更多詳細討在GDAL Data Model

 

用GDALOpen()或GDALOpenShared()來創建GDALDataset 通過打開一個有名字的的文件

或者用GDALDriver::Create 或 GDALDriver::CreateCopy()來創建一個新的dataset

 

 

構造函數和析構函數文檔

GDALDataset::~GDALDataset  (  )  [virtual]

析構一個打開的GDALDataset。

這是一個可接受的方法來關閉一個GDALDataset 並且重新分配所有關聯的資源。

 

錯誤的單詞?Equivelent(Equivalent)

與之等價的是c 中的GDALClose()。除了GDALClose()首先先減少Reference總數,然後當總數變爲0時再關閉。

對於windows用戶,使用在Dataset對象上刪除操作是不可被使用的,因爲分配和釋放空間跨越了模塊的界限這個已知的issue. 調用 GDALClose()是一個更好的選擇.

參考GDALMajorObject::GetDescription()

 

成員函數文檔

 

CPLErr GDALDataset::AddBand  ( GDALDataType  eType, char **  papszOptions = NULL    )  [virtual]

增加一個波段到dataset中.

如果基本格式支持這種操作的話,這個方法將會在dataset中增加一個新的波段。大部分的格式不支持這種操作。

注意新的GDALRasterBand()不會被返回。 但是在這個操作成功之後可以通過調用函數GDALDataset::GetRasterBand(GDALDataset::GetRasterCount()-1)來取得,因爲最新的波段總是在最後一個波段中。

參數:

         eType新波段中像素的數據類型

         papszOptionsName=value選項字符串的列表。 被支持的選項是格式細節。NULL作爲默認值也可通過。

返回值:

         CE_None成功

         CE_Failure失敗

 

 

CPLErr GDALDataset::AdviseRead  ( int nXOff, 

 int  nYOff, 

 int  nXSize, 

 int  nYSize, 

 int  nBufXSize, 

 int  nBufYSize, 

 GDALDataType  eDT, 

 int  nBandCount, 

  int*  panBandMap, 

 char **  papszOptions  

)  [virtual]

告知驅動器即將進行的讀請求。

一些GDAL 驅動會更有效率的工作,如果它們事先知道即將進行的讀請求的設置。AdviseRead()方法允許程序通知驅動哪個範圍和波段會被讀取。

一些驅動會忽略調adviseRead()的調用,但是它會明顯的增加讀取熟讀在另外一些驅動上。

 

參數:

nXOff 被讀取的波段區域距離左上角的偏離值(單位:像素)。從左邊以0開始

nYOff 被讀取的波段區域距離左上角的偏離值(單位:行)。從頂部以0開始。

nXSize 被讀取的波段區域寬度(單位:像素)

nYSize 被讀取的波段區域高度(單位:行)

nBufXSize 緩衝區圖像的寬度

nBufYSize 緩衝區圖像的高度

eBufType

nBandCount 將要被讀寫的波段數目

panBandMap nBandCount個將被讀寫的波段的列表。注意波段數目至少爲1。將會是NULL來選擇第一個nBandCount波段

papszOptions 一個name=value的關於特殊控制選項的列表,正常來說爲NULL

 

返回值:

 CE_Failure 如果請求無效

 CE_None 如果見效了或被忽略了

參考GDALRasterBand::AdviseRead(),和GetRasterBand().

 

GDALAsyncReader *GDALDataset::BeginAsyncReader  ( int  nXOff, 

 int  nYOff, 

 int  nXSize, 

 int  nYSize, 

 void *  pBuf, 

 int  nBufXSize, 

 int  nBufYSize, 

  GDALDataType  eBufType, 

 int  nBandCount, 

  int*  panBandMap, 

 int  nPixelSpace, 

  int nLineSpace, 

  int nBandSpace, 

  char ** papszOptions  

 )   [virtual]

 

建立異步數據請求。

這個方法在dataset中指定的窗口建立了一個異步的柵格讀取請求到指定的緩衝區。參數爲了windowing,緩衝區大小,緩衝類型和緩衝組織和GDALDataset::RasterIO()的這些類似;

這個調用只會打開請求,填入緩衝區被完成通過調用GetNextUpdateRegion()在返回GDALAsyncReader會話對象

一旦創建對話的所有進程完成時,或者沒有進一步動作的需求時,GDALAsyncReader 對象將會通過GDALDataset::EndAsyncReader()方法自動被銷燬

注意數據緩衝區(pData)在會話的生命週期中可能會潛在的持續更新,但是當對話(GDALAsyncReader)被EndAsyncReader結束時,它不會被重新分配。它會被那個點的程序重新分配。

有關GDAL中異步IO的補充信息可在http://trac.osgeo.org/gdal/wiki/rfc24_progressive_data_support上找到。

這個方法和C的GDALBeginAsyncReader()一樣。

 

CPLErr GDALDataset::BuildOverviews  ( const char *  pszResampling, 

 int  nOverviews, 

  int*  panOverviewList, 

 int  nListBands, 

  int*  panBandList, 

 GDALProgressFunc pfnProgress, 

 void *  pProgressData  

 )

 

建立柵格預覽圖。

如果指定的dataset不支持這個操作,返回值將是CE_Failure, CPLGtLastErrorNo() 將會返回CPLE_NotSupported.

這個方法和C的函數GDALBuildOverviews()相同

 

 

CPLErr GDALDataset::CreateMaskBand  ( int nFlags   )  [virtual]

對dataset增加一個掩膜。

CreateMaskBand()方法的默認執行是在與.ovr操作工具類似的規則的基礎上使用GDALDefualtOverviews對象執行。 一個帶有.msk擴展的TIFF文件會被創建成與原始文件相同的基本名稱,並且會有一個波段。如果可能的話掩膜圖像會是與原始圖像有着相同的block size的壓縮圖像

 

int GDALDataset::Dereference  (  ) 

從dataset引用計數中減一

實例化之後引用計數爲一。一般來說引用計數減到零時這個dataset已經被安全的刪除(關閉)了。

這個方法和C的GDALDereferenceDataset()函數相同。

 

 

void GDALDataset::EndAsyncReader  ( GDALAsyncReader *  poARIO  )  [virtual]

結束異步請求。

這個方法將銷燬一個異步IO請求,並恢復與之相關聯的資源。

這個方法和C的GDALEndAsyncReader()相同。

 

 

void GDALDataset::FlushCache  ( void   )  [virtual]

刷新所有寫入的緩存到磁盤。

任何柵格(或其他GDAL)數據通過GDAL的調用被寫入,但是緩衝區會被內部機制寫入到磁盤。

使用這個方法不會阻止調用GDALClose()來正常關閉一個dataset,並且確保重要的數據不會被FlushCache分配地址寫入發哦文件中。

這個方法和C下面的函數GDALFlushCache()相同。

在GDALPamDataset中執行。

GDALDriver * GDALDataset::GetDriver  ( void   )  [virtual]

取得dataset相關聯的驅動。

這個方法和C的GDALGetDatasetDriver()函數相同。

 

char ** GDALDataset::GetFileList  ( void   )  [virtual]

取得構成dataset的文件。

返回被認爲是構成dataset的文件列表。如果返回一個空的文件列表,意味着認爲沒有本地文件系統的文件和該dataset相關聯(例如一個虛擬的dataset)。這個返回的文件列表是歸調用者擁有的,並可以被CSLDestory()所銷燬。

返回的文件名通常是相對路徑或絕對路徑,這取決於打開dataset時使用的路徑。

這個方法和C的GDALGetFileList()函數相同。

 

int GDALDataset::GetGCPCount  (  )  [virtual]

取得GCP的數目。

這個方法和C的GDALGetGCPCount()相同。

 

 

const char *GDALDataset::GetGCPProjection  (   ) [virtual]

取得GCP輸出投影。

這個方法和C的 GDALGetGCPProjection()相同。

投影字符串遵循GetProjectionRef()的標準規則。

 

 

const GDAL_GCP * GDALDataset::GetGCPs  (  )  [virtual]

取得GCPs。

這個方法和C的GDALDataset::GetGCPs()相同。

 

 

CPLErr GDALDataset::GetGeoTransform  ( double * padfTransform   )  [virtual]

取得仿射變換系數。

取得在pixel/line(P, L)柵格空間和投影座標空間之間變換的係數。

Xp = padfTransform[0] + P*padfTransform[1]+ L*padfTransform[2];

   Yp= padfTransform[3] + P*padfTransform[4] + L*padfTransform[5];

在北朝上的圖像裏,padfTransform[1]是像素寬,padfTransform[5]是像素高。左上像素的左上角就是這個座標(padfTransform[0],padfTransform[3])。

默認的轉換是(0,1,0,0,0,1)即使當返回CE_Failure 錯誤也會被返回,,例如格式上不支持轉換到投影座標系。

注意:GetGeoTransfrom ()不能夠表達處理多種從OGC Grid Coverage pixel/line 到投影變換的方案。最後這個方法將會被讓位於更普遍的scheme。

這個方法和C的GDALGetGeoTransfrom()相同。

 

 

 

 

void * GDALDataset::GetInternalHandle  ( const char *    ) [virtual]

取得一個格式詳盡的內部有意義的句柄。

這個方法和C的GDALGetGeoInternalHandle()相同。

 

 

GDALDataset **GDALDataset::GetOpenDatasets  ( int*  pnCount   ) [static]

取得所有打開的GDAL dataset 的句柄。

這個方法和C的GDAL GetOpenDatasets()相同。

 

 

const char *GDALDataset::GetProjectionRef  (void    ) [virtual]

取得這個dataset的投影定義字符串。

這個方法和C的GDAL GetProjectionRef()相同。

這個返回的字符串使用Open GIS WKTformat定義了該圖像的投影座標系。它也適合於和OGRSpatialReference類使用。

當投影定義不可用時,將返回一個空的字符串(但不是NULL)。

 

 

GDALRasterBand *GDALDataset::GetRasterBand  ( int  nBandId  )  

取得dataset的一個波段對象。

相當於C的GDALGetRasterBand()

 

 

int GDALDataset::GetRasterCount  ( void   ) 

取得dataset的柵格波段數量。

和C的函數GDALGetRasterCount()相同

 

 

int GDALDataset::GetRasterXSize  ( void   )  

取得柵格寬度(單位像素)

等同於C的GDAL GetRasterXSize()

 

 

int GDALDataset::GetRasterYSize  ( void   )  

取得柵格高度(單位像素)

等同於C的GDAL GetRasterYSize()

 

 

int GDALDataset::GetShared  (  )  

返回共享標誌

 

CPLErr GDALDataset::RasterIO  ( GDALRWFlag eRWFlag, 

 int  nXOff, 

 int  nYOff, 

 int  nXSize, 

 int  nYSize, 

 void *  pData, 

 int  nBufXSize, 

 int  nBufYSize, 

 GDALDataType  eBufType, 

 int  nBandCount, 

  int*  panBandMap, 

 int  nPixelSpace, 

 int  nLineSpace, 

 int  nBandSpace  

 )

從多個波段中讀寫一個區域的圖像數據。

這個方法允許從dataset中把一個或多個GDAL柵格波段的區域數據讀取到緩衝區,或者把緩衝區數據寫入到GDAL柵格波段的一個區域中。如果緩衝區的數據類型(eBufType)和GDAL柵格波段的數據類型不同的話,它會自動處理數據類型轉換。如果緩衝區大小(nBufXSize x nBufYSize)和被存取的區域大小(nXSize x nYSize)不同的話,這個方法同樣也會處理圖像的抽取和複製。

nPixelSpace, nLineSpace 和 nBandSpace 參數允許從多種緩衝區組織結構中讀和寫。

爲了最高精確性的全分辨率數據存取,在“區塊分界線”(block boundaries)的讀寫被GetBlockSize()的返回值,也可以使用ReadBlock()和WriteBlock()方法。

這個方法和CGDALDatasetRasterIO()相同

 

 

int GDALDataset::Reference  (  )  

dataset資源計數加一。

實例化之後資源數量爲一。

這個方法和CGDALReferenceDataset()相同。

 

 

CPLErr GDALDataset::SetGCPs  ( int nGCPCount, 

 const GDAL_GCP *  pasGCPList, 

 const char * pszGCPProjection  

 )  [virtual]

分配GCPs。

這個方法和C的GDALSetGCPs()相同。

這個方法給該Dataset和它們的座標系統分配已經通過的設置。內部拷貝是有座標系統和一個點的列表構成,如果適當調用者將會遺留下重新分配這些參數的責任。

大部分的格式不支持GCPs的設置,即使格式能處理GCPs。這些格式將會返回CE_Failure。

 

 

LErr GDALDataset::SetGeoTransform  ( double *   )  [virtual]

設置仿射變換參數。

參考GetGeoTransform()獲得更多細節有關padfTransform係數。

這個方法和CGDALSetGeoTransform()一樣。

 

 

CPLErr GDALDataset::SetProjection  ( const char *    ) [virtual]

爲dataset設置投影參考字符串

這個在OGC WKT或PROJ.4 格式。因爲錯誤的投影字符串,dataset不可寫或者dataset不支持標出投影,會導致一個錯誤出現。許多格式不支持寫入投影。

這個方法和C的GDALSetProjection()相同。

 

 

 

友類和相關函數文檔

 

GDALDatasetH GDALOpen  ( const char *  pszFilename, 

 GDALAccess  eAccess  

 )  [friend]

用GDALDataset方式打開柵格文件。

這個函數將嘗試着打開通過的文件或者輪流通過援引每個已註冊的GDALDriver的打開方法來打開虛擬dataset名字。第一次成功的打開將會返回一個dataset。如果所有的驅動都失敗了,將會返回一個NULL。

一些建議:

如果你用GA_Update 存取方式打開一個dataset對象,不建議在同一個基礎的文件上打開一個新的dataset。

返回的dataset每次僅僅被單線程存取。如果你想通過不同線程打開dataset,你必須增加必要的代碼(mutexes等等)來避免同時使用這個對象。(一些驅動像GeoTIFF支持內態變量,每次更新時一個新的區域被讀取,這樣防止同時使用。)

 

 

GDALDatasetH GDALOpenShared  ( const char *  pszFilename, 

 GDALAccess  eAccess  

 )  [friend]

用GDALDataset方式打開柵格文件。

這個函數工作時和GDALOpen()一樣,但是允許爲其他的調用者dataset分享GDALDataset句柄。

尤其,GDALOpenShared()將首先考慮當前打開和共享的GDALDataset的列表,並且如果GetDescription()名稱和pszFilename精確的匹配的話,將會被引用和返回。

開始於GDAL1.6.0, 如果GDALOpenShared()被兩個不同的線程在一樣的pszFilename上調用,一個不同的differentGDALDataset對象將被返回,通過不同的線程使用同一個dataset是不安全的,除非用戶在代碼中明確使用了互斥。

 

GDALRasterBand

一個單一的柵格數據波段

存在一個GDALRasterBlock友元

存在一個GDALDataset對象(GDAL貌似很喜歡把外層對象的指針存在分類的對象裏面。如在學生的信息裏面存儲班級的信息,班級的信息裏面要有一個年級的指針,當然,班級類是學生類的友元,年級類是班級類的友元。難道是學生犯錯了,然後由班級處置的意思?)

Rasterband中定義了比rasterdataset更細緻的數據類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章