其中有部分內容是重複的,不過不影響,非常好的資料
主要轉自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更細緻的數據類型