博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDAL数据模型
阅读量:5062 次
发布时间:2019-06-12

本文共 5761 字,大约阅读时间需要 19 分钟。

GDAL数据模型

翻译:柴树杉() 

原文: 

该文档简要描述了GDAL的数据模型,该模型可以容纳其他各种信息。

数据集(Dataset)

一个dataset(对应GDALDataset类)是一个光栅数据以及和它有关系的信息的集合。 特别地dataset包含了光栅数据的大小(像素、线等)。dataset同时也为对应的 光栅数据指定了坐标系统。dataset本身还可以包含元数据,它们以一种键/值对 的方式来组织。

GDAL的数据集是基于OpenGIS Grid Coverages的格式定义的。

坐标系统

Dataset的坐标系统由OpenGIS WKT字符串定义,它包含了:

  • 一个全局的坐标系名称。
  • 一个地理坐标系名称。
  • 一个基准标识符。
  • 椭球体的名字。长半轴(semi-major axis)和反扁率(inverse flattening)。
  • 初子午线(prime meridian)名和其与格林威治子午线的偏移值。
  • 投影方法类型(如横轴莫卡托)。
  • 投影参数列表(如中央经线等)。
  • 一个单位的名称和其到米和弧度单位的转换参数。
  • 轴线的名称和顺序。
  • 在预定义的权威坐标系中的编码(如EPSG)。

更多信息请参考OpenGIS WKT坐标系统定义,以及osr教程文档和 OGRSpatialReference类的描述文档。

在GDAL中,返回坐标系统的函数是GDALDataset::GetProjectionRef()。 它返回的坐标系统描述了地理参考坐标,暗含着仿射地理参考转换,这地理参考转换是由GDALDataset::GetGeoTransform()来返回。由GCPs地理参考坐标描述的坐标系统是由 GDALDataset::GetGCPProjection()返回的。

注意,返回的坐标系统字符串“”表示未知的地理参考坐标系统。

仿射地理变换

GDAL数据集有两种方式描述栅格位置(用点/线坐标系)以及地理参考坐标系之间的关系。 第一种也是比较常用的是使用仿射转换,另一种则是GCPs。

仿射变换由6个参数构成,它们由GDALDataset::GetGeoTransform()返回它们把点/线坐标, 用下面的关系转将点/线影射到地理坐标:

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

 

假设影像上面为北方,GT2和GT4参数为0,而GT1是象元宽,GT5是象元高, (GT0,GT3)点位置是影像的左上角。

注意,上面所说的点/线坐标系是从左上角(0,0)点到右下角,也就是坐标轴从 左到右增长,从上到下增长的坐标系(即影象的行列从左下角开始计算)。 点/线位置中心是(0.5,0.5)。

GCPs

数据集可以由一系列控制点来定义空间参考坐标系。所有的GCPs共用一个地理参考坐标系, 由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状态中包含机器可分析信息,虽然现在还支持。

坐标(dfGCPPixel,dfGCPLine)是栅格中的GCP位置。坐标(dfGCPX,dfGCPY,dfGCPZ)是 联合的地理参考位置(dfGCPZ通常是0)。

GDAL数据模型没有实现由GCPs产生坐标系的变化的机制,而是把具体的操作留给用户实现。 通常1到5阶多项式是常用的方法。

通常一个数据集会包含仿射地理变换,或GCPS中的一个,或者两个都没有。两个都有很少见, 而且无法用权威坐标系定义。

元数据(Metadata)

GDAL元数据是一种辅助的数据格式,并且以键/值对序列的方式呈现。一般键的 名称有严格的定义(没有空白、或某些特殊字符等)。键所对应的值 可以是任意的长度, 包含任意的内容(NULL字符除外)。元数据处理系统一般不能处理很大的数据,例如一 个大于100K的数据很可能导致处理的终止。

虽然某些键现在可能没有,但是以后也可能会被定义。 一些格式的数据可以支持一些基本的元数据(可以由用户自己定义), 可以使用驱动程序访问这些键/值。例如,如果数据含有date/time标志, TIFF格式的驱动程序可能只是简单地返回基本的信息:

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

 

元数据的键/值对还可以被组织到某些域中,默认的域是没有名字的。当然, 为了保存某些特殊的信息可能需要定义特殊的域。目前虽然不能列举出一个对象所需要 的所有域,但是程序可以测试任何我们已经知道确切含义的域。

SUBDATASETS 域

SUBDATASETS域保存了一个子datasets列表。这个列表通常是对应一个复合影象中每个 子影象的位置(像HDF或NITF)。例如一个由4个影象组成的NITF可能含有类似下面的 子datasets列表:

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  SUBDATASET_3_NAME=NITF_IM:2:multi_1b.ntf  SUBDATASET_3_DESC=Image 3 of multi_1b.ntf  SUBDATASET_4_NAME=NITF_IM:3:multi_1b.ntf  SUBDATASET_4_DESC=Image 4 of multi_1b.ntf  SUBDATASET_5_NAME=NITF_IM:4:multi_1b.ntf  SUBDATASET_5_DESC=Image 5 of multi_1b.ntf

 

以_NAME为后缀的键所对应的值可以传递给GDALOpen()用于访问文件。以_DESC为 后缀的键所对应的值可以以一种友好的方式显示给用户。

IMAGE_STRUCTURE 域

默认域中的元数据一般和影象有关,但是和影象的具体格式无关。换言之, 与影象格式无关的信息在复制dataset的时候一般也会被复制。为了处理那些与 影象格式相关的数据,一般将相关的键/值对放到IMAGE_STRUCTURE域中,并且在复制 dataset的时候可以不被复制。

IMAGE_STRUCTURE域中的一个项是数据的压缩方式,对应的键名为COMPRESSION, 对应的值说明的压缩的方式。

xml: 域

任何以"xml:"为前缀名的域都不是一个普通的键/值对方式的元数据。它是一个 单一的XML文档,以一个大的字符串方式保存

Raster Band

一个波段的光栅数据对应GDAL中的 GDALRasterBand类。它描述了单个波段的 band/channel/layer。它并不是一次描述整个影象。例如,一个24bit的RGB影象 在一个dataset中一般被描述为三个波段,分别对应red/green/blue三中颜色。

一个波段的光栅数据具有以下性质:

  • 行列数。如果没有抽样的话,该值和dataset定义的相同。
  • 数据类型 (GDALDataType)。可以是Byte、UInt16、Int16、UInt32、Int32、Float32、Float64,或者是复合类型CInt16、CInt32、CFloat32或 CFloat64。
  • 块的大小。这是建议的缓冲块的大小。对于块式存储的影象来说,可能是一个块的大小。对于以扫描线方式的影象,可能是一个扫描线的大小。
  • 元数据中的name/value列表,和dataset中相同,但是可能更侧重当前波段的特征。
  • 可选择的参数(字符串)。
  • An optional list of category names (effectively class names in a thematic image).
  • An optional minimum and maximum value.
  • An optional offset and scale for transforming raster values into meaning full values (ie translate height to meters)
  • 可选的光栅名称。这个特性可以用来指定一些比较重要的数据。
  • 每个波段解释,具体为:
    • GCI_Undefined: 默认,未知信息。
    • GCI_GrayIndex: 为一个独立的灰度影象。
    • GCI_PaletteIndex: this raster acts as an index into a color table
    • GCI_RedBand: RGB或RGBA影象的红色波段。
    • GCI_GreenBand: RGB或RGBA影象的绿色波段。
    • GCI_BlueBand: RGB或RGBA影象的蓝色波段。
    • GCI_AlphaBand: RGBA影象的alpha通道。
    • GCI_HueBand: HLS影象的色调。
    • GCI_SaturationBand: HLS影象的饱和度。
    • GCI_LightnessBand: HLS影象的光强。
    • GCI_CyanBand: CMY或CMYK影象的cyan波段。
    • GCI_MagentaBand: CMY或CMYK影象的magenta波段。
    • GCI_YellowBand: CMY或CMYK影象的yellow波段。
    • GCI_BlackBand: CMYK影象的black波段。

     

  • 颜色表,描述光栅数据的更多的细节。
  • Knowledge of reduced resolution overviews (pyramids) if available.

颜色表

一个颜色表包含0个或多个颜色结构。结构体定义如下:

typedef struct{    /- gray, red, cyan or hue -/    short      c1;    /- green, magenta, or lightness -/        short      c2;    /- blue, yellow, or saturation -/    short      c3;    /- alpha or blackband -/    short      c4;      } GDALColorEntry;

 

颜色表同时还对应一个调色板(GDALPaletteInterp),GDALColorEntry中的c1/c2/c3/c4的 值可以作为调色板索引得到真正的颜色值。

  • GPI_Gray: c1作为灰度值。
  • GPI_RGB: c1/c2/c3依次为Red/Green/Blue,c4对应alpha通道。
  • GPI_CMYK: c1为cyan,c2为magenta,c3为yellow,c4为black。
  • GPI_HLS: c1为hue,c2为lightness,c3为saturation。

用颜色表表示时,每个像素保存的只是像素颜色在颜色表的位置。每个颜色的索引从 0开始递增。这里并没有提供针对颜色表的缩放机制。

总结

A band may have zero or more overviews. Each overview is represented as a "free standing" GDALRasterBand. The size (in pixels and lines) of the overview will be different than the underlying raster, but the geographic region covered by overviews is the same as the full resolution band.

The overviews are used to display reduced resolution overviews more quickly than could be done by reading all the full resolution data and downsampling.

Bands also have a HasArbitraryOverviews property which is TRUE if the raster can be read at any resolution efficiently but with no distinct overview levels. This applies to some FFT encoded images, or images pulled through gateways (like OGDI) where downsampling can be done efficiently at the remote point.

转载于:https://www.cnblogs.com/liuyunfeifei/archive/2012/11/29/2794640.html

你可能感兴趣的文章
类与对象课后作业
查看>>
基于visual Studio2013解决算法导论之004随机排列数组
查看>>
Centos6.5下rsync文件同步安装配置及遇到的问题解决方法
查看>>
【笔记】如何在for语句中迭代多个可迭代对象
查看>>
C++ Primer Plus 读书笔记(第10、11章)
查看>>
默认构造函数
查看>>
JAVA基础补漏--ArrayList
查看>>
6.游戏特别离不开脚本(3)-JS脚本操作java(直接解析JS公式,并非完整JS文件或者函数)...
查看>>
超文本标记语言(HTML)
查看>>
MFC的初始化过程和消息映射技术
查看>>
Windows中使用Mysql-Proxy实现Mysql读写分离
查看>>
编程之美 set 5 寻找数组中最大值和最小值
查看>>
[百度空间] [原] Empty base class optimization
查看>>
keycode对照表
查看>>
BZOJ3444: 最后的晚餐
查看>>
ConnectionPoolTimeoutException: Timeout waiting for connection
查看>>
HorizontalScrollView实现先左滑动后右滑动动画
查看>>
编译Android系统源码(高通平台)
查看>>
The packages can be overrided by Java Endorsed Standards
查看>>
彻底理解android中的内部存储与外部存储
查看>>