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