栅格数据具备空间信息,因此每一个象元都具备空间属性和数值属性数据。获取栅格象元的空间属性以及数值属性,对于进行矢栅多模融合分析具有十分重要的意义。
新增函数
Ganos在4.3版本增加将栅格象元转换为空间几何对象以及数值的系列函数。
函数名称 | 描述 | 参考文档 |
ST_PixelAsPolygon | 用于返回栅格中指定象元所代表的空间范围,以矩形的方式返回geometry对象。 | |
ST_PixelAsPoint | 用于返回栅格中指定象元所代表的空间范围,以点的方式进行返回,可以指定代表的点位左上角点或中心点。 | |
ST_PixelAsCentroid | 用于返回栅格中指定象元所代表的空间范围,以中心点的方式进行返回几何对象。 | |
ST_PixelAsPolygons | 用于返回栅格对象中所有象元的空间和属性信息。返回的结果包括象元在栅格对象中的行号,列号,波段号,像素值以及对应的空间多边形范围。 | |
ST_PixelAsPoints | 用于返回栅格对象中所有象元的空间和属性信息。返回的结果包括象元在栅格对象中的行号,列号,波段号,像素值以及对应的空间点信息。空间点可以指定象元的左上角点或中心点。 | |
ST_PixelAsCentroids | 用于返回栅格对象中所有象元的空间和属性信息。返回的结果包括象元在栅格对象中的行号,列号,波段号,像素值以及对应的象元空间范围中心点信息。 |
最佳实践
已知中国的气象温度数据(栅格)以及设备的空间位置分布情况(矢量),需要查找温度在一定范围内的设备信息。本案例可以展示Ganos矢量和栅格进行统一分析能力。同时,也可以扩展为根据DEM来查找高程在一定范围内的设备等场景。 基础数据包括:
中国的气温netcdf数据。
中国的设备点信shapefile格式。
本案例的空间参考均为WGS84。
数据入库
温度数据入库
-- 创建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));
数据插入成功后,可通过以下SQL语句查看元数据信息:
-- 查看元数据信息
SELECT st_metadata(rast) FROM temperature WHERE id =1;
设备数据入库
--创建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);
以上通过fdw方式将OSS中的设备数据导入到数据库中,更多其他数据入库方案请参考矢量栅格数据快速入库。
提取温度范围
当前案例中最核心的功能是将基于栅格的温度转换为矢量空间范围并进行分析计算。转换的思路是将每个符合温度要求的象元的空间范围进行合并,最终获得整体空间范围,具体的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;
然而,当栅格分辨率较高时,该SQL语句由于需处理每个像素值,导致性能较低。对应可以使用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;
空间叠加分析
将获取的矢量空间范围与设备表做一个空间包含关系判断,获得符合要求的设备信息:
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
总结
利用Ganos的时空栅格存储、计算和分析能力,将复杂的矢量栅格多模融合分析功能转化为简洁的Geo-SQL语句。这使得以往依赖GIS软件进行的专业时空数据处理流程能够在数据库内实现,从而简化程序逻辑,降低开发复杂度与维护成本,使云GIS能力赋能行业用户。