使用GANOS实现洪涝灾害承灾体损失综合评估

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 利用Ganos的时空栅格存储、计算和分析能力,将复杂的洪涝承灾体损失计算模型转化为简单的Geo-SQL语句,使得过去必须借助于GIS软件的专业的时空数据处理流程能在数据库内实现,简化用户的程序逻辑,降低开发复杂度与维护成本, 使云GIS能力赋能行业用户。

1. 简介

洪涝灾害是我国目前面临的最主要的自然灾害,利用洪涝灾害承灾体损失综合评估模型,对灾害损失率和损失价值分布进行科学地计算,对于指导洪涝救灾、建立灾害预警机制、加强洪涝灾害成灾机制的研究,建立和完善更科学、更准确的洪灾损失评估预测体系具有重要的意义。

1.1 模型简介

该模型利用洪水灾害淹没水深分布,结合承灾体类型、承灾体价值及脆弱性数据,计算灾害损失率和损失价值分布。

1.1.1 数据输入

输入的数据包括:

  1. 洪水淹没水深分布
  2. 土地利用类型分布
  3. 土地利用价值分布
  4. 土地利用淹没水深-损失率对照表

    1.1.2 数据计算

  5. 承灾体损失率计算公式:

DR=f(H)
其中DR为每类承灾体的损失率;H为致灾因子强度;f为致灾因子和损失率映射关系。

  1. 承灾体损失价值计算公式:

Loss = DR * E
其中Loss为损失价值,DR为灾害损失率,E为承灾体价值。

1.1.3 数据输出

  1. 洪涝灾害损失率分布
  2. 洪涝灾害损失价值分布

    1.2 Ganos

Ganos是阿里云自研的时空数据库引擎,包含了几何,栅格,点云,几何网络和轨迹模型5大数据模型,支持RDS POSTGRESQL 和 POLARDB-PG产品。其中针对时空栅格数据类型,Ganos提供了超大规格栅格数据存储、计算能力,单幅栅格数据理论上无容量限制,具备全球一张图的管理能力,使得传统GIS中复杂的栅格分析操作可以使用Geo-SQL轻松实现,并具备了与几何数据类型统一分析能力。 具体函数参见 https://help.aliyun.com/document_detail/107567.html?spm=a2c4g.11174283.6.1130.17634c22GrQgYR

地图代数是栅格分析与GIS建模中常用技术方法。Ganos为栅格图层计算操作提供了栅格代数表达式语言和一组栅格代数函数,称为ACL(Algebra Computing Language)。 ACL包括通用算术运算符,逻辑运算符,位运算,关系运算符以及一组统计函数,并允许它们自由组合使用,实现更为复杂的运算操作。Ganos 栅格借助于ACL强大的计算表达式,支持基于一个或多个栅格对象像元值的条件查询,数学建模,分类操作以及生成新的结果栅格对象。

PL/pgSQL与ACL结合使用,则提供了更为强大的易用的栅格分析工具。PL/pgSQL提供变量和常量的声明,通用数学表达式,基本函数,逻辑判断和流程控制,ACL为栅格计算提供像元代数计算的表达方式。用户可以轻松地结合两种的优势进行时空栅格的分析与建模,如对全球年平均气温做减法(-)运算以便获得全球气温变化趋势。

本案例中用到了空间参考投影变换, 栅格分辨率修改, 像素值重分类和栅格代数运算四个功能。

1.2.1 空间参考重投影

ST_Transform函数对栅格数据做空间参考的变换。数据来源不同导致数据的空间参考不同,通过本函数可以将不同来源的数据统一到同一个空间参考系统中。
1574733249245_f5f8d106_c8f0_4a32_bdb2_d64521de4396

1.2.2 空间分辨率修改

ST_Resize函数根据用户指定的尺寸和重采样方法对栅格数据进行变换,变化结果对应的地理空间范围保持不变。数据来源的不同导致栅格数据的空间分辨率不尽相同,通过本函数可以将不同的栅格数据确保具备有相同的空间分辨率以便进行下一步计算分析。
1574682328819_497049e6_6760_4bf7_a552_be2017efb318

1.2.3 像素值重分类

ST_Reclassify函数按照用户指定的规则对栅格数据的像素值进行分类,从而获得一个新的栅格数据。
1574682878687_9d0edbdb_d2ac_4a9e_86e5_1db11b10ca7b

1.2.4 地图代数运算

ST_MapAlgebra函数使用特定的代数计算表达式对栅格数据的每个像素值进行计算,获得一个新的栅格数据。借助于强大的代数计算表达式,用户可以非常方便地对栅格数据进行运算操作
1574748886046_79f1ac00_cdba_42d3_97b4_42d46e4c4a23

2. 实战步骤

以海口市台风“海鸥”(201418)洪水灾害为例,计算承灾体洪水灾害损失率和损失价值分布。具体计算步骤如下:

2.1 数据入库

数据入库时可以根据需要对数据进行预处理,如使用ST_Transform进行投影变换、ST_Resize修改分辨率等操作,从而获得指定的空间参考和分辨率:

-- 数据表
create table loss(name varchar(20), rast raster);

-- 导入为指定空间参考和空间分辨率
-- 土地利用类型
INSERT INTO loss values('land_type', ST_Resize(
    ST_Transform(
        ST_CreateRast('<OSS_PATH>/landuse_type_haikou_2015_Albers_30m.tif'), 
            4326, 
      '{"resample":"Near","nodata":true}', 
      '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'), 
    1000, 
    1000, 
    '{"resample":"Near","nodata":true}', 
    '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'));

-- 洪水深度
INSERT INTO loss values('flood_height', ST_Resize(
  ST_Transform(
     ST_CreateRast('<OSS_PATH>/TC_ID_Uniq_201418_Kalmaegi_flood_depth_max_WGS84.tif'), 
        4326, 
        '{"resample":"Near","nodata":true}', 
        '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'), 
     1000, 
     1000, 
     '{"resample":"Near","nodata":true}', 
     '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'));


-- 土地价值
INSERT INTO loss values('land_value', ST_Resize(
  ST_Transform(
     ST_CreateRast('<OSS_PATH>/landuse_value_haikou_2015_Albers_30m.tif'), 
        4326, 
        '{"resample":"Near","nodata":true}', 
        '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'), 
     1000, 
     1000, 
     '{"resample":"Near","nodata":true}', 
     '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'));

2.2 承灾体损失率计算

  1. 对不同土地利用进行赋值,属于该类别赋值1,否则为0,获得单种土地利用分布图

    -- 以type=21 有林地为例
    INSERT INTO loss (name, rast)
    SELECT 'land_type21', ST_Reclassify(rast, '[{"band":0, "remap":{"[0,21)":"0","21":"1","(21,254]":"0"}, "nodata":true, "nodatavalue":255}]', '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}')
    FROM loss
    WHERE name='land_type';
    
  2. 洪水淹没水深与各类土地利用赋值结果相乘,得出各类土地利用淹没深度

    -- 使用表达式[0,0] * [1,0] 进行相乘操作
    WITH foo as
    (
    SELECT rast from loss WHERE name in ('flood_height', 'land_type21' )
    )
    INSERT INTO loss (name, rast)
    SELECT 'flood_height_type21', ST_MapAlgebra(ARRAY(select rast from foo), 
    '[{"expr":"([0,0] * [1,0])","nodata": true, "nodataValue":255}]',
    '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table", "celltype":"64BF"}');
    
  3. 按照各类土地利用淹没水深-损失率对照表,对淹没深度进行重分类,赋予对应土地利用类型相应的损失率

    -- 按照洪水深度重新赋值
    INSERT INTO loss (name, rast)
    SELECT 'ratio_type21', ST_Reclassify(rast, '[{"band":0, "remap":{"[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.9,1.2,1.5,1.8,2.1,2.4,2.7,3,254)":"0,1.5,2.5,4,7,10,13,15,20,24,27,30,30,30,30,30"}, "nodata":true, "nodatavalue":255}]', '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}')
    FROM loss
    WHERE name='flood_height_type21';
    
  4. 有林地土地利用类型对应的损失率图效果

1573558702590_edabf4fd_f995_4c08_baa4_57e127c0d699

2.3 承灾体损失值计算

依照公式2, 将承灾体价值和损失率进行栅格相乘,得到承灾体损失价值分布:

WITH foo as
 (
  SELECT rast from loss WHERE name in ('land_value', 'ratio_type21' )
 )
 INSERT INTO loss (name, rast)
 SELECT 'loss_type21', ST_MapAlgebra(ARRAY(select rast from foo), 
 '[{"expr":"([0,0] * [1,0])","nodata": true, "nodataValue":255}]',
 '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table", "celltype":"64BF"}');

有林地洪灾损失价值分布图如下:
1573558615822_5fa3993b_e159_4680_a8f9_7dc1abf4659e

2.4 单SQL执行

当然,也可以把之前所有的SQL都组合到一起直接进行计算,同样以有林地为例:

-- 把以上几个步骤串联到一起
-- 对结果数据的空间参考和分辨率进行预定义
-- 数据写入临时 tmp_chunk_table 表中,后续可以进行删除
WITH loss AS (
    SELECT 'land_type' as name, ST_Resize(
  ST_Transform(
    ST_CreateRast('<OSS_PATH>/landuse_type_haikou_2015_Albers_30m.tif'), 
      4326, -- 最终结果SRID
      '{"resample":"Near","nodata":true}', 
      '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'), 
    1000,  -- 最终结果分辨率X
    1000, -- 最终结果分辨率Y
    '{"resample":"Near","nodata":true}', 
    '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}') AS rast
UNION ALL
    SELECT 'flood_height' as name, ST_Resize(
  ST_Transform(
     ST_CreateRast('<OSS_PATH>/TC_ID_Uniq_201418_Kalmaegi_flood_depth_max_WGS84.tif'), 
        4326, -- 最终结果SRID
        '{"resample":"Near","nodata":true}', 
        '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'), 
     1000, -- 最终结果分辨率X
     1000, -- 最终结果分辨率Y
     '{"resample":"Near","nodata":true}', 
     '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}') AS rast
UNION ALL
    SELECT 'land_value' as name, ST_Resize(
  ST_Transform(
     ST_CreateRast('<OSS_PATH>/landuse_value_haikou_2015_Albers_30m.tif'), 
        4326, -- 最终结果SRID
        '{"resample":"Near","nodata":true}', 
        '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}'), 
     1000, -- 最终结果分辨率X
     1000, -- 最终结果分辨率Y
     '{"resample":"Near","nodata":true}', 
     '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}') AS rast
),
land_type AS (
SELECT ST_Reclassify(rast, 
              '[{"band":0, "remap":{"[0,21)":"0","21":"1","(21,254]":"0"},"nodata":true, "nodatavalue":255}]', 
          '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}') AS rast
  FROM loss
  WHERE name='land_type'), 
flood_height AS (
SELECT ST_MapAlgebra(ARRAY(select rast from land_type 
                           UNION ALL 
                           select rast from loss WHERE name='flood_height'), 
                 '[{"expr":"([0,0] * [1,0])","nodata": true, "nodataValue":255}]',
                 '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table", "celltype":"64BF"}') AS rast
),
loss_ratio AS (
SELECT ST_Reclassify(rast, 
                        '[{"band":0, "remap":{"[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.9,1.2,1.5,1.8,2.1,2.4,2.7,3,254)":"0,1.5,2.5,4,7,10,13,15,20,24,27,30,30,30,30,30"}, "nodata":true, "nodatavalue":255}]', 
            '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table"}') AS rast
    FROM flood_height),
foo AS (
  SELECT rast from loss WHERE name in ('land_value')
UNION ALL
  SELECT rast from loss_ratio
)
SELECT 'loss_type21', ST_MapAlgebra(ARRAY(select rast from foo), 
    '[{"expr":"([0,0] * [1,0])","nodata": true, "nodataValue":255}]',
    '{"chunking":true,"chunkdim":"(256,256,1)","compression":"lz4","interleaving":"bsq","chunktable":"tmp_chunk_table", "celltype":"64BF"}');

是不是感觉很神奇呢?

3. 总结

利用Ganos的时空栅格存储、计算和分析能力,将复杂的洪涝承灾体损失计算模型转化为简单的Geo-SQL语句,使得过去必须借助于GIS软件的专业的时空数据处理流程能在数据库内实现,简化用户的程序逻辑,降低开发复杂度与维护成本, 使云GIS能力赋能行业用户。

关于TST

阿里云TST团队(Team of Spatio-Temporal kernel)由来自计算机、GIS、遥感等不同领域技术专家构成,是怀揣共同梦想——让80%行业用到时空云计算、迸发着活力和激情的一群创业者。团队主攻云上空间\时空内核引擎技术架构、算法、系统平台研发与应用,致力于将GIS与时空信息处理嵌入到PaaS云计算基础设施,使之成为新一代数字框架的基础维度普惠到更多用户

相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
存储 关系型数据库 数据库
Ganos全空间数据多态分层存储能力解析与最佳实践
本文介绍了Ganos与云原生关系型数据库PolarDB-PG联合打造的全空间数据多态分层存储能力与最佳实践。多态分层存储将OSS对象存储直接作为PolarDB-PG数据库的一种存储介质,可以与块存储联合使用,它支持用户将整库、单表、子分区表甚至是表内的一个LOB字段存储在OSS上,达到存储降本的目的,同时保持了增删改查的全部透明,并通过多级缓存保障了性能的最少衰减。多态分层存储是一种兼顾成本、性能与易用性的全空间数据管理方案,可极大程度降低业务开发的复杂度与云资源使用成本。
|
定位技术 数据安全/隐私保护
MIKE 21 教程 1.3 网格搭建界面介绍之网格生成 (Mesh Generator 工具)
MIKE 21 教程 1.3 网格搭建界面介绍之网格生成 (Mesh Generator 工具)
|
存储 算法 Cloud Native
Ganos地理网格引擎支撑无人机路径规划能力实践
随着新能源技术的迅猛发展,低空经济已经逐步成为新的战略性新兴产业,但不同于传统的地表活动,低空活动具有立体性、区域性、融合性等特点,这些特点对于如何安全引导低空活动的顺利开展带来了一系列需要解决的技术问题。Ganos地理网格引擎提供了基于网格的路径规划能力,可以使用DEM、DSM、倾斜摄影等数据构建复杂环境下的无人机路径规划应用。
|
10月前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
273 3
|
存储 Cloud Native 关系型数据库
Ganos三维引擎系列(四):路网与地形贴合
本文介绍了阿里云多模态时空数据库Ganos三维引擎在交通领域的专题应用,帮助业务侧快速实现三维地形与高精路网的自动贴合。Ganos三维引擎支持三大类存储结构:表面网格模型、体网格模型与3D实景模型,其中表面网格模型(SFMesh)提供了三维地形数据的存储能力,同时提供了与矢量三维(Polygon3D)的贴合功能,帮助用户降低交通领域三维数据生产处理的难度。
|
存储 关系型数据库 Serverless
Ganos三维引擎系列(二):可视域与阴影率分析
本文介绍了基于阿里云多模态时空数据库Ganos三维引擎构建可视域分析与阴影率分析的应用方法。Ganos三维引擎支持三大类存储结构:表面网格模型、体网格模型与3D实景模型,其中表面网格模型用于存储带有语义的类BIM的精细化三维模型,体网格模型用于存储地质体等非匀质“场”类三维模型,3D实景模型用于存储倾斜摄影、精白模等用于渲染的三维模型,三种存储结构都提供了原生数据类型、空间索引、分析算子、导入导出工具、可视化支撑等功能,为数字孪生类应用提供闭环的存算显能力。
Matlab|【免费】基于半不变量的概率潮流计算
Matlab|【免费】基于半不变量的概率潮流计算
|
存储 达摩院 Cloud Native
基于Ganos轨迹引擎的运输车辆到达性分析
本文介绍了由阿里巴巴达摩院数据库与存储实验室研发的多模态时空数据库Ganos轨迹引擎在运输车辆位置分析中的应用场景。Ganos通过在数据库中原生内置移动对象的存储、检索与分析能力,打造了全球首个移动对象数据库,为交通、物流、出行、生活服务类客户提供海量轨迹数据的分析挖掘能力。通过阅读本文,用户可以更好的理解Ganos轨迹模型的存储结构与轨迹引擎的相关能力,助力业务开发走向便捷。
|
存储 数据可视化 数据管理
Ganos三维引擎系列(三):BIM数据管理与可视化功能解析
本文介绍了阿里云多模态时空数据库Ganos三维引擎在BIM数据管理中的应用。Ganos三维引擎支持三大类存储结构:表面网格模型、体网格模型与3D实景模型,其中表面网格模型(SFMesh)用于存储带有语义的类BIM精细化三维模型,同时提供了空间索引、分析算子、导入工具、可视化支撑等功能,本文详细介绍表面网格模型应用于IFC格式的BIM数据管理与可视化等功能。
|
前端开发 关系型数据库 定位技术
用Ganos低代码实现免切片遥感影像浏览(一)
本文介绍了使用PolarDB-PG数据库配合Ganos时空数据库引擎,不借助第三方工具仅利用SQL语句快速管理与展示遥感影像数据的一种方法。Ganos共提供两种影像免切浏览的方法,一种使用窗口范围获取影像数据展示,另一种通过固定瓦片范围获取影像数据展示,本文详细介绍第一种方法并提供了前后端实操代码帮助用户可以快速理解Ganos Raster的使用细节。