【GDAL】聊聊GDAL的数据模型

GDAL是个非常优秀的GIS数据操作库,最近在和实习生介绍GDAL的简单使用,顺手写下记录

本篇记录栅格数据,代码环境为C#

在GDAL中,栅格数据大致是以一个Dataset对应一个栅格数据文件(.Tif/GeoTiff格式),而这个栅格中的各种信息被包含在Dataset的对象中作为属性。

基本上一个栅格数据在GDAL的数据模型中存储是基于波段的方式,一般一个单波段数据在GDAL中读取后,所得到的Dataset中仅包含一个Band对象,而BandCount属性也为1.多波段数据类似,即是说在GDAL里的Dataset对象与在ArcGIS里所谈的栅格数据集是类似的概念。

这里以官方文档为准搬运相关的概念和说明。

Dataset

A dataset (represented by the GDALDataset class) is an assembly of related raster bands and some information common to them all. In particular the dataset has a concept of the raster size (in pixels and lines) that applies to all the bands. The dataset is also responsible for the georeferencing transform and coordinate system definition of all bands. The dataset itself can also have associated metadata, a list of name/value pairs in string form.

Note that the GDAL dataset, and raster band data model is loosely based on the OpenGIS Grid Coverages specification.

其中标红的部分是在具体的栅格数据处理中我们应该关注的内容,包括数据的大小(图像的长宽),地理参考和坐标系定义, 数据的元数据等。这些项目在Dataset对象中定义,对所有这个Dataset下的Band有效。

接下来首先讨论Dataset中包含的基本内容。

非常重要的是数据的投影和地理参考。

数据的坐标系【Coordinate System】

GDAL的坐标系定义采用OpenGIS的投影字符串规范表示,所以当你使用 Dataset.GetProjection()方法时会发现返回值为一个字符串而不是什么Projection对象。这保证在大部分情况下数据的投影文件(信息)能够被GDAL读取并正确解释。这个坐标系定义中包含以下内容:

  • An overall coordinate system name.
  • A geographic coordinate system name.
  • A datum identifier.
  • An ellipsoid name, semi-major axis, and inverse flattening.
  • A prime meridian name and offset from Greenwich.
  • A projection method type (i.e. Transverse Mercator).
  • A list of projection parameters (i.e. central_meridian).
  • A units name, and conversion factor to meters or radians.
  • Names and ordering for the axes.
  • Codes for most of the above in terms of predefined coordinate systems from authorities such as EPSG.

这里感觉需要提一下的就是在调用一些GDAL的投影转换方法时,要求的参数可能写作“WKT”,熟悉OpenGIS的会知道这是OpenGIS WKT coordiante System Definitions,也就是这里的投影字符串。

个人感觉稍微有用一些的Tips是最近同事提醒的,原来用于判定两个数据是否同一个坐标系统我是直接采用Dataset.GetProjection()对得到的字符串做Equals判断,这样并不严谨。原因自然是某些软件读取了数据之后会将其WKT坐标系定义(此处存疑)修改为其他标准的坐标系定义,所以更建议使用GDAL中的OGR库的SpatialReference对象进行判定。

代码示例如下(暂时没学会怎么插入代码段,先截图了)

因为GDAL是C++的库,所以习惯各方面保持C++的风格,比如条件判断基本是以01方式做,需要习惯下。

转换参数【 GeoTransform】

这个参数一般可以被叫做6参数,因为其对象是个double[6]数组。这个参数用于标定数据的地理位置等信息,相关的方法是 Dataset.GetGeoTransform(out double[] args)、 Dataset.SetGeoTransform(double[] args)

GDAL datasets have two ways of describing the relationship between raster positions (in pixel/line coordinates) and georeferenced coordinates. The first, and most commonly used is the affine transform (the other is GCPs).

关于六参数的具体解释将在另外的文章中解释。

一个真实地理坐标和影像数据行列的转换关系如下:

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

【GCPs】

关于GCPs了解不多,这里暂时搬运官方解释

A dataset can have a set of control points relating one or more positions on the raster to georeferenced coordinates. All GCPs share a georeferencing coordinate system (returned by GDALDataset::GetGCPProjection()). Each GCP (represented as the GDAL_GCP class) contains the following:

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

元数据【Metadata】

这个部分请参阅前一篇博客,关于GDAL的Metadata

栅格波段 【Raster Band】

波段对象(Raster Band)是GDAL中的重要对象。一个Band对象表示一个波段/通道/图层,因此一个RGB数据在GDAL的模型中实际上是一个包含3个波段的Dataset,其中波段与Red/Green/Blue分别对应。

关于波段的内容同样将在另一篇博客中详细解释。

【Color Table】

这个几乎没用过,直接搬运了。

先看结构定义:

A color table consists of zero or more color entries described in C by the following structure:

 1 typedef struct
 2 {
 3     /- gray, red, cyan or hue -/
 4     short      c1;
 5     /- green, magenta, or lightness -/
 6     short      c2;
 7     /- blue, yellow, or saturation -/
 8     short      c3;
 9     /- alpha or black band -/
10     short      c4;
11 } GDALColorEntry;

The color table also has a palette interpretation value (GDALPaletteInterp) which is one of the following values, and indicates how the c1/c2/c3/c4 values of a color entry should be interpreted.

  • GPI_Gray: Use c1 as gray scale value.
  • GPI_RGB: Use c1 as red, c2 as green, c3 as blue and c4 as alpha.
  • GPI_CMYK: Use c1 as cyan, c2 as magenta, c3 as yellow and c4 as black.
  • GPI_HLS: Use c1 as hue, c2 as lightness, and c3 as saturation.

To associate a color with a raster pixel, the pixel value is used as a subscript into the color table. That means that the colors are always applied starting at zero and ascending. There is no provision for indicating a pre-scaling mechanism before looking up in the color table.

【Overviews】

根据官方说明,这个是波段的缩略图。

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.

关于最后两个对象,后期研究一下再来补充。

感谢观看

时间: 2024-10-08 18:36:35

【GDAL】聊聊GDAL的数据模型的相关文章

【GDAL】GDAL栅格数据结构学习笔记(一): 关于Metadata

在维护一段代码时看到前任程序员写的获取栅格数据的CellSize的功能,竟然在知道GDAL的情况下去调用AE的接口来解算,觉得费解. 原来的思路是使用AE的Raster对象读取出Raster的文件大小和真实投影坐标对构造的矩形外框,再来算每个cell的长宽,觉得实在无语. 于是研究了下GDAL怎么获取到一些数据基本信息(Metadata)的. 搬运一下GDAL官方对其数据模型的Metadata的描述: GDAL metadata is auxiliary format and applicati

【GDAL】聊聊GDAL的数据模型(二)——Band对象

在GDAL中栅格数据直接参与各种计算的重要对象是Band 摘录官方描述: Raster Band A raster band is represented in GDAL with the GDALRasterBand class. It represents a single raster band/channel/layer. It does not necessarily represent a whole image. For instance, a 24bit RGB image wo

GDAL源码剖析(一)(转载)

GDAL源码剖析(一) GDAL 前言:一直在使用和研究GDAL的相关东西,发现网上对GDAL的内容倒是不少,但是很少有系统的介绍说明,以及内部的一些结构说明,基于这些原因,将本人的一些粗浅的理解放在此处,形成一个系列,暂时名为<GDAL源码剖析>(名称有点大言不惭,欢迎大家口水吐之,板砖拍之),供大家交流参考,有什么错误之处,望大家不吝指正,本系列对于GDAL的使用均是在Windows平台下,对于Linux平台下的不在此系列讨论范围之内.此外,转载本博客内容,请注明出处,强烈鄙视转载后不注明

GDAL生成Erdas Imagine

GDAL原生支持超过100种栅格数据类型,涵盖所有主流GIS与RS数据格式,包括?  ArcInfo grids, ArcSDE raster, Imagine, Idrisi, ENVI, GRASS, GeoTIFF ?  HDF4, HDF5?  USGS DOQ, USGS DEM ?  ECW, MrSID ?  TIFF, JPEG, JPEG2000, PNG, GIF, BMP 完整的支持列表可以参考http://www.gdal.org/formats_list.html 导入

GDAL的RASTERIO功能

为了能快速的显示大影像,最近一直在学习GDAL,GDAL确实是一个功能强大的开源库,其核心部分数据集和波段,下面这个图很详细的描述了它们之间的关系,还有其中的细节:     GDAL的RASTERIO功能非常强大,简短的一句话就能实现图像的显示,但也是这个简单函数,把我折腾的半死.在学习使用GDAL的过程中,非常感谢李林大哥和貟建明大哥,他们不厌其烦地解答我的疑问,提示关键性要点,使我在解决问题的过程中事半功倍.      我现在要把最近学习过程中的心得写下来,留给自己以后看看,也希望可以给新手

gdal源码编译安装

目录环境:win7+vs2010,以版本192为例 第一步:源码下载:http://download.osgeo.org/gdal/gdal192.zip 第二步:前提是已经在机器上成功安装了vs2010开发环境: 1 编译GDAL 将GDAL源码解压到指定目录下,如:D:\code\gdal-1.9.2 以管理员身份运行cmd,进行VC10安装目录,如:D:\program files (x86)\Microsoft Visual Studio 10.0\VC\bin,执行VCVARS32.B

docker社区的geodata/gdal镜像dockerfile分析

对应从事遥感与地理信息的同仁来说,gdal应该是所有工具中使用频度最高的库了,那么在docker中使用gdal时,面临的第一步就是构建gdal基础镜像,社区中引用最多的就是geodata提供的gdal基础镜像包,封装的gdal最新版本是2.3.0dev. geodata/gdal的docker在github上的地址如下: https://github.com/geo-data/gdal-docker 根据该库的提交记录,其生成gdal镜像的方法经历了多次更新: 1 最初按照gdal官网步骤自行编

基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版

技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达等功能操作:由于Surfer软件不支持二次开发,没有提供相应的SDK供开发者进行使用,所以这一切只能通过相应类似的技术进行实现,首先,数据的读取,如何通过编程实现数据的读取操作呢?这里就要说一下GIS软件所使用的一个开源库-GDAL,GDAL库的具体解释资料,请查阅官方网站[https://www.

GDAL源码编译(32位)

GDAL源码编译(32位) 前言 GDAL:GDAL/OGR 是一个地理空间数据的格式转换及处理工具.官网:https://www.gdal.org/ swig:SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具.SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP. 一.准备工作 1.下载最新版本的源代码https://github.com/OSGeo/gdal  并解压 2.下