用Ganos低代码实现免切片遥感影像浏览

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本文介绍了一种基于PolarDB兼容PostgreSQL 14的高效栅格数据管理和可视化方案。推荐配置包括4核CPU、16GB内存、50GB磁盘等。通过创建扩展并上传影像至OSS,利用SQL语句完成数据导入、镶嵌、匀色及金字塔构建。重点介绍了使用ST_AsTile函数动态生成标准瓦片的方法,支持多种格式和增强方式。前端通过Python实现服务接口,实现实时、高效的数据展示。此方案具有实时性强、存储成本低等优点,适合快速可视化大量栅格数据。

建议配置
为了得到良好的体验,建议使用以下配置:
项目
推荐配置
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://:@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://:@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://:@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://:@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/LC08_L1TP_129035_20181027_20181115_01_T1.TIF'));
注意:数据库实例需要和OSS在同一个Region中,并通过使用内部地址方式进行访问。 和 需要替换为实际信息(不带尖括号)
然后可以查看入库后的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///")
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":
//代码效果参考:https://www.intpipe.com/sitemap/post.html
//代码效果参考:https://www.intpipe.comhttps://www.intpipe.com
//代码效果参考:https://www.nbhbjx.cn/sitemap/post.html
//代码效果参考:https://www.vipwb.com/sitemap/post.html

# 指定端口为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搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
1月前
|
编解码
ENVI无缝镶嵌、拼接栅格数据的方法
【8月更文挑战第10天】使用ENVI进行无缝镶嵌的方法包括:准备具有一致空间参考的栅格数据;通过“File”菜单逐个加载数据;启动“Seamless Mosaic”工具;添加待镶嵌图像;调整几何校正、颜色平衡及羽化参数以平滑过渡;设定输出路径与格式;最后执行镶嵌并检查结果质量,必要时微调参数直至满意。
|
4月前
|
存储 数据可视化 Cloud Native
用Ganos低代码实现免切片遥感影像浏览(二):动态栅格瓦片
本文介绍了Ganos全新发布了动态栅格瓦片能力,帮助用户将库内栅格数据或栅格分析结果快速可视化,无需依赖类似GeoServer等空间服务中间件,技术栈短平快,使用灵活高效。
|
数据可视化 定位技术
GIS空间分析 数字地形分析1 地势图的制作
在本文中,你将学到如何根据DEM数据制作地势图
130 0
|
4月前
|
存储 定位技术 Python
Python中ArcPy实现对不同时相的栅格遥感影像依据其成像时间分别批量拼接
Python中ArcPy实现对不同时相的栅格遥感影像依据其成像时间分别批量拼接
|
4月前
|
定位技术 Python
Python中GDAL批量绘制多时相栅格遥感影像的像元时间序列曲线图
Python中GDAL批量绘制多时相栅格遥感影像的像元时间序列曲线图
|
4月前
|
定位技术
ENVI软件实现栅格遥感影像基于像元的镶嵌拼接
ENVI软件实现栅格遥感影像基于像元的镶嵌拼接
|
4月前
|
定位技术 Python
ArcGIS批量拼接大量栅格遥感影像:Mosaic工具
ArcGIS批量拼接大量栅格遥感影像:Mosaic工具
217 1
|
前端开发 关系型数据库 定位技术
用Ganos低代码实现免切片遥感影像浏览(一)
本文介绍了使用PolarDB-PG数据库配合Ganos时空数据库引擎,不借助第三方工具仅利用SQL语句快速管理与展示遥感影像数据的一种方法。Ganos共提供两种影像免切浏览的方法,一种使用窗口范围获取影像数据展示,另一种通过固定瓦片范围获取影像数据展示,本文详细介绍第一种方法并提供了前后端实操代码帮助用户可以快速理解Ganos Raster的使用细节。
|
存储 SQL 数据可视化
Ganos三维引擎系列(一):倾斜摄影数据管理与可视化功能解析
本文介绍了阿里云多模态时空数据库Ganos三维引擎在倾斜摄影数据管理中的应用。Ganos三维引擎支持三大类存储结构:表面网格模型、体网格模型与3D实景模型,其中表面网格模型用于存储带有语义的类BIM精细化三维模型,体网格模型用于存储地质体等非匀质“场”类三维模型,3D实景模型用于存储倾斜摄影、精白模等用于渲染的三维模型,三种存储结构都提供了原生数据类型、空间索引、分析算子、导入导出工具、可视化支撑等功能,为数字孪生类应用提供闭环的存算显能力,本文重点介绍基于3D实景模型开展倾斜摄影数据管理与可视化等功能。
|
数据可视化 数据挖掘 定位技术
GIS空间分析 栅格数据分析1 欧氏距离分析
本文讲述ArcGIS栅格数据欧氏距离分析、栅格数据重分类、栅格叠置分析等空间分析功能;
148 1