访问量: 173 次浏览
声明:本文档为基于“柴树杉”翻译文档的再发布版本。本文档对原文档进行了一些修正与补充。 原英文文档链接为:http://www.gdal.org/gdal_datamodel.html 原翻译文档链接为:http://sites.google.com/site/chaishushan/文档翻译/gdal/gdal数据模型
一个dataset(对应GDALDataset类)是一个光栅数据以及和它有关系的信息的集合。特别地dataset包含了光栅数据的大小(像素、线等)。data set同时也为对应的光栅数据指定了坐标系统。dataset本身还可以包含元数据,它们以一种键/值对的方式来组织。 GDAL的数据集是基于OpenGIS Grid Coverages的格式定义的。 坐标系统 Dataset的坐标系统由OpenGIS WKT字符串定义,它包含了:
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()返回。每个G CP(对应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中的一个,或者两个都没有。两个都有很少见,而且无法用权威坐标系定义。
GDAL元数据是一种辅助的数据格式,并且以键/值对序列的方式呈现。一般键的名称有严格的定义(没有空白、或某些特殊字符等)。键所对应的值 可以是任意的长度,包 含任意的内容(NULL字符除外)。元数据处理系统一般不能处理很大的数据,例如一个大于100K的数据很可能导致抱歉,原翻译文档暂打不处理的终止。 虽然某些键现 在可能没有,但是以后也可能会被定义。一些格式的数据可以支持一些基本的元数据(可以由用户自己定义),可以使用驱动程序访问这些键/值。例如,如果数据含有date /time标志,TIFF格式的驱动程序可能只是简单地返回基本的信息:
TIFFTAG_DATETIME=1999:05:11 11:29:56
元数据的键/值对还可以被组织到某些域中,默认的域是没有名字的。当然,为了保存某些特殊的信息可能需要定义特殊的域。目前虽然不能列举出一个对象所需要的所有域,但 是程序可以测试任何我们已经知道确切含义的域。
SUBDATASETS域保存了一个子datasets列表。这个列表通常是对应一个复合影象中每个子影象的位置(像HDF或NITF)。例如一个由4个影象组成的N ITF可能含有类似下面的子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为后缀的键所对应的值可以以一种友好的方式显示给用户。
默认域中的元数据一般和影象有关,但是和影象的具体格式无关。换言之,与影象格式无关的信息在复制dataset的时候一般也会被复制。为了处理那些与影象格式相关的 数据,一般将相关的键/值对放到IMAGE_STRUCTURE域中,并且在复制dataset的时候可以不被复制。 IMAGE_STRUCTURE域中的一个项是数据的压缩方式,对应的键名为COMPRESSION,对应的值说明的压缩的方式。
任何以"xml:"为前缀名的域都不是一个普通的键/值对方式的元数据。它是一个单一的XML文档,以一个大的字符串方式保存
一个波段的光栅数据对应GDAL中的GDALRasterBand类。它描述了单个波段的band/channel/layer。它并不是一次描述整个影象。例如,一 个24bit的RGB影象在一个dataset中一般被描述为三个波段,分别对应red/green/blue三中颜色。 一个波段的光栅数据具有以下性质:
每个波段解释,具体为: GCI_Undefined: 默认,未知信息。
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的值可以作为调色板索引得到真正的颜色 值。
一个波段可以有0个或多个快视图。每一个快视图都表示一个“独立”的栅格波段。快视图的大小(行与列)与基础的栅格数据不一样,但是快视图覆盖的地理区域与全分辨率的 波段一样。 快视图使用降低的分辨率来显示一个概况,而不必读取所有的全分辨率的数据再下联采样。 波段可能还有一个“HasArbitraryOverviews” 属性,当为真值时,表示栅格数据可以高效地读取任何分辨率直而没有明显的快视图级别。这个应用到一些使用FFT编码的影像,或者通过网关取回的影像(如OGDI),这 里下联采样可以在远程的点有效率地完成。