Ganos矢量栅格数据快速入库方法简介

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 本文介绍了Ganos提供的矢量、栅格数据高效入库方法,帮助用户快速理解云原生数据库空间数据的写入方案,以便更好的使用Ganos矢栅数据的处理能力。

前言

矢量数据与栅格数据是最为普遍的空间数据类型,在多个领域的GIS类应用中都有大范围使用。Ganos具备完整矢栅数据处理能力,依托阿里云云原生数据库的弹性并行能力,计算效率相较于传统方案有数倍甚至数十倍提升,目前已经在资源管理、交通物流、城市治理、应急处置等多个领域的客户实践中得到了广泛肯定。

由于Ganos依托云原生数据库,相较于自行安装在本地电脑上的传统单机版数据库而言,它的使用方法有些不同,因此在我们发布了一系列的最佳实践文章后,收到了很多用户反馈,一部分用户对于Ganos高效的栅矢数据处理方法很感兴趣,但在数据入库时出现了一些困惑。本次我们专门出一篇解读文章,帮助大家更好的理解如何采用云原生的相关工具进行数据导入操作。

Ganos矢栅数据入库方法

Ganos与PostGIS矢栅数据入库方法区别

使用过社区版Postgresql中PostGIS组件的用户都了解,PostGIS提供了shp2pgsql和raster2pgsql两个命令行工具,帮助用户快速导入矢栅数据。工具需要用户自行指定导入数据的SRID、文件编码、表名、导入方式等信息,栅格工具还需要增加栅格波段、切片大小等信息才可以实现数据导入。这样的方式对于PolarDB这样的云原生数据库并不适用,主要原因为:

  1. PostGIS提供的导入工具需要用户对于数据库所部署的服务器有完全的掌控,数据需要尽可能上传至服务器的本地磁盘;而云原生数据库PolarDB为共享存储架构,无本地磁盘的概念,同时云原生会考虑底层服务器资源的弹性能力,用户并不清楚数据库所在宿主机的相关信息;
  2. PostGIS Raster与Ganos Raster在存储结构上存在显著的不同,相关对比信息请参考文章《基于Ganos的栅格引擎开展区域面雨量分析》

因此,从云原生架构的角度出发,Ganos依托云原生对象存储OSS,提供更为便捷的函数级入库工具,支持矢量、栅格数据的快速写入。

Ganos矢栅数据入库方法介绍

矢量数据入库

1. GIS桌面工具导入

由于Ganos所承载的阿里云PolarDB数据库100%兼容PostgreSQL,因此可以使用类似于QGIS这样的GIS桌面工具,通过创建PG数据连接源的方式建立与PolarDB数据的连接,之后采用桌面工具自带的数据导入功能完成数据入库。QGIS连接PG数据的方法网格上的介绍案例非常丰富,此处不再赘述。

2. 基于FDW导入

Ganos推荐使用FDW的方式导入矢量数据。外部数据包装器FDW(FOREIGN DATA WRAPPER)是PostgreSQL提供用于访问外部数据的插件,外部数据源包括本实例中其它库中的数据或其他实例的数据。Ganos FDW提供了对于多种空间数据类型的统一访问,会自动将几何空间数据类型映射为Geometry字段类型,从而允许与数据库内部表进行统一地访问与查询。


比如我们可以把存储在OSS上的poly.shp文件导入到Ganos作为一张带有geometry字段类型的数据表使用,具体流程如下:


首先创建相关扩展:

CREATE EXTENSION ganos_spatialref;CREATE EXTENSION ganos_geometry;CREATE EXTENSION ganos_fdw;


然后通过ST_RegForeignTables方法(参考手册)将空间数据文件poly.shp注册为外表:

SELECT ST_RegForeignTables('OSS://<ak_id>:<ak_secret>@<endpoint>/path/poly.shp');


注册成功后,可以通过information_schema.foreign_tables视图查询到我们刚刚注册的FDW表(poly):

SELECT foreign_table_name FROM information_schema.foreign_tablesORDERBY foreign_table_name ASC;


注意,注册为外表只是通过映射的方式看到具体内容,具体数据并未真正写入数据库中,所以还需要使用如下命令创建数据库表并插入数据:

CREATETABLE poly_db ASSELECT*FROM poly;


栅格数据入库

Ganos提供了两个将外部栅格数据源导入数据库的函数,他们分别是:ST_ImportFrom(参考手册ST_CreateRast(参考手册。他们的功能都是从外部栅格数据创建raster类型对象用于保存影像数据的元信息。但是区别在于ST_ImportFrom会将数据分成若干规则大小(默认为256x256像素)的数据块chunk存储在数据库中(具体位置通过chunkTableName参数指定),而ST_CreateRast只创建一个raster对象,并不会将具体像素信息导入到数据库中。

1. Tiff数据入库

Tiff数据为目前最常见的栅格数据格式之一,下面我们通过具体案例来展示如何从OSS导入Tiff数据到Ganos中。假设我们在OSS存在一景tiff影像,其路径为:

oss://mybucket/data/G50E009001DOM.tif

首先,我们需要创建一个包含有raster字段类型的表来保存:

CREATETABLE raster_table
(  id integer,  format text,  rast raster
);


然后我们分别通过ST_ImportFrom和ST_CreateRast方式导入,具体SQL语句如下:

INSERTINTO raster_table
SELECT1,'TIFF', ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/mybucket/data/G50E009001DOM.tif');INSERTINTO raster_table
SELECT2,'TIFF', ST_CreateRast('OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/mybucket/data/G50E009001DOM.tif');


导入成功后,通过查询结果可以看到两种方式都会创建一个raster对象,并且生成的raster对象都可以使用Ganos提供的栅格相关UDF进行操作,如下:

SELECT id,ST_Georeference(rast),st_extent(rast),ST_NumBands(rast),ST_SRID(rast),st_value(rast,0,100,100),st_value(rast,1,200,200)FROM raster_table;

输出结果:

但是ST_ImportFrom方法会创建一个新的表(chunk_table)用于保存具体像素值信息,此时即使原始影像删除也不会影响我们的使用。而ST_CreateRast则仅仅只创建了一个raster对象,其中包含了对外部影像的逻辑映射信息,但具体数据仍然以文件方式存在OSS上。


2. HDF5/NetCDF数据入库

HDF5/NetCDF是另外两种常见的栅格数据格式,广泛适用于地球对地观测、科学计算等领域,尤其在气象、海洋、地球科学相关领域有非常广泛应用。ST_ImportFromST_CreateRast函数同样支持HDF5/NetCDF类型的数据导入,SQL语法也与前面基本相同:

INSERTINTO raster_table
Select3,'NC', ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/Z_NAFP_C_BABJ_20210430000556_P_HRCLDAS_RT_CHN_0P01_HOR-WIV-2021043000.nc');INSERTINTO raster_table
Select4,'NC', ST_CreateRast('OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/mybucket/data/Z_NAFP_C_BABJ_20210430000556_P_HRCLDAS_RT_CHN_0P01_HOR-WIV-2021043000.nc');


注意,与Tiff不同的是,对于含有subdataset的HDF5/NetCDF文件,在导入时候还需要在文件路径后面注明subdataset的名称,具体方式如下:

对于NetCDF文件:

INSERTINTO raster_table
Select5,'NC', ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/image.nc:sub_name');

而对于HDF5文件:

INSERTINTO raster_table
Select5,'HDF5', ST_ImportFrom('chunk_table','OSS://<ak>:<ak_secret>@oss-cn-beijing-internal.aliyuncs.com/dmybucket/data/image.hdf5://path/sub_name');


另外对于多维度(大于3)的NC/HDF5文件,还需要指定chunkdim参数。这是因为rast在数据库中的chunk是按照(w, h, b)尺寸进行加载和存储的,这里的w为chunk宽,h为chunk高,b为波段数,当nc文件波段数大于3个时候,需要将除去xy坐标后其他所有波段的乘积作为chunk的波段数进行存储。如下面这个nc文件:

这里的dimension除了lat和lon外,还有两个维度time和isobaric。所以我们在使用ST_ImportFrom入库时,必须指定chunkdim的中的波段数为除去lat和lon之外的其他所有波段的乘积(这里是120),这样才能查询到正确的结果。SQL如下:

insertinto nc_table values(1, ST_ImportFrom('nc_rbt','/Users/xiaofei/Data/raster/nc_demo.nc','{"chunkdim":"(256,256,120)"}'));


3. 数据批量入库

对于OSS上的批量数据,需要配合程序脚本进行入库,下面我们以Pyhon为例,展示如何将OSS上的栅格数据批量导入数据库中:

#连接ossauth=oss2.Auth('AK_ID', 'AK_Secret')
bucket=oss2.Bucket(auth, '***endpoint***', '***bucket_name***')
#连接数据库,获取游标con=psycopg2.connect(database="***dataq***", user="***dde***",
options="-c search_path=aster,public",  # 模式password="******", host="*******", port="******")
cur=con.cursor()
#入库的SQL语句insert_sql="INSERT into {raster_table_name}(filename, band_index, raster_obj) VALUES ..."# 从oss中获取所有hdf5文件名,并保存forobjinoss2.ObjectIterator(bucket, prefix="..."):
ff=open("upload.txt", mode='a', encoding='utf-8')
filename=obj.key.split('/')[-1]
iffilename.find(".hdf5") ==-1:
continueelse:
ff.write(filename+'\n')
# 获取文件列表fileList= {}
withopen('upload.txt', 'r') asf:
fileList=f.read().split('\n')
# 遍历文件列表,生成sql并入库forfileinfileList:
# 编辑insert_sql,添加参数...#入库:try:
cur.execute(insert_sql)
con.commit()
logging.info(filename+" finished")
except (Exception, psycopg2.Error) ase:
logging.info(filename+" error!")
print(filename+" 上传失败\n")

总结

综上,云原生数据有其自身独特的数据写入方式,Ganos函数级的导入工具可以帮助用户构建SQL级别的入库-查询-分析-服务一体化能力,用户不需要在不同的业务阶段使用不同的手段操作数据,工作流程标准,易用性高。Ganos在三维数据、轨迹数据的导入方面也同样使用了类似方式,后续会专题开展详细介绍。

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
相关文章
|
存储 关系型数据库 数据库
Ganos全空间数据多态分层存储能力解析与最佳实践
本文介绍了Ganos与云原生关系型数据库PolarDB-PG联合打造的全空间数据多态分层存储能力与最佳实践。多态分层存储将OSS对象存储直接作为PolarDB-PG数据库的一种存储介质,可以与块存储联合使用,它支持用户将整库、单表、子分区表甚至是表内的一个LOB字段存储在OSS上,达到存储降本的目的,同时保持了增删改查的全部透明,并通过多级缓存保障了性能的最少衰减。多态分层存储是一种兼顾成本、性能与易用性的全空间数据管理方案,可极大程度降低业务开发的复杂度与云资源使用成本。
|
SQL 存储 数据可视化
Ganos H3地理网格能力解析与最佳实践
本文介绍了Ganos H3的相关功能,帮助读者快速了解Ganos地理网格的重要特性与应用实践。H3是Uber研发的一种覆盖全球表面的二维地理网格,采用了一种全球统一的、多层次的六边形网格体系来表示地球表面,这种地理网格技术在诸多业务场景中得到广泛应用。Ganos不仅提供了H3网格的全套功能,还支持与其它Ganos时空数据类型进行跨模联合分析,极大程度提升了客户对于时空数据的挖掘分析能力。
|
SQL 存储 数据可视化
Ganos矢量快显功能上手系列2:增强的MVT能力
本文主要介绍Ganos新增的2D矢量动态切片函数及其使用方法。新增的矢量动态切片函数能够大幅提升可视化效率,有效解决小比例尺MVT显示耗时久的问题。和PostGIS相比,小比例尺MVT的可视化效率提升可达60%以上。
|
存储 算法 Cloud Native
Ganos地理网格引擎支撑无人机路径规划能力实践
随着新能源技术的迅猛发展,低空经济已经逐步成为新的战略性新兴产业,但不同于传统的地表活动,低空活动具有立体性、区域性、融合性等特点,这些特点对于如何安全引导低空活动的顺利开展带来了一系列需要解决的技术问题。Ganos地理网格引擎提供了基于网格的路径规划能力,可以使用DEM、DSM、倾斜摄影等数据构建复杂环境下的无人机路径规划应用。
|
8月前
|
人工智能 关系型数据库 分布式数据库
PolarDB-PG AI最佳实践3 :PolarDB AI多模态相似性搜索最佳实践
本文介绍了如何利用PolarDB结合多模态大模型(如CLIP)实现数据库内的多模态数据分析和查询。通过POLAR_AI插件,可以直接在数据库中调用AI模型服务,无需移动数据或额外的工具,简化了多模态数据的处理流程。具体应用场景包括图像识别与分类、图像到文本检索和基于文本的图像检索。文章详细说明了技术实现、配置建议、实战步骤及多模态检索示例,展示了如何在PolarDB中创建模型、生成embedding并进行相似性检索
|
9月前
|
SQL 人工智能 自然语言处理
PolarDB-PG AI最佳实践 1:基础能力实践
Polar_AI 是 PolarDB 数据库的 AI 扩展,集成了先进的人工智能模型和算法,使数据库能够执行机器学习和自然语言处理任务。它支持 PostgreSQL 及 Oracle 兼容版本,通过标准 SQL 轻松调用 AI 模型,具备简单易用、灵活可定制、无缝数据融合、数据安全和高性能等优势。用户可以通过 SQL 快速实现文本转向量、情感分类等功能,并能自定义扩展 AI 模型。
|
9月前
|
NoSQL 关系型数据库 分布式数据库
PolarDB图数据库快速入门
图数据库(Graph Database)专门存储图数据,适合处理社交网络、知识图谱等复杂关系。它使用图查询语言(如Cypher、Gremlin)进行操作。PolarDB兼容OpenCypher语法,支持创建、查询、更新和删除图数据,包括模式匹配、过滤、MERGE避免重复、可视化工具等功能,简化了图数据的管理和应用。
|
10月前
|
存储 关系型数据库 分布式数据库
基于PolarDB Ganos的气象数据处理:恶劣气象预警
本文介绍了在航海恶劣天气预警的场景中,PolarDB Ganos利用栅格模型对基于NetCDF的气象预测数据入库,利用数据库函数计算恶劣天气范围,并将其存储在PolarDB中。通过Ganos实时电子围栏功能,对船只位置并与恶劣天气范围对比,实现航海恶劣气象预警功能。
|
存储 数据可视化 Cloud Native
用Ganos低代码实现免切片遥感影像浏览(二):动态栅格瓦片
本文介绍了Ganos全新发布了动态栅格瓦片能力,帮助用户将库内栅格数据或栅格分析结果快速可视化,无需依赖类似GeoServer等空间服务中间件,技术栈短平快,使用灵活高效。
|
关系型数据库 分布式数据库 数据库
基于PolarDB的图分析:通过表格将数据快速导入到图
本文介绍了使用 PolarDB PostgreSQL兼容版的AGE插件时,在大数据量下,快速导入数据的方法。可以快速将图数据库中亿级以上的节点和边快速导入到数据库中,避免了插入边时进行查询带来的性能瓶颈。