From 1b268756fb4dd4f7e2ef0433cef49f3afd541262 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Tue, 28 Mar 2023 14:38:33 +0530 Subject: [PATCH 1/5] Add the Deltares World Flood dataset Description at https://planetarycomputer.microsoft.com/dataset/deltares-floods and https://nbviewer.org/github/microsoft/AIforEarthDataSets/blob/main/data/deltares-floods.ipynb Basically a computation of coastal flooding with certain parameters on a specified DEM. --- src/deltares/worldflood.jl | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/deltares/worldflood.jl diff --git a/src/deltares/worldflood.jl b/src/deltares/worldflood.jl new file mode 100644 index 0000000..64d2d4e --- /dev/null +++ b/src/deltares/worldflood.jl @@ -0,0 +1,55 @@ +struct Deltares{Description} <: RasterDataSource end + +struct WorldFlood end + +function _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) + # check the parameters + # resolution depends on dem_source + if dem_source == :NASADEM || dem_source == :MERITDEM + @assert resolution in (90, 1000) + elseif dem_source == :LIDAR + @assert resolution == 5000 + else + @assert dem_source in (:NASADEM, :MERITDEM, :LIDAR) + end + + @assert return_period in (0, 2, 5, 10, 25, 50, 100, 250) + @assert sea_level_year in (2018, 2050) + return true +end + +getraster_keywords(::Type{<: Deltares{<: WorldFlood}}) = (:resolution, :dem_source, :return_period) + +function rastername(::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) + + # validate params + _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) + "GFM_global_$(dem_source)$(resolution)m_$(sea_level_year)_slr_rp$(return_period)_masked.nc" + +end + +function rasterpath(T::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) + + # validate params + _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) + return joinpath(rasterpath(), "Deltares", "WorldFlood", rastername(T, sea_level_year; resolution, dem_source, return_period)) + +end + +function rasterurl(T::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) + + # validate params + _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) + + root_uri = URI(scheme = "https", host = "deltaresfloodssa.blob.core.windows.net", path = "/floods/v2021.06") + + return URIs.URI(root_uri, path = "/global/$(dem_source)/$(resolution)m/" * rastername(T, sea_level_year; resolution, dem_source, return_period)) + +end + +function getraster(T::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) + raster_path = rasterpath(T, sea_level_year; resolution, dem_source, return_period) + mkpath(dirname(raster_path)) + _maybe_download(rasterurl(T, sea_level_year; resolution, dem_source, return_period), raster_path) + raster_path +end From 15f732bc426082c6295bec3b475829b60613b956 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Tue, 28 Mar 2023 14:39:12 +0530 Subject: [PATCH 2/5] Update RasterDataSources.jl --- src/RasterDataSources.jl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/RasterDataSources.jl b/src/RasterDataSources.jl index d60c15f..927785e 100644 --- a/src/RasterDataSources.jl +++ b/src/RasterDataSources.jl @@ -47,6 +47,8 @@ export ACCESS1, BNUESM, CCSM4, CESM1BGC, CESM1CAM5, CMCCCMS, CMCCCM, CNRMCM5, # Climate models from CMIP6 (used in WorldClim) export BCCCSM2MR, CNRMCM61, CNRMESM21, CanESM5, GFDLESM4, IPSLCM6ALR, MIROCES2L, MIROC6, MRIESM2 +# Deltares datasets +export Deltares, WorldFlood export Values, Deciles @@ -81,4 +83,6 @@ include("modis/products.jl") include("modis/utilities.jl") include("modis/examples.jl") +include("deltares/worldflood.jl") + end # module From cd4fd05c3fc987a1722439b8dd3f3674cc0b1ea2 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Tue, 28 Mar 2023 15:00:07 +0530 Subject: [PATCH 3/5] Fix resolution --- src/deltares/worldflood.jl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/deltares/worldflood.jl b/src/deltares/worldflood.jl index 64d2d4e..c0335aa 100644 --- a/src/deltares/worldflood.jl +++ b/src/deltares/worldflood.jl @@ -18,13 +18,17 @@ function _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_ return true end +function _deltares_res2resolution(res::Int) + res <= 1000 ? string(res)*"m" : string(div(res, 1000))*"km" +end + getraster_keywords(::Type{<: Deltares{<: WorldFlood}}) = (:resolution, :dem_source, :return_period) function rastername(::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) # validate params _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) - "GFM_global_$(dem_source)$(resolution)m_$(sea_level_year)_slr_rp$(return_period)_masked.nc" + "GFM_global_$(dem_source)$(_deltares_res2resolution(resolution))m_$(sea_level_year)slr_rp$(lpad(return_period, 4, '0'))_masked.nc" end @@ -43,7 +47,7 @@ function rasterurl(T::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; r root_uri = URI(scheme = "https", host = "deltaresfloodssa.blob.core.windows.net", path = "/floods/v2021.06") - return URIs.URI(root_uri, path = "/global/$(dem_source)/$(resolution)m/" * rastername(T, sea_level_year; resolution, dem_source, return_period)) + return URIs.URI(root_uri, path = "/floods/v2021.06/global/$(dem_source)/$(_deltares_res2resolution(resolution))m/" * rastername(T, sea_level_year; resolution, dem_source, return_period)) end From 6d180a6180f344b8eda4700bda1769348d7db9c0 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 30 Mar 2023 22:56:11 +0530 Subject: [PATCH 4/5] Change keywords around --- src/deltares/worldflood.jl | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/deltares/worldflood.jl b/src/deltares/worldflood.jl index c0335aa..1edc1eb 100644 --- a/src/deltares/worldflood.jl +++ b/src/deltares/worldflood.jl @@ -2,58 +2,55 @@ struct Deltares{Description} <: RasterDataSource end struct WorldFlood end -function _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) +function _validate_deltares_worldflood_params(; year, res, dem_source, return_period) # check the parameters # resolution depends on dem_source if dem_source == :NASADEM || dem_source == :MERITDEM - @assert resolution in (90, 1000) + @assert res in ("90m", "1km") elseif dem_source == :LIDAR - @assert resolution == 5000 + @assert res == "5km" else @assert dem_source in (:NASADEM, :MERITDEM, :LIDAR) end @assert return_period in (0, 2, 5, 10, 25, 50, 100, 250) - @assert sea_level_year in (2018, 2050) + @assert year in (2018, 2050) return true end -function _deltares_res2resolution(res::Int) - res <= 1000 ? string(res)*"m" : string(div(res, 1000))*"km" -end -getraster_keywords(::Type{<: Deltares{<: WorldFlood}}) = (:resolution, :dem_source, :return_period) +getraster_keywords(::Type{<: Deltares{<: WorldFlood}}) = (:year, :res, :dem_source, :return_period) -function rastername(::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) +function rastername(::Type{<: Deltares{<: WorldFlood}}, layer; res::String =" 90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) # validate params - _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) - "GFM_global_$(dem_source)$(_deltares_res2resolution(resolution))m_$(sea_level_year)slr_rp$(lpad(return_period, 4, '0'))_masked.nc" + _validate_deltares_worldflood_params(; year, res, dem_source, return_period) + "GFM_global_$(dem_source)$(res)_$(sea_level_year)slr_rp$(lpad(return_period, 4, '0'))_masked.nc" end -function rasterpath(T::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) +function rasterpath(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String =" 90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) # validate params - _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) - return joinpath(rasterpath(), "Deltares", "WorldFlood", rastername(T, sea_level_year; resolution, dem_source, return_period)) + _validate_deltares_worldflood_params(; year, res, dem_source, return_period) + return joinpath(rasterpath(), "Deltares", "WorldFlood", rastername(T, layer; year, res, dem_source, return_period)) end -function rasterurl(T::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) +function rasterurl(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) # validate params - _validate_deltares_worldflood_params(; sea_level_year, resolution, dem_source, return_period) + _validate_deltares_worldflood_params(; year, res, dem_source, return_period) root_uri = URI(scheme = "https", host = "deltaresfloodssa.blob.core.windows.net", path = "/floods/v2021.06") - return URIs.URI(root_uri, path = "/floods/v2021.06/global/$(dem_source)/$(_deltares_res2resolution(resolution))m/" * rastername(T, sea_level_year; resolution, dem_source, return_period)) + return URIs.URI(root_uri, path = "/floods/v2021.06/global/$(dem_source)/$(res)/" * rastername(T, layer; year, res, dem_source, return_period)) end -function getraster(T::Type{<: Deltares{<: WorldFlood}}, sea_level_year = 2050; resolution::Int = 90, dem_source::Symbol = :NASADEM, return_period::Int = 100) - raster_path = rasterpath(T, sea_level_year; resolution, dem_source, return_period) +function getraster(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String =" 90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) + raster_path = rasterpath(T, layer; year, res, dem_source, return_period) mkpath(dirname(raster_path)) - _maybe_download(rasterurl(T, sea_level_year; resolution, dem_source, return_period), raster_path) + _maybe_download(rasterurl(T, layer; year, res, dem_source, return_period), raster_path) raster_path end From 648b12dab734f3ce423a2be407efb068c14d4329 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 30 Mar 2023 23:00:33 +0530 Subject: [PATCH 5/5] Fix typos --- src/deltares/worldflood.jl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/deltares/worldflood.jl b/src/deltares/worldflood.jl index 1edc1eb..fd3e23c 100644 --- a/src/deltares/worldflood.jl +++ b/src/deltares/worldflood.jl @@ -6,30 +6,30 @@ function _validate_deltares_worldflood_params(; year, res, dem_source, return_pe # check the parameters # resolution depends on dem_source if dem_source == :NASADEM || dem_source == :MERITDEM - @assert res in ("90m", "1km") + @assert res in ("90m", "1km") "Provided: $res, expected one of " elseif dem_source == :LIDAR - @assert res == "5km" + @assert res == "5km" "Provided: $res, expected one of " else - @assert dem_source in (:NASADEM, :MERITDEM, :LIDAR) + @assert dem_source in (:NASADEM, :MERITDEM, :LIDAR) "Provided: $dem_source, expected one of " end - @assert return_period in (0, 2, 5, 10, 25, 50, 100, 250) - @assert year in (2018, 2050) + @assert return_period in (0, 2, 5, 10, 25, 50, 100, 250) "Provided: $return_period, expected one of " + @assert year in (2018, 2050) "Provided: $year, expected one of " return true end getraster_keywords(::Type{<: Deltares{<: WorldFlood}}) = (:year, :res, :dem_source, :return_period) -function rastername(::Type{<: Deltares{<: WorldFlood}}, layer; res::String =" 90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) +function rastername(::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String = "90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) # validate params _validate_deltares_worldflood_params(; year, res, dem_source, return_period) - "GFM_global_$(dem_source)$(res)_$(sea_level_year)slr_rp$(lpad(return_period, 4, '0'))_masked.nc" + "GFM_global_$(dem_source)$(res)_$(year)slr_rp$(lpad(return_period, 4, '0'))_masked.nc" end -function rasterpath(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String =" 90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) +function rasterpath(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String = "90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) # validate params _validate_deltares_worldflood_params(; year, res, dem_source, return_period) @@ -48,7 +48,7 @@ function rasterurl(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res: end -function getraster(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String =" 90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) +function getraster(T::Type{<: Deltares{<: WorldFlood}}, layer; year = 2050, res::String = "90m", dem_source::Symbol = :NASADEM, return_period::Int = 100) raster_path = rasterpath(T, layer; year, res, dem_source, return_period) mkpath(dirname(raster_path)) _maybe_download(rasterurl(T, layer; year, res, dem_source, return_period), raster_path)