关于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='./') before_serving .async def create_db_pool(): app.db_pool = await asyncpg.create_pool(**CONNECTION) after_serving .async def close_db_pool(): await app.db_pool.close() 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)) 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版”,体验栅格数据快显能力。