1. 简介
栅格数据具备了空间信息,因此每一个象元都具备了空间属性以及数值属性数据。获取栅格象元的空间属性以及数值属性,对于进行矢栅多模融合分析具有十分重要的意义。
1.1 GanosBase
GanosBase(简称Ganos)是阿里云智能研发的新一代时空数据库引擎,采用了平台即服务、多模融合、计算下推和云原生全新处理架构,为*、企事业单位、泛互联网客户提供移动对象、空间/时空、遥感多模态数据混合存储、查询与分析服务。
GanosBase已嵌入到RDS PG、PolarDB PG、ADB PG、Lindorm等云原生数据库产品中,本文所介绍的功能特性包含在RDS PG/PolarDB/ADBPG中。
1.2 新增函数
Ganos 4.3 中新增了将栅格象元转换为空间几何对象以及数值的系列函数,包括:
1.2.1 ST_PixelAsPolygon
返回栅格中指定象元所代表的空间范围,以矩形的方式返回geometry对象。
1.2.2 ST_PixelAsPoint
返回栅格中指定象元所代表的空间范围,以点的方式进行返回,可以指定代表的点位左上角点或中心点。
1.2.3 ST_PixelAsCentroid
返回栅格中指定象元所代表的空间范围,以中心点的方式进行返回几何对象
1.2.4 ST_PixelAsPolygons
返回栅格对象中所有象元的空间和属性信息。返回的结果包括象元在栅格对象中的行号,列号,波段号,像素值以及对应的空间多边形范围。
1.2.5 ST_PixelAsPoints
返回栅格对象中所有象元的空间和属性信息。返回的结果包括象元在栅格对象中的行号,列号,波段号,像素值以及对应的空间点信息。空间点可以指定象元的左上角点或中心点。
1.2.6 ST_PixelAsCentroid
返回栅格对象中所有象元的空间和属性信息。返回的结果包括象元在栅格对象中的行号,列号,波段号,像素值以及对应的象元空间范围中心点信息。
2. 实战步骤
本案例中,已知全国的气象温度数据(栅格)以及设备的空间位置分布情况(矢量),需要查找温度在一定范围的设备信息,来演示Ganos矢量和栅格进行统一分析能力。此案例也可以扩展为根据DEM来查找高程在一定范围内的设备等场景。
数据包括:
- 全国的气温netcdf数据
- 全国的设备点信息 shapefile格式
空间参考均为WGS84.
2.1 数据入库
借助于Ganos的能力,可以将netcdf与shapefile数据快速导入到数据库中:
2.1.1 温度数据入库
-- 创建Ganos Raster扩展 CREATE EXTENSION GANOS_RASTER CASCADE; -- 创建温度表 CREATE TABLE temperature(id integer, rast raster); -- 导入netcdf温度数据,需要设置空间参考为4326 INSERT INTO temperature VALUES (1, ST_SetSrid(ST_ImportFrom('chunk_table', 'OSS://<id>:<key>@<endpoint>/bucket/path/file.nc'), 4326)); -- 可以查看元数据信息 select st_metadata(rast) from temperature where id =1; ---------- {"attributes":{"id":"237a4cc5-1b8a-4938-a4e1-ca62766056fb","name":"","type":"normal","version":1.1," storage":{"mode":"internal","location":"chunk_table","md5":"","endian":"ndr","compress":"lz4","compre ssQuality":75,"fileSystem":"null","chunking":{"enable":true,"chunkHeight":256,"chunkWidth":256,"chunk Band":1,"rowChunksDimension":5,"columnChunksDimension":9,"bandChunksDimension":1},"cellType":"16bsi", "interleaving":"bsq"},"description":"","width":2101,"height":1237,"bands":1,"pyramid":{"resample":"ne ar","level":0,"table":""},"overview":{"table":"","column":"","pyramidLevel":1},"referenceOriginPoint" :{"type":"Raster","ulp":{"row":0,"column":0,"band":0},"rrp":{"row":0,"column":0,"band":0},"wrp":{"x": 0,"y":0,"z":0}}},"spatialReference":{"valid":true,"srid":4326,"refLocation":"upperleft","affline":{"u pperleftx":72.985,"upperlefty":54.09500183179541,"scalex":0.03,"scaley":-0.03000000148143583,"skewx": 0.0,"skewy":0.0},"gcps":{"count":0}},"bands":{"b0":{"nodata":{"valid":true,"value":-32767.0},"colorIn terpretation":"Undefined","metadata":{"long_name":"Maximum temperature of 2 meters","NETCDF_VARNAME": "TEM_Max_2m","Spatial_resolution":"3km*3km","time":"202105012330","units":"°C *10"},"histogram":{"app roximate":true}}},"metaData":{"TEM_Max_2m#long_name":"Maximum temperature of 2 meters","TEM_Max_2m#Sp atial_resolution":"3km*3km","TEM_Max_2m#time":"202105012330","TEM_Max_2m#units":"°C *10"}}
2.1.2 设备数据入库
Ganos支持将OSS上的shapefile通过fdw的方式导入到数据库中
--创建Ganos fdw扩展 CREATE EXTENSION ganos_fdw; --创建Shapefile的fdw表 select ST_RegForeignTables('OSS://<id>:<key>@<endpoint>/bucket/path/file.shp') ); --数据入库到数据库中并创建空间索引 CREATE TABLE devices AS SELECT * from <foreign_table_name> ; CREATE INDEX idx_devices_geom ON devices USING Gist(geom);
2.2 提取温度范围
此案例中最核心的功能是将基于栅格的温度转换为矢量空间范围并进行分析计算。转换的思路是将每个符合温度要求的象元的空间范围进行合并,最终获得整体空间范围,具体的SQL为:
-- 查找温度大于 27 °C 且小于28 °C 象元为例 WITH tmp AS ( SELECT (ST_PixelAsPolygons(rast)).* FROM temperature WHERE id = 1) SELECT ST_Union(geom) FROM tmp WHERE value >= 270 AND value < 279;
当然这样的写法对于栅格分辨率较高时,由于需要处理每个像素值,性能较低。
可以通过配合 ST_Reclassify 函数先将无效的数据处理为Nodata值降低数据处理量,具体参见ST_Reclassify函数:
-- 先执行重分类操作 With tmp As( SELECT ST_Reclassify(rast, '[{"band":0,"remap":{"(-100,270,280, 1000]":"0,1,0"}, "nodata":false, "nodataValue":0}]', '{"chunktable":"reclass_chunk_table"}') AS rast from temperature where id =1 ), -- 再返回空间范围 tmp2 AS ( SELECT (ST_PixelAsPolygons(rast)).* FROM tmp) SELECT ST_Union(geom) FROM tmp2;
2.3 空间叠加分析
将步骤2.2 中获得的空间范围与设备表做一个空间包含关系判断,获得符合要求的设备信息:
WITH tmp AS ( SELECT (ST_PixelAsPolygons(rast)).* FROM temperature WHERE id = 1), tmp2 AS ( SELECT ST_Union(geom) as geom FROM tmp WHERE value >= 270 AND value < 279) SELECT count(*) -- 可以选择任何的列信息,此处以计算数量为例 FROM devices, tmp2 WHERE ST_Contains(tmp2.geom, devices.geom); -- 最终结果 count ------- 1879
3. 总结
利用Ganos的时空栅格存储、计算和分析能力,将复杂矢量栅格多模融合分析功能转化为简单的Geo-SQL语句,使得过去必须借助于GIS软件的专业的时空数据处理流程能在数据库内实现,简化用户的程序逻辑,降低开发复杂度与维护成本, 使云GIS能力赋能行业用户。
关于TST
TST团队(Team of Spatio-Temporal kernel)由来自数据库、计算机图形图像、3S等不同领域技术专家构成,是怀揣共同梦想——让80%行业用到时空云计算、迸发着活力和激情的一群创业者。团队主攻云上时空内核引擎技术架构、算法、系统平台研发与应用,致力于将时空信息处理嵌入到PaaS云计算基础设施,使之成为新一代数字框架的基础维度普惠到更多用户。欢迎加入!