用Ganos低代码实现免切片遥感影像浏览(二):动态栅格瓦片

本文涉及的产品
PolarSearch,搜索节点 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
PolarDB Agent Flow,2核4GB
简介: 本文介绍了Ganos全新发布了动态栅格瓦片能力,帮助用户将库内栅格数据或栅格分析结果快速可视化,无需依赖类似GeoServer等空间服务中间件,技术栈短平快,使用灵活高效。

关于Ganos

Ganos是阿里云数据库产品事业部联合阿里云飞天数据库与存储实验室联合共同研发的新一代云原生位置智能引擎,它将时空数据处理能力融入了云原生关系型数据库PolarDB、云原生多模数据库Lindorm、云原生数据仓库AnalyticDB和云数据库RDS PG等核心产品中。Ganos目前拥有几何、栅格、轨迹、表面网格、体网格、3D实景、点云、路径、地理网格、快显十大核心引擎,为数据库构建了面向新型多模多态时空数据的存储、查询、分析、服务等一体化能力。

本文介绍的栅格动态瓦片能力,依托阿里云云原生关系型数据库PolarDB Postgresql兼容版本建设输出。

关于Ganos栅格引擎

Ganos Raster是Ganos针对栅格数据管理和处理的时空数据引擎(插件形式提供),它允许用户使用阿里云云原生数据库PolarDB存储、索引、查询、分析和传输栅格数据及其相关元数据。栅格数据以数据分块(Tile或Block)的形式存储在上述数据库中支持时间和空间查询。此外,Ganos Raster允许多源栅格数据(如遥感、摄影测量和专题地图)之间的融合与分析以及数据服务发布等功能(如TMS或WMTS等)。Ganos Raster已经应用于包括气象、环境监测、地质勘探、自然资源管理、国防、应急、电信、传媒、交通、城市规划以及国土安全等多个领域。

关于栅格引擎的详细介绍,可参考《基于Ganos的栅格引擎开展区域面雨量分析》中的相关内容。

由于栅格数据规模较大,它的可视化一般采用预制栅格瓦片并发布服务的方式,但切片所带来的数据现势性问题被越来越多的用户所诟病,切出来的瓦片数据也给用户带来额外的存储成本。长期以来,Ganos坚持构建极致的时空数据查询分析性能以推动更多的时空业务“在线化”,这其中也包含“切片”这样的离线作业方式。之前我们介绍了如何通过Ganos Raster的金字塔方法在不做预切片的情况下快速可视化库内的栅格数据,详见《用Ganos低代码实现免切片遥感影像浏览(一)》,本次我们又提供更为直观的方式,让客户像使用矢量数据中的asMVT的方法一样,动态生成栅格瓦片快速查看栅格数据。相比于前一种方案,本文介绍的方案是按照标准瓦片的形式进行动态处理和输出,无需依赖类似GeoServer等空间服务中间件,技术栈短平快,使用上更加高效灵活。

动态栅格瓦片能力介绍

业务背景

传统遥感影像服务发布过程中,需要事先对栅格对象按照切片规则进行分层切片,然后使用GeoServer等服务器进行瓦片服务发布。该流程存在着如下缺点:

  • 对超大范围的遥感影像切片耗时往往比较长,服务发布流程比较繁琐,无法做到服务快速发布
  • 切片存储需要消耗额外的存储空间,造成数据大量冗余
  • 数据更新后,需要重新进行切片,不能做到实时的更新

能力介绍

针对上述问题,Ganos从6.3版本开始提供了ST_AsTile函数。通过该函数,用户可以对指定范围内的raster对象进行实时动态瓦片生成。用户将栅格数据入库后,只需要指定空间范围和对应的瓦片生成参数,数据库会自动完成栅格对象的裁剪,重投影,重采样,渲染等操作,并按照256x256或512x512尺寸输出为标准瓦片。通过测试,单个瓦片的耗时在百毫秒以内,完全可以满足用户对栅格数据服务发布实时性的要求,并避免了数据的冗余和更新的问题。

动态栅格瓦片将Ganos的快显能力与栅格数据类型进行了深度融合,动态可视化栅格数据就像使用动态矢量瓦片(ST_AsMVT)一样方便快捷,极大程度提供了Ganos栅格数据类型视算一体的能力、

建议配置

为了得到良好的体验,建议使用以下配置:

项目

推荐配置

PolarDB 版本

标准版 兼容PostgreSQL 14

CPU

> 4 Core

内存

>16 GB

磁盘

>50GB(AUTOPL)

版本

>1.1.39

Ganos版本

>= 6.3

最佳实践

创建ganos raster扩展

CREATE EXTENSION ganos_raster CASCADE;

数据准备与入库

这里我们准备4景landsat8影像,共RGB+NIR四个波段,并上传到OSS。

首先创建栅格数据表:

CREATE TABLE landsat8
(
  id integer,
  rast raster
)

然后,通过ST_ImportFrom函数进行入库,如下:

INSERT INTO landsat8 VALUES (1, ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/LC08_L1TP_128034_20160928_20170320_01_T1.TIF'));
INSERT INTO landsat8 VALUES (2, ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/LC08_L1TP_128035_20181004_20181010_01_T1.TIF'));
INSERT INTO landsat8 VALUES (3, ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/LC08_L1TP_129034_20190726_20190801_01_T1.TIF'));
INSERT INTO landsat8 VALUES (4, ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/LC08_L1TP_129035_20181027_20181115_01_T1.TIF'));

注意:数据库实例需要和OSS在同一个Region中,并通过使用内部地址方式进行访问。<ak> 和 <ak_secret> 需要替换为实际信息(不带尖括号)

然后可以查看入库后的4景raster影像:

SELECT ST_Name(rast), ST_Width(rast),ST_Height(rast),ST_SRID(rast),ST_NumBands(rast) FROM landsat8;

输出结果如下:

数据镶嵌/匀色

我门先使用raster提供的ST_MosaicFrom函数将多景遥感影像镶嵌为一个raster对象,id为101。这里通过设置"color_balance"属性为true以支持匀色功能(按需)。然后通过ST_BuildPyramid对镶嵌后的新的raster对象创建金字塔信息以提高显示效率。具体SQL语句如下。

--镶嵌/匀色
INSERT INTO landsat8 values(101, ST_MosaicFrom(Array(
  SELECT rast FROM landsat8 WHERE id < 5),
  'rbt_mosaic','',
  '{"srid":4326, "cell_size":[0.0002,0.0002], "nodata": true, "nodatavalue":0, "color_balance":true}'));
--创建金字塔
UPDATE landsat8 SET rast=st_buildpyramid(rast) WHERE id=101;

匀色后的raster对象导出为GTiff格式后显示如下:

生成瓦片

使用ST_AsTile函数可以对指定范围内的raster对象进行裁剪,重投影,并按照256x256尺寸输出为标准瓦片。在具体使用过程中,空间范围可以按照Google地图的切片方式,通过zoom的层级和行列号来换算出具体的空间范围,然后通过下面sql就可以获取PNG格式的256x256的瓦片,从而可直接从地图上展示。

4.1 RGB DOM影像

对于三波段的DOM影像,不需要额外像素值拉伸处理,可以直接导出为PNG格式的Tile进行显示。每个瓦片的空间范围可以通过ST_TileEnvelope获得。具体SQL如下。

SELECT ST_AsTile(
  rast,
  ST_TileEnvelope(tile_zoom, tile_column, tile_row),
  '{"strength":"none", "format":"PNG", alpha":true}'
)
FROM landsat8 WHERE id=101;

参数解释:

  • format: 导出瓦片格式,目前支持PNG、JPEG和Tiff三种格式。默认为PNG,为经过拉伸后可以直接显示的RGB瓦片。如果用户希望自己对原始像素信息进行处理,可以选择GTiff,这样用户拿到最原始的像素值。
  • bands:指定RGB对应的波段,如果不指定,默认选择前三个波段。
  • strength:显示增强的方式,包括:
  • none:不进行增强
  • stats:使用统计值进行拉伸(默认)
  • ratio: 按照百分比拉伸

4.2 多波段

对于像Landsat这种多波段遥感影像,一般需要选择3个波段,并进行像素值进行拉伸,变成0-255范围内的RGB波段,才能正常显示。具体SQL语句需要修改strength和bands参数,如下:

SELECT ST_AsTile(
  rast,
  ST_TileEnvelope(tile_zoom, tile_column, tile_row),,
  '{"strength":"ratio", "format":"PNG", "bands":"0,1,2", "alpha":true}'
)
FROM landsat8 WHERE id=101;

这里我们选择0,1,2三个波段作为RGB波段,并采用ratio方式按照百分比拉伸。

前端设计

可以使用任何开发语言进行服务接口的开发,以python环境为例,首先安装需要的包:

pip install asyncpg
pip install quart

创建app.py文件,内容如下:

from quart import Quart, send_file, render_template
import asyncpg
import io
import re
# 数据库连接参数
CONNECTION = {"host": "数据库连接地址", "port": 端口,
              "user": "用户名", "password": "密码", "database": "数据库名称"}
# 目标表名
TABLE_NAME = "landsat8"
# 目标字段
RASTER_COLUMN = "rast"
# 目标ID
RASTER_ID = "101"
app = Quart(__name__, template_folder='./')
@app.before_serving
async def create_db_pool():
    app.db_pool = await asyncpg.create_pool(**CONNECTION)
@app.after_serving
async def close_db_pool():
    await app.db_pool.close()
@app.route("/")
async def home():
    sql = f'''
    SELECT ST_Extent(
      ST_Transform(
        ST_Envelope({RASTER_COLUMN}), 4326))
    FROM {TABLE_NAME} 
    WHERE ID = {RASTER_ID};
    '''
    async with app.db_pool.acquire() as connection:
        box = await connection.fetchval(sql)
        box = re.findall('BOX\((.*?) (.*?),(.*?) (.*?)\)', box)[0]
        min_x, min_y, max_x, max_y = list(map(float, box))
        bounds = [[min_x, min_y], [max_x, max_y]]
        center = [(min_x + max_x) / 2, (min_y + max_y) / 2]
        return await render_template('./index.jinja2', center=str(center), bounds=str(bounds))
@app.route("/raster/<int:z>/<int:x>/<int:y>")
async def raster(z, x, y):
    # 指定波段及拉伸方式
    config = '{"strength":"ratio","bands":"0,1,2","alpha":true}'
    sql = f'''
    SELECT (
      ST_AsTile({RASTER_COLUMN},
        ST_Transform(
          ST_Tileenvelope($1,$2,$3),
        ST_Srid({RASTER_COLUMN})), \'{config}\')
      ).data tile
    FROM {TABLE_NAME}
    WHERE ID = {RASTER_ID};'''
    async with app.db_pool.acquire() as connection:
        tile = await connection.fetchval(sql, z, x, y)
        return await send_file(io.BytesIO(tile), mimetype='image/png')
if __name__ == "__main__":
    # 指定端口为5500,可自行修改为合适的端口
    app.run(port=5500)

最后启动服务:

python app.py

在浏览器中查看图层效果:

技术优势

相比传统的栅格切片,使用ST_AsTile的主要优势包括:

  • 支持实时动态生成规则的瓦片,避免传统切瓦片操作存在的数据冗余问题,节省存储成本
  • 自动实现栅格裁剪、重投影、重采样操作,更加方便简洁
  • 单个瓦片生成效率达到百毫秒内,满足实时性要求
  • 数据更新后,无需重新切片,可实时展示更新内容

目前ST_AsTile功能仅支持对单个raster对象的操作,如果涉及到多个raster对象(如多景影像需要同时查看)则需要对raster对象进行镶嵌操作。后续版本会增加对raster对象集合的支持,这样用户不需要进行镶嵌操作即可实时获取整个raster数据集产生的瓦片。

总结

本文介绍了Ganos全新发布的栅格数据快显能力,帮助用户可以快速可视化存储在PolarDB数据库中的各类栅格数据。相较于传统发布预制栅格瓦片服务的方式,全新的动态栅格瓦片可以更好的保持数据现势性,同时与Ganos强大的栅格分析能力结合,保证分析结果实时可见。Ganos作为全球首个专业级空间数据库,已经将狭义的空间数据拓展至“空天地、室内外、地上下、动静态”等全空间范畴,从数据库系统最底层为物理世界数字化提供时空处理框架,未来Ganos还将提供更多高效的库内空间分析与可视化能力,推动各行业的空间信息应用真正走向“视算一体”。

试用体验

可以访问PolarDB免费试用页面,选择试用“云原生数据库PolarDB PostgreSQL版”,体验栅格数据快显能力。

相关实践学习
对象存储OSS快速上手——如何使用ossbrowser
本实验是对象存储OSS入门级实验。通过本实验,用户可学会如何用对象OSS的插件,进行简单的数据存、查、删等操作。
相关文章
|
SQL 存储 数据可视化
Ganos矢量快显功能上手系列2:增强的MVT能力
本文主要介绍Ganos新增的2D矢量动态切片函数及其使用方法。新增的矢量动态切片函数能够大幅提升可视化效率,有效解决小比例尺MVT显示耗时久的问题。和PostGIS相比,小比例尺MVT的可视化效率提升可达60%以上。
|
6月前
|
前端开发 小程序 JavaScript
A2UI 规范与 AG-UI 协议:打造高效协同的界面开发体系
A2UI规范与AG-UI协议构建“设计-开发”协同闭环:前者统一视觉与交互标准,后者定义组件通信与跨平台适配,二者融合提升协作效率、保障体验一致,推动界面开发向标准化、可复用、高效能演进。
3030 0
|
XML 数据管理 Linux
麒麟系统开发笔记(十二):在国产麒麟系统上编译GDAL库、搭建基础开发环境和基础Demo
麒麟系统上做全球北斗定位终端开发,北斗GPS发过来的是大地坐标,应用需要的是经纬度坐标,所以需要转换,可以使用公式转换,但是之前涉及到了山He智能一个项目使用WG。
|
存储 人工智能 数据管理
【云故事探索】基于阿里云助力地理产业2.0落地,实现遥感数据智能化管理
中国某遥感数据服务中心借助阿里云ECS、GPU和OSS服务,成功实现了地理信息产业升级。此前,中心面临数据管理混乱、服务响应慢等问题。通过阿里云的解决方案,构建了全生命周期管理的遥感数据平台,强化了自动化、智能化的数据生产能力,提升了数据服务的准确性和及时性。此外,平台还增强了数据共享,扩大了应用范围。未来,中心计划结合AI技术,探索地理信息3.0时代,利用阿里云的人工智能平台进一步提升数据管理和应用能力。
990 1
|
安全 Windows
win10系统:局域网下共享文件夹设置,解决其他电脑访问不成功问题
这篇文章是关于如何在Windows 10系统下设置局域网共享文件夹,并解决其他电脑访问不成功的问题的详细指南。
64273 7
win10系统:局域网下共享文件夹设置,解决其他电脑访问不成功问题
|
前端开发 关系型数据库 定位技术
用Ganos低代码实现免切片遥感影像浏览(一)
本文介绍了使用PolarDB-PG数据库配合Ganos时空数据库引擎,不借助第三方工具仅利用SQL语句快速管理与展示遥感影像数据的一种方法。Ganos共提供两种影像免切浏览的方法,一种使用窗口范围获取影像数据展示,另一种通过固定瓦片范围获取影像数据展示,本文详细介绍第一种方法并提供了前后端实操代码帮助用户可以快速理解Ganos Raster的使用细节。
|
存储 数据可视化 定位技术
Ganos矢量快显功能
Ganos的2D矢量快显功能提供了亿级二维矢量数据的高效可视化解决方案。通过创新性的稀疏金字塔索引技术,Ganos大幅减少了切片构建时间和存储开销,并支持动态更新。相较于传统离线切片方式,Ganos能在普通云实例上快速构建和更新切片,显著提升了响应速度和更新效率,同时大幅降低了存储需求。本文详细介绍如何使用Ganos进行2D矢量数据的准备、稀疏金字塔构建、切片获取及Web地图服务搭建,帮助读者快速上手体验这一高效功能。
456 1
|
数据处理 索引 Python
Pandas中resample方法:轻松处理时间序列数据
Pandas中resample方法:轻松处理时间序列数据
615 1
|
存储 关系型数据库 分布式数据库
基于PolarDB Ganos的气象数据处理:恶劣气象预警
本文介绍了在航海恶劣天气预警的场景中,PolarDB Ganos利用栅格模型对基于NetCDF的气象预测数据入库,利用数据库函数计算恶劣天气范围,并将其存储在PolarDB中。通过Ganos实时电子围栏功能,对船只位置并与恶劣天气范围对比,实现航海恶劣气象预警功能。
|
关系型数据库 分布式数据库 数据库
基于PolarDB Ganos的实时时空计算:电子围栏篇
文章着重介绍了PolarDB Ganos如何应用于实现实时电子围栏计算。这是一种依赖于位置技术来创建虚拟地理边界的解决方案,广泛应用于交通安全、应急管理、营销推广等多个领域。通过与阿里云实时计算Flink版产品的集成,PolarDB Ganos能够高效地进行空间计算和数据分析,显著提高了地理围栏应用的实时性和准确性。文章还提供了使用Ganos进行电子围栏计算的实际步骤、性能测试及优化建议,并强调了PolarDB Ganos在提高数据处理效率和降低成本方面的优势。