栅格数据模型

本文试图描述GDAL数据模型。这就是GDAL数据存储可以包含的信息类型及其语义。

数据集

数据集(由 GDALDataset 类)是相关栅格标注栏及其公用信息的集合。尤其是数据集有一个栅格大小(像素和线条)的概念,适用于所有的波段。数据集还负责所有波段的地理参考变换和坐标系定义。数据集本身也可以有关联的元数据,即字符串形式的名称/值对列表。

注意,GDAL数据集和栅格带数据模型松散地基于OpenGIS网格覆盖规范。

坐标系

数据集坐标系表示为OpenGIS已知的文本字符串。它可以包含:

  • 整体坐标系名称。

  • 地理坐标系名称。

  • 基准标识。

  • 椭圆体名称、半长轴和反展平。

  • 一个基本子午线名称和格林威治的偏移量。

  • 投影法类型(即横向墨卡托)。

  • 投影参数列表(即中央子午线)。

  • 单位名称,以及转换为米或弧度的系数。

  • 轴的名称和顺序。

  • 以上大部分代码都是根据EPSG等权威机构提供的预定义坐标系编写的。

有关OpenGIS WKT坐标系定义和操作它们的机制的更多信息,请参阅osr_教程文档和/或OGRSpatialReference类文档。

返回的坐标系 GDALDataset::GetProjectionRef() 描述由 GDALDataset::GetGeoTransform() . 返回的坐标系 GDALDataset::GetGCPProjection() 描述由返回的GCP的地理参考坐标 GDALDataset::GetGCPs() .

注意,返回的坐标系字符串“”表示对地理参考坐标系一无所知。

仿射变换

GDAL数据集有两种方式来描述栅格位置(像素/线坐标)和地理参考坐标之间的关系。第一种,也是最常用的是仿射变换(另一种是GCPs)。

仿射变换由 GDALDataset::GetGeoTransform() 使用以下关系将像素/线坐标映射到地理参考空间:

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

对于北上图像,GT(2)和GT(4)系数为零,GT(1)为像素宽度,GT(5)为像素高度。(GT(0),GT(3))位置是栅格左上像素的左上角。

注意,上面的像素/线坐标是从左上角的(0.0,0.0)到右下角的(宽度单位为像素,高度单位为像素)。因此,左上角像素中心的像素/线位置为(0.5,0.5)。

GCPs

数据集可以有一组控制点,将栅格上的一个或多个位置与地理参考坐标相关联。所有GCP共享一个地理参考坐标系(由返回 GDALDataset::GetGCPProjection() ). 每个GCP(表示为GDAL_GCP类)包含以下内容:

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

pszId字符串是这个数据集上GCP集合中GCP的唯一标识符(通常是,但不总是数字的)。pszInfo通常是空字符串,但可以包含与GCP关联的任何用户定义的文本。这也可能包含关于GCP状态的机器可解析信息,尽管目前还没有完成。

(像素,线)位置是栅格上的GCP位置。(X,Y,Z)位置是关联的地理参考位置,Z通常为零。

GDAL数据模型并不意味着必须从GCPs生成转换机制。。。这是留给应用程序的。然而,一阶到五阶多项式是常见的。

通常,数据集将包含仿射地理变换、GCPs或两者都不包含。两者兼而有之是不常见的,而且没有定义哪个是权威的。

元数据

GDAL元数据是作为名称/值对列表保存的辅助格式和特定于应用程序的文本数据。名称必须是行为良好的标记(没有空格或奇数字符)。值可以是任意长度,并且包含除嵌入的空值(ASCII零)之外的任何内容。

元数据处理系统没有很好地调整以处理非常大的元数据体。为数据集处理超过10万个元数据可能会导致性能下降。

一些格式将支持通用(用户定义)元数据,而其他格式驱动程序将特定格式字段映射到元数据名称。例如,TIFF驱动程序将一些信息标记作为元数据返回,包括日期/时间字段,该字段返回为:

TIFFTAG_DATETIME=1999:05:11 11:29:56

元数据被拆分为名为“域”的命名组,默认域没有名称(NULL或“”)。有些特定的域是为了特殊目的而存在的。请注意,目前无法枚举给定对象可用的所有域,但应用程序可以“测试”它们知道如何解释的任何域。

以下元数据项在默认域中具有定义良好的语义:

  • AREA_或_POINT:可以是“AREA”(默认值)或“POINT”。指示是否应假定像素值表示像素区域上的采样或像素中心的点采样。这并不是为了影响仍然以区域为导向的地理参照的解释。

  • NODATA_VALUES:该值是一个由空格分隔的像素值列表,与数据集中可用于标识数据集中的NODATA像素的频带数相匹配。对于这种类型的nodata,只有当且仅当所有频带与nodata_VALUES元组中的相应值匹配时,才将像素视为所有频带中的nodata。目前,GDAL驱动程序、算法或实用程序并没有广泛遵守此元数据。

  • 矩阵表示法:该值用于极化SAR数据集,包含提供该数据的矩阵表示法。以下是可接受的值:

    • SCATTERING

    • SYMMETRIZED_SCATTERING

    • COVARIANCE

    • SYMMETRIZED_COVARIANCE

    • COHERENCY

    • SYMMETRIZED_COHERENCY

    • KENNAUGH

    • SYMMETRIZED_KENNAUGH

  • 极化互操作:该元数据项是为极化SAR数据的栅格波段定义的。这指示此标注栏表示的数据的指定矩阵表示中的哪个条目。例如,对于作为散射矩阵提供的数据集,此元数据项的可接受值为HH、HV、VH、VV。例如,当数据集是协方差矩阵时,该元数据项将是协方差11、协方差22、协方差33、协方差12、协方差13、协方差23之一(因为矩阵本身是厄米矩阵,即描述矩阵所需的所有数据)。

  • 元数据类型:如果存在图像域,则该项由处理元数据的读取器组成。现在请各位读者:

    • DG:DigitalGlobe图像元数据

    • GeoEye(或正式的空间成像)图像元数据

    • OV:OrbView图像元数据

    • DIMAP:昴宿星图像元数据

    • MSP:Resurs DK-1图像元数据

    • ODL:Landsat图像元数据

  • 缓存路径:缓存目录路径。现在,此元数据项仅由WMS驱动程序设置。当数据集使用缓存数据删除或外部程序需要为某个感兴趣的区域在缓存中放置磁贴时,这非常有用。

子数据集域

子数据集域包含子数据集列表。通常,这用于提供指向存储在单个多图像文件中的图像列表的指针。

例如,具有两个图像的NITF可能具有以下子数据集列表。

SUBDATASET_1_NAME=NITF_IM:0:multi_1b.ntf
SUBDATASET_1_DESC=Image 1 of multi_1b.ntf
SUBDATASET_2_NAME=NITF_IM:1:multi_1b.ntf
SUBDATASET_2_DESC=Image 2 of multi_1b.ntf

名称的值是可以传递给 GDALOpen() 访问文件。“描述”值是一个更便于用户使用的字符串,可以在选择器中显示给用户。

支持子数据集的驱动程序公布 DMD_SUBDATASETS 能力。当--format和--formats选项传递给命令行实用程序时,将报告此信息。

目前,支持子数据集的驱动程序有:ADRG、ECRGTOC、GEORASTER、GTiff、HDF4、HDF5、netCDF、NITF、NTv2、OGDI、PDF、PostGISRaster、Rasterlite、RPFTOC、RS2、TileDB、WCS和WMS。

图像结构域

默认域中的元数据旨在与映像相关,而不是与映像在磁盘上的存储方式特别相关。也就是说,当数据集被复制到新格式时,它适合与数据集一起复制。一些感兴趣的信息与特定的文件格式和存储机制密切相关。为了防止这种情况随数据集一起被复制,它被放置在一个称为IMAGE_STRUCTURE的特殊域中,该域通常不应被复制为新格式。

目前,以下项目由 RFC 14:图像结构元数据 在图像结构域中具有特定的语义。

  • 压缩:用于此数据集或频带的压缩类型。压缩类型名称没有固定的目录,但是如果给定的格式包含压缩创建选项,则此处应使用与此处相同的值列表。

  • NBITS:用于此频带或此数据集的频带的实际位数。通常只有当数据类型的位数不是标准的时才出现,例如当1位TIFF通过GDAL表示为GDT_Byte时。

  • 交错:这只适用于数据集,值应该是像素、线或带之一。它可以用作数据访问提示。

  • PIXELTYPE:这可能出现在GDT_字节带(或相应的数据集)上,并且对于识别SIGNEDBYTE类型的应用程序,其值SIGNEDBYTE表示128到255之间的无符号字节值应解释为-128到-1之间的值。

RPC域

RPC元数据域包含描述图像的有理多项式系数几何模型(如果存在)的元数据。此几何模型可用于像素/线和地理参考位置之间的转换。定义模型的项目有:

  • 错误偏差:错误-偏差。以米为单位的图像中所有点的水平轴的均方根偏差误差(未知时为-1.0)

  • 错误:错误-随机。图像中每个点每水平轴的均方根随机误差(米)(如果未知,则为-1.0)

  • LINE_OFF:线偏移

  • SAMP_OFF:采样偏移

  • 纬度偏移

  • LONG_OFF:大地经度偏移

  • 高度偏移:大地高度偏移

  • 线比例尺:线比例尺

  • 采样比例:采样比例

  • 纬度比例尺:大地纬度比例尺

  • LONG_比例尺:大地经度比例尺

  • 高度比例尺:大地高度比例尺

  • 线数系数(1-20):线分子系数。rn方程分子中多项式的20个系数。(空格分隔)

  • LINE_DEN_COEFF(1-20):线分母系数。rn方程分母中多项式的20个系数。(空格分隔)

  • SAMP_NUM_COEFF(1-20):样本分子系数。cn方程分子中多项式的20个系数。(空格分隔)

  • SAMP_DEN_COEFF(1-20):样本分母系数。cn方程分母中多项式的20个系数。(空格分隔)

这些字段直接派生自文档prespective GeoTIFF RPC document(http://GeoTIFF.maptools.org/RPC_prop.html),而该文档又紧密地基于NITF RPC00B定义建模。

用line_OFF和SAMP_OFF表示的线和像素偏移相对于像素的中心。

图像域(遥感)

对于卫星或航空图像,可能存在图像域。这取决于图像文件附近是否存在特殊的元数据文件。在同一目录下的文件,由一组元数据读取器测试图像文件,如果元数据读取器可以处理文件,则用以下项填充图像域:

  • 卫星或扫描仪名称

  • 云覆盖:云覆盖。0-100或999之间的值(如果不可用)

  • ACQUISITIONDATETIME:以UTC为单位的图像采集日期时间

xml:域

任何前缀为“xml:”的域名都不是普通的名称/值元数据。它是存储在一个大字符串中的单个XML文档。

栅格波段

栅格带用GDAL表示,其中 GDALRasterBand 上课。它表示单个栅格带/通道/层。它不一定代表整个图像。例如,一个24位的RGB图像通常被表示为一个包含三个波段的数据集,一个波段代表红色,一个波段代表绿色,一个波段代表蓝色。

栅格标注栏具有以下特性:

  • 以像素和线条表示的宽度和高度。这与为数据集定义的相同(如果这是一个全分辨率波段)。

  • A datatype (GDALDataType). One of Byte, UInt16, Int16, UInt32, Int32, UInt64, Int64, Float32, Float64, and the complex types CInt16, CInt32, CFloat32, and CFloat64.

    UInt64 and Int64 data types have been added in GDAL 3.5. Beyond reading and write pixel values, their support is limited. Some algorithms might use 64-bit floating-point internally (warping), as well as some methods returning only double values (GetMinimum(), GetMaximum(), etc.), or even 32-bit floating point (overview, RasterIO resampling). Hence the range where exact values are preserved can be [0, 2^53] (or less if 32-bit floating-point is used).

  • 块大小。这是首选的(有效的)访问块大小。对于平铺图像,这将是一个平铺。对于扫描线方向的图像,这通常是一条扫描线。

  • 名称/值对元数据的列表,格式与数据集相同,但包含可能特定于此频带的信息。

  • 可选的描述字符串。

  • 可选的单个nodata像素值(有关多波段样式nodata值,请参见数据集上的nodata_VALUES元数据)。

  • 一个可选的nodata掩码带,将像素标记为nodata,或者在某些情况下标记为透明度,如RFC 15:band Masks中所述,并记录在GDALRasterBand::GetMaskBand()中。

  • 类别名称的可选列表(实际上是主题图像中的类名)。

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

  • 存储在元数据中的可选统计信息:

    • 统计学平均:平均

    • 统计最小值:最小值

    • 统计最大值:最大值

    • 统计学:标准差

    • STATISTICS_APPROXIMATE:仅当GDAL计算了近似统计数据时才出现

    • 统计有效百分比:有效(非nodata)像素的百分比

  • 用于将栅格值转换为意义完整值(即将高度转换为米)的可选偏移和比例。

  • 可选的栅格单位名称。例如,这可能表示高程数据的线性单位。

  • 乐队的色彩诠释。这是其中之一:

    • GCI_Undefined:默认值,未知。

    • GCI_GrayIndex:这是一个独立的灰度图像

    • GCI_PaletteIndex:此栅格用作颜色表的索引

    • GCI_RedBand:此栅格是RGB或RGBA图像的红色部分

    • GCI_GreenBand:此栅格是RGB或RGBA图像的绿色部分

    • GCI_BlueBand:此栅格是RGB或RGBA图像的蓝色部分

    • GCI_AlphaBand:这个栅格是RGBA图像的alpha部分

    • GCI_HueBand:这个栅格是HLS图像的色调

    • GCI_饱和带:该栅格是HLS图像的饱和

    • GCI_LightnessBand:此栅格是HLS图像的色调

    • GCI_青色波段:该波段是CMY或CMYK图像的青色部分

    • GCI_洋红色波段:此波段是CMY或CMYK图像的洋红色部分

    • GCI_yellow band:该波段是CMY或CMYK图像的黄色部分

    • 这个波段是CMYK图像的黑色部分。

  • 颜色表,稍后将详细描述。

  • 了解降低分辨率的俯视图(金字塔)(如有)。

颜色表

颜色表由以下结构在C中描述的零个或多个颜色项组成:

typedef struct
{
    /* gray, red, cyan or hue */
    short      c1;

    /* green, magenta, or lightness */
    short      c2;

    /* blue, yellow, or saturation */
    short      c3;

    /* alpha or black band */
    short      c4;
} GDALColorEntry;

颜色表还有一个调色板解释值(GDALPaletteInterp),它是以下值之一,并指示如何解释颜色项的c1/c2/c3/c4值。

  • GPI_Gray:使用c1作为灰度值。

  • GPI-RGB:c1为红色,c2为绿色,c3为蓝色,c4为α。

  • GPI_CMYK:c1为青色,c2为洋红色,c3为黄色,c4为黑色。

  • GPI_HLS:使用c1作为色调,c2作为亮度,c3作为饱和度。

要将颜色与栅格像素相关联,像素值用作颜色表的下标。这意味着颜色总是从零开始并上升。在颜色表中查找之前,没有指示预缩放机制的规定。

概览

一个乐队可能有零或更多的概述。每个概述都表示为“独立的” GDALRasterBand . 概览的大小(像素和线条)将不同于基础栅格,但概览覆盖的地理区域与全分辨率波段相同。

与读取所有全分辨率数据和降采样相比,使用俯视图可以更快地显示降低分辨率的俯视图。

如果栅格可以有效地以任何分辨率读取,但没有明显的概览级别,则波段还具有hasrabilityoverviews属性。这适用于一些FFT编码的图像,或通过网关的图像,在远程点可以有效地进行下采样。