GDAL学习笔记(2)

发布于 2023-03-29  583 次阅读


摘自《GDAL源码剖析与开发指南》 李民录

书里的内容应该是来自官方文档的Raster Data Model

Raster Data Model — GDAL documentation

GDAL数据集总体概况

数据集(Dataset)

数据集是由栅格波段和一些相关的信息共同组成的(具体参考GDALDataset类)。在一个数据集中所有的波段都具有相同的大小,即图像行数和列数相等;相关信息包括该数据的地理坐标、投影信息以及一些元数据信息等,其中元数据信息是由形如"名称:值"的字符串组成的字符串列表。下面小节中的所有内容都是数据集中包含的信息。

坐标系统(Coordinate System)

数据集中的坐标系统是使用OpenGIS的WKT(WellKnown Text)字符串格式来表示的,包含以下内容。

  • 坐标系统名称
  • 地理坐标系统名称
  • 大地水准面
  • 椭球体名称、长半轴和扁率
  • 中央经线名称,与本初子午线的偏移量
  • 投影方式(如横轴墨卡托投影)
  • 投影参数列表(如中央经线)
  • 中央经线名称、与本初子午线的偏移量投影方式(如横轴墨卡托投影)投影参数列表(如中央经线)
  • 单位名称、单位与米或者弧度之间的转换系数坐标轴名称和顺序以上各项对应的EPSG代码
  • 以上各项对应的EPSG代码

仿射地理坐标转换(Affine GeoTransform)

仿射变换包含六个参数,可以使用函数GDALDataset:GetGeoTransform()获取,这六个参数用一个double【6】数组来表示,含义分别如下,其中前面的序号为该数组的下标。

  • 图像左上角的X坐标
  • 图像横向(东西方向)的分辨率
  • 旋转角度,如果图像北方朝上,该值为0
  • 图像左上角的Y坐标
  • 旋转角度,如果图像北方朝上,该值为0
  • 图像纵向(南北方向)的分辨率

通过上面的说明,我们可以得知图像行列号和地理空间坐标之间的变换关系如下。

Xgeo=GT(0)+Xpixel*GT(1)+Yline*GT(2)Ygeo=GT(3)+Xpixel*GT(4)+Yline*GT(5)

在北方向上的图像中,参数GT(2)和GT(4)的值是0,GT(1)表示像元宽度,GT(5)表示像元高度。点(GT(0),GT(3))表示图像左上角的横纵坐标值。

需要注意的是,在行列号坐标中,(0.0,0.0)表示图像的左上角坐标,(像元宽个数,像元高个数)表示图像的右下角坐标。图像的左上角像元的中心点坐标是(0.5,0.5)。

地面控制点(GCPs)

数据集中有可能包括一系列的地面控制点,用来确定图像的地理参考坐标。所有的控制点都是在同一个坐标系统下的(可以使用函数GDALDataset:GetGCPProjection()来获取地面控制点的投影信息),每一个GCP(使用GDAL_GCP结构体来表示)包括下面的内容。

typedef struct 
char
 *pszId;
char
 *pszInfo;
double  dfGCPPixel;
double dfGCPLine;
double  dfGCPX;
double dfGCPY;
double  dfGCPZ;
}GDAL_GCP;

pszld字符串是当前数据集所有GCP点中的某一个GCP点的唯一标识符(这个标识符通常用数字表示,但也不是所有的情况下都这样)。pszlnfo 通常是一个空字符串,可以存储用户自己描述该GCP的文本信息。这个字符串还可以存储GCP的一些状态信息,比如GCP的时间等。

坐标(Pixel,Line)表示该点在图像上的位置,坐标(X,Y,Z)表示该点在地理参考坐标系中的位置,通常Z值是0。

GDAL数据模型中不会存储用GCP点对进行图像纠正的转换方程,这个转换方程常常由应用程序进行处理,一般使用1次到5次多项式进行转换。

元数据(Meta data)

GDAL中的元数据是对该数据的一个辅助说明,元数据的格式是由一系列形如“名称=值”的字符串组成的列表。元数据的名称由特定的符号构成(不能包含空格或者其他特殊字符),值可以是任意长度,可以包括除了空值(ASCII的0值)的任何字符。

数据集中最好不要存储太多元数据,如果元数据大小超过100KB就可能导致性能下降。

子数据集域(Subdatasets Domain)

子数据集域是含有很多个子数据集的字符串列表,通常用来提供指向多个影像(如HDF 和NITF格式)的指针,这些影像存储在同一个多影像文件中

图像结构域(lmage_Structure Domain)

在默认域的元数据与影像有关,而与影像在磁盘中的存储方式没有特定关系。也就是说,当需要将数据集中的影像存储为一种新格式的时候,这些元数据信息可以很方便地复制到新的图像中。此外还有一些信息是和图像的格式及存储机制紧密关联的,为了防止这些信息在写入新图像的时候被复制,将其存储在一个叫 IMAGE STRUCTURE 的特殊域中,通常这里存储的东西不会写入到新的图像中去。

RPC域(RPC Domain)

RPC元数据域存储的是有理函数模型的系数,该模型可用于图像行列号与空间参考位置间的变换。

RPCs in GeoTIFF (maptools.org)

XML域(XML:Domains)

XML 域指任何由"xml:"为前缀组的一个字符串,它不是形如"名称/值"这种常规格式的元数据,而是一个简单的XML格式的长字符串。

栅格波段(Raster Band)

在GDAL中栅格波段使用GDALRasterBand类来表示。它表示一个栅格波段、通道或者图层。一个波段不一定代表整个图像,比如一个24bit的RGB图像中就含有三个波段,分别是红波段,绿波段和蓝波段。

栅格波段包含下列属性:

● 用行列数表示的图像的宽和高。如果是原始数据,那么图像的宽高就和数据集里面的一样。另外,GDALRasterBand 还可以表示金字塔图像的波段,如果是金字塔图像的波段的话,里面的宽高就和原始图像的宽高不一样。

● 数据类型(GDALDataType),应该是Byte、UInt16、Int16、UInt32、Int32、Float32、Float64以及复数类型CInt16、CInt32、CFloat32和CFloat64中的一个。

● 块大小,通过块读取数据是最高效的方式。

● 名称/值的元数据字符串对,该元数据的格式和数据集中的一样,但包含的可能是波段特有的信息。

●一个可选的波段描述字符串。

●一个可选的用来描述NODATA值的像元值。

●一个可选的NODATA值表示的掩码波段或者在某些文件中作为透明波段。

●可选的类别名称列表(用于分类图)。

● 可选的最大值和最小值。

● 可选的偏移量和缩放比例,用来对图像的像素值进行变换,比如变换高度到米等。● 可选的栅格单位名称,比如可以用来表示高程数据的线性单位。

● 波段的颜色信息,是下面值中的某一个:

■ GCI_Undefined:默认值,未定义类型。

■ GCI_GrayIndex:灰度图像。

■ GCIPaletteIndex:颜色表图像。

■ GCIRedBand:RGB或RGBA图像的R部分。

■ GCI_GreenBand:RGB或RGBA图像的G部分。

■ GCI_BlueBand:RGB或RGBA图像的B部分。

■ GCI_AlphaBand:RGBA图像的Alpha部分。

■ GCI_HueBand:HLS图像的色调部分。

■ GCI SaturationBand:HLS图像的饱和度部分。

■ GCILightnessBand:HLS图像的亮度部分。

■ GCI_CyanBand:CMY或CMYK图像的青色部分。

■ GCI_MagentaBand:CMY或CMYK图像的品红部分。

■ GCI_YellowBand:CMY或CMYK图像的黄色部分。

■ GCI BlackBand:CMYK图像的黑色部分。

● 颜色表,后面有更详细的说明。

● 关于金字塔是否可用的信息。

颜色表(Color Table)

颜色表的定义如下,使用C语言的风格定义

typedef struct
{
short c1;
short c2;
short c3;
short
 c4;
} GDALColorEntry;

颜色表通常是颜色调色板的一个值,c1/c2/c3/c4 四个值的不同含义对应不同的调色板,具体表示如下。

● GPI_Gray:使用cl表示灰度值。

● GPI_RGB:c1表示红色,c2表示绿色,c3表示蓝色,c4表示alpha通道。

● GPI_CMYK:cl表示青色,c2表示品红,c3表示黄色,c4表示黑色。

● GPI_HLS:c1表示色调,c2表示亮度,c3表示饱和度。

为了给栅格单元赋予颜色,我们需要将像素值作为下标与颜色表关联,将颜色表中的颜色赋给对应的像素,所以颜色表中的值总是从0开始递增的。

快视图(Overviews)

一个波段中可能有0个或多个快视图。每个快视图都是一个独立的GDALRasterBand,其大小与下层的栅格大小不一样,但是快视图表示的区域范围与整个图像是一致的。

快视图,是通过对原始图像进行降采样得到的,用于图像的快速显示。

我们可以通过波段类中的HasArbitraryOverviews属性来判断是否有快视图,如果返回TRUE表示有,就可以读取任何分辨率的快视图。

GDAL常用类

在GDAL中,所有的类都是从GDALMajorObject派生出来的,常用的类继承关系图如图所示。从 GDALMajorObject 继承的类有 GDALDataset、GDALDriver、GDALDriverManager 和GDALRasterBand,其中GDALDataset是相关的栅格波段的集合,这些波段一般来自同一个文件,一个dataset通常包括一个或多个栅格波段;GDALDriver是格式化的驱动,这个类的每个实例都支持一种格式,并且管理该格式的相关信息;GDALDriverManager是管理文件格式驱动的注册信息的类,可以使用GetGDALDriverManager()来获取所有驱动信息,即驱动列表;GDALRasterBand用于处理一个单波段或者单通道的栅格数据。

  • GDALDriveManager
  • GDALDriver
  • GDALDataset
  • GDALRasterBand

GDAL Raster相关的API,懒得复制了

API — GDAL documentation

更新中。。。

届ける言葉を今は育ててる
最后更新于 2023-03-29