栅格模型

本文介绍了栅格模型的用途、基本构成和快速入门等内容。

模型用途

简介

栅格模型由按行和列(或格网)组织的像元(或像素)矩阵组成,其中的每个像元都包含一个信息值(例如温度),栅格模型承载了数字航空像片、卫星影像、数字图片、扫描地图等栅格数据的存储与计算。

Ganos Raster是对象关系型数据库PostgreSQL兼容版本(PolarDB PostgreSQL版)的一个时空引擎扩展,使上述数据库能够有效快速存储管理栅格类型数据,同时支持多源栅格数据(如遥感、摄影测量和专题地图)之间的融合与分析,并提供了GeoServer插件帮助用户将库内栅格对象发布为OGC标准的服务(如WMS或WMTS等)。Ganos Raster可用于包括气象、环境监测、地质勘探、自然资源管理、国防、应急响应、电信、传媒、交通、城市规划以及国土安全等领域。

功能概述

  • Ganos Raster兼容多种外部格式的直接输入,例如,Tiff、IMG、HDF、NetCDF、GRIB等,已入库的Raster对象同样也可以导出为前面介绍的多种外部格式。

  • 栅格数据入库后,用户可以查询栅格对象的基本属性信息、波段统计信息、像素值统计信息并通过多种方式获取像素矩阵。

  • 用户也可以对Raster对象进行多种操作,例如投影转换、裁剪、波段运算、镶嵌,匀色等。

  • Raster提供了动态瓦片能力用于栅格对象的快速可视化。

主要业务场景

在实际应用中,Raster可以用于栅格数据存储和分析的各类场景:

  • 智慧农业

    Ganos Raster支持海量遥感卫星数据的高效存储与查询。通过对多种来源的空间专题数据与遥感影像数据的联合查询、波段计算与空间统计等操作,解决各种农业生产数据分析相关的问题,并对接DataV提供丰富多样的地图、统计图表对数据进行可视化展示,从而指导各类农业生产活动高效运行。image

  • 气象水文预测

    Ganos Raster支持HDF、NetCDF、Grib等常用的气象水文领域标准数据格式的入库与快速查询,同时提供了空间插值、等值线/等值面提取等功能,可快速获取气象水文业务中的关键业务信息,为防灾提供关键技术支持。

    image

  • 金融保险服务

    基于Ganos Raster提供的卫星遥感影像波段计算与分类相关技术,用户可以在不同时间空间条件下快速对作物类型、面积和长势进行统计分析,并结合农户对耕地的自证、政府机构登记的土地流转数据,以及气候、地理位置、行业景气度等情况,利用行业内专业的风控模型预估产量和产值,从而为农户提供信贷额度和合理的还款周期。

    image

基本构成

Raster模型概述

数据模型主要包括以下几个元素构成:

  • Raster:泛指一份栅格数据。例如,一个景遥感影像、一个TIFF文件等。

  • Tile:数据分块,为一系列像素的集合。Tile为Raster对象在数据库中存储的基本单元,一般每个Tile包含256x256个像素值。

  • Band:由多个Tile构成的2D栅格数据图层,每个Tile拥有一个行列号。

  • Cell:表示Tile中的一个像素,可以拥有不同的数据类型。例如Byte,Short,Int,Double等。

  • Pyramid:通过逐级抽稀的栅格金字塔,方便快速显示。每个Pyramid包含不同的层级,每个层级对应一个Layer,第0层代表原始数据。

  • Metadata:栅格的存储元数据,包括:空间范围、投影类型、像素类型等。

image

如上图所示,Ganos Raster采用了一种简单而高效的通用栅格数据模型来管理专题数据和遥感影像数据。一幅栅格数据(Image)在数据库中以栅格对象(Raster)形式进行存储。Raster对象逻辑上由若干可以表示为2D栅格图层的波段(Band)组成,各个Band的信息会在入库过程中从原始影像数据读取。Raster是以数据块(Tile)为基本存储单元进行存储和管理的,Tile的尺寸默认为256x256像素,但也可以由用户进行定义。每个Tile可以包含一个或者多个Band。Tile中的一个像素由一个像素单元(Cell)表示。每一个Raster对象都有对应的元数据(Metadata)信息,如图幅范围(Extent)、数据类型、投影信息、行列号等。 如果对栅格数据创建了金字塔模型,则一个Band会包含多个层级(level)的金字塔数据。

空间参考系

空间参考系(Spatial Reference System,以下简称为 SRS)定义了如何将Raster对象关联到地球表面上某个具体位置。

Ganos使用一个整数来表示SRS的定义引用,称为SRID。Raster对象通过其自身的SRID值与SRS关联。

更多内容请参见空间参考

数据列视图

在Ganos中,raster_columns是从数据库系统目录表中读取全部栅格列的视图,其结构如下所示:

列名

类型

说明

r_table_catalog

varchar(256)

一般为固定值postgres。

r_table_schema

varchar(256)

该表所在的schema。

r_table_name

varchar(256)

该表的表名。

r_raster_column

varchar(256)

该表中某个Raster列的列名。

可以通过如下语句查询当前数据库中全部几何数据列:

SELECT * FROM raster_columns;

索引

空间索引使Ganos处理大型空间数据集时避免对数据库进行全局“顺序扫描”。索引通过将数据组织到搜索树中来加速搜索,可以快速遍历该搜索树以查找特定记录。

Ganos为栅格数据提供了两种索引方式:

索引名称

索引说明

索引特点

Btree

Btree索引一般可作用于栅格文件名称,通过对栅格文件名称比对进行查找。

Btree是数据库最通用的索引方法,可以加速的查询类型也最多。

GIN(Generalized Inverted Index)

即通用倒排索引,通过这种索引结构可以快速的查找到包含指定关键字的元组,因此GIN索引特别适用于支持全文搜索,用户可以对Raster字段类型创建此类索引。

GIN索引对静态数据是最好的,因为查找速度很快,但索引更新比GiST索引速度慢。

Ganos Raster的优势

相较于开源空间数据库PostGIS自带的Raster插件,Ganos Raster在业务适配、存储成本、计算能力方面都有明显的优势,主要体现在以下几方面:

  • Ganos Raster存储结构更加贴近业务需求

    与PostGIS Raster完全栅格化的存储方式不同,Ganos Raster提供了面向对象的存储结构,一幅栅格数据(影像,图像、DEM等)导入后直接对应Ganos Raster的一行记录,对用户而言形成了一对一的关系,清晰明了,单个对象的容量没有限制,一行记录可以保存大到1TB以上的超大影像/栅格。Ganos Raster屏蔽了直接对Tile进行操作的方式,可完整记录栅格对象的元数据信息,并且与时序高度关联,可以与业务进行更好的衔接。

  • Ganos Raster支持数据降本存储

    由于独特的结构设计,针对海量影像分析这类存储成本较大的场景,Ganos Raster支持将栅格元数据存储在库内,栅格属性数据存储在更为廉价的对象存储上。这种情况下依然支持对栅格进行各类空间分析操作,同时可大幅度降低存储成本。

  • Ganos Raster拥有更多时空算子

    除了支持传统的栅格空间关系判断、栅格金字塔、栅格像素值、栅格属性、栅格图像处理等操作外,Ganos Raster还支持多种独特的栅格统计、栅格代数操作,同时支持专业的图像匀色算法和海量栅格概视图实现渲染加速。

快速入门

简介

快速入门帮助用户快速理解Ganos Raster引擎的基本用法,包括扩展创建、建表、导入外部数据、查询结果、创建金字塔、裁剪计算、结果导出等内容。

更多专业用法可参考Raster最佳实践文章:

语法说明

  • 创建扩展。

    CREATE extension ganos_raster cascade;
    说明

    建议将扩展安装在public模式下,避免权限问题。

    CREATE extension ganos_raster WITH schema public cascade;
  • 创建栅格表。

    CREATE TABLE raster_table(id integer, rast raster);
  • 从OSS中导入栅格数据。

    INSERT INTO raster_table VALUES(1, ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-internal.aliyuncs.com/bucket/data/image.tif'))
    说明
  • 查询栅格对象信息。

    SELECT ST_Height(rast),ST_Width(rast) FROM raster_table WHERE id = 1;
    
    -----------
      1241
    (1 rows)
  • 查询指定波段统计信息。

    SELECT ST_Statistics(rast,0) FROM raster_table WHERE id=1;
    
    ---------------------
    {"approximate":false,"min":8969.0,"max":12351.0,"mean":9407.330013839151,"std":193.4268180351078,"count":70091,"sum":659369168.0,"mode":9366.0,"median":9392.0}
    (1 row)
  • 创建金字塔。

    UPDATE raster_table SET rast = ST_BuildPyramid(rast) WHERE id = 1;
    UPDATE 1
  • 根据视口的世界坐标范围,长和宽来计算最佳的金字塔层级。

    SELECT ST_BestPyramidLevel(rast, '((128.0, 30.0),(128.5, 30.5))', 800, 600) FROM raster_table WHERE id = 10;
    
    ---------------------
    3
  • 获取栅格指定范围的像素矩阵。

    SELECT ST_Clip(rast, 0, '((128.980,30.0),(129.0,30.2))', 'World') FROM raster_table WHERE id = 1;
  • 计算裁剪区域的像素坐标范围。

    SELECT ST_ClipDimension(rast, 2, '((128.0, 30.0),(128.5, 30.5))') FROM raster_table WHERE id = 10;
    
    -------------------------
    '((600, 720),(200, 300))'
  • 裁剪并导出。

    指定geometry裁剪raster对象并导出为cog格式文件。

    SELECT ST_ExportTo(
      ST_ClipToRast(rast, ST_GeomFromText('POLYGON((128.0 30.0,129.0 30.0,129.0 31.0,128.0 31.0,128.0 30.0))',4326),0),
      'COG',
      'OSS://<ak>:<ak_secret>@oss-cn.aliyuncs.com/mybucket/data/image_clip.tif'
    );
    
    -------------
     t
    (1 row)
  • 删除扩展(可选)。

    DROP extension ganos_raster cascade;

SQL参考

详细SQL手册请参见Raster SQL参考