建议配置
为了得到良好的体验,建议使用以下配置:
项目
推荐配置
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版”,体验栅格数据快显能力。