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更细致的数据类型

转载自:https://blog.csdn.net/rrrrssss00/article/details/7455478

You may also like...