diff --git a/PROCESS.md b/PROCESS.md new file mode 100644 index 0000000000000000000000000000000000000000..b60d2806c81c78f79021862ffcc0c32ecdb60658 --- /dev/null +++ b/PROCESS.md @@ -0,0 +1,139 @@ +# AWI Basemap Process +```mermaid +graph + subgraph gshhg["Global Self-consistent Hierarchical High-resolution Geography (GSHHG)"] + GSHHG_IN("GSHHS_f_L1.shp") -- fix geometry --> GSHHG_WORLD("gshhg_world.gpkg") + end + subgraph add["Antarctic Digital Database (ADD)"] + ADD_COASTLINE_IN("add_coastline_medium_res_polygon_v*.gpkg") -- extract ice sheet and reproject --> ADD_ICE_SHEET("add_ice_sheet.gpkg") + ADD_COASTLINE_IN -- extract ice mask and reproject --> ADD_SHELF_ICE("add_shelf_ice.gpkg") + + ADD_ROCK_OUTCROP_IN("add_rock_outcrop_medium_res_polygon_v*.gpkg") -- reproject --> ADD_ROCK_OUTCROP("add_rock_outcrop.gpkg") + end + subgraph gimp["Greenland Ice Mapping Project (GIMP)"] + GIMP_IN("GimpIceMask_90m_2015_v*.tif") -- reproject and resample --> GIMP_RASTER("gimp_ice_mask.tif") + GIMP_RASTER -- polygonize --> GIMP("gimp_ice_mask.gpkg") + end + subgraph glims["Global Land Ice Measurements from Space (GLIMS)"] + GLIMS_IN("glims_polygons.shp") -- fix geometry --> GLIMS_WORLD("glims_world.gpkg") + GLIMS_WORLD -- clip Arctic --> GLIMS_ARCTIC("glims_arctic.gpkg") + GLIMS_WORLD -- clip Antarctic --> GLIMS_ANTARCTIC("glims_antarctic.gpkg") + end + subgraph ibcao["International Bathymetric Chart of the Arctic Ocean (IBCAO)"] + IBCAO_IN("ibcao_v5_2024_ice_400m.tiff") -- reproject and resample --> IBCAO_ARCTIC_ICESURFACE("ibcao_arctic_icesurface.tif") + IBCAO_SUBICE_IN("ibcao_v5_2024_depth_400m.tiff") -- reproject and resample --> IBCAO_ARCTIC_SUBICE("ibcao_arctic_subice.tif") + end + subgraph ibcso["International Bathymetric Chart of the Southern Ocean (IBCSO)"] + IBCSO_IN("IBCSO_ice-surface.tif") -- reproject and resample --> IBCSO_ANTARCTIC_ICESURFACE("ibcso_antarctic_icesurface.tif") + IBCSO_SUBICE_IN("IBCSO_bed.tif") -- reproject and resample --> IBCSO_ANTARCTIC_SUBICE("ibcso_antarctic_subice.tif") + end + subgraph gebco["General Bathymetric Chart of the Oceans (GEBCO)"] + GEBCO_IN("GEBCO_2024.nc") -- resample --> GEBCO_WORLD_ICESURFACE_TMP1("gebco_world_icesurface_tmp1.tif") + GEBCO_WORLD_ICESURFACE_TMP1 -- copy --> GEBCO_WORLD("gebco_world.tif") + GEBCO_WORLD_ICESURFACE_TMP1 -- extract above sea level --> GEBCO_WORLD_ICESURFACE_TMP2("gebco_world_icesurface_tmp2.tif") + GEBCO_WORLD_ICESURFACE_TMP2 -- fix nodata --> GEBCO_WORLD_ICESURFACE("gebco_world_icesurface.tif") + + GEBCO_SUBICE_IN("GEBCO_2024_sub_ice_topo.nc") -- resample --> GEBCO_WORLD_SUBICE("gebco_world_subice.tif") + + GEBCO_IN -- clip Arctic --> GEBCO_ARCTIC_CLIP("gebco_arctic_clip.tif") + GEBCO_ARCTIC_CLIP -- reproject and resample --> GEBCO_ARCTIC("gebco_arctic.tif") + + GEBCO_IN -- clip Arctic --> GEBCO_ANTARCTIC_CLIP("gebco_antarctic_clip.tif") + GEBCO_ANTARCTIC_CLIP -- reproject and resample --> GEBCO_ANTARCTIC("gebco_antarctic.tif") + end + subgraph dem["Merge DEMs"] + %% World + GEBCO_WORLD -- copy --> DEM_WORLD("dem_world.tif") + + %% Arctic + GEBCO_ARCTIC -- merge --> DEM_ARCTIC("dem_arctic.tif") + IBCAO_ARCTIC_ICESURFACE -- merge --> DEM_ARCTIC + DEM_ARCTIC -- copy --> DEM_ARCTIC_ICESURFACE_TMP1("dem_arctic_icesurface_tmp1.tif") + DEM_ARCTIC_ICESURFACE_TMP1 -- extract above sea level --> DEM_ARCTIC_ICESURFACE_TMP2("dem_arctic_icesurface_tmp2.tif") + DEM_ARCTIC_ICESURFACE_TMP2 -- fix nodata --> DEM_ARCTIC_ICESURFACE("dem_arctic_icesurface.tif") + + GEBCO_ARCTIC -- merge --> DEM_ARCTIC_SUBICE("dem_arctic_subice.tif") + IBCAO_ARCTIC_SUBICE -- merge --> DEM_ARCTIC_SUBICE + + %% Antarctic + GEBCO_ANTARCTIC -- merge --> DEM_ANTARCTIC("dem_antarctic.tif") + IBCSO_ANTARCTIC_ICESURFACE -- merge --> DEM_ANTARCTIC + DEM_ANTARCTIC -- copy --> DEM_ANTARCTIC_ICESURFACE_TMP1("dem_antarctic_icesurface_tmp1.tif") + DEM_ANTARCTIC_ICESURFACE_TMP1 -- extract above sea level --> DEM_ANTARCTIC_ICESURFACE_TMP2("dem_antarctic_icesurface_tmp2.tif") + DEM_ANTARCTIC_ICESURFACE_TMP2 -- fix nodata --> DEM_ANTARCTIC_ICESURFACE("dem_antarctic_icesurface.tif") + + GEBCO_ANTARCTIC -- merge --> DEM_ANTARCTIC_SUBICE("dem_antarctic_subice.tif") + IBCSO_ANTARCTIC_SUBICE -- merge --> DEM_ANTARCTIC_SUBICE + end + subgraph hillshade["Create Shading Layers"] + %% World + GEBCO_WORLD_ICESURFACE -- hillshade --> GEBCO_WORLD_ICESURFACE_HILLSHADE("gebco_world_icesurface_hillshade.tif") + GEBCO_WORLD_SUBICE -- hillshade --> GEBCO_WORLD_SUBICE_HILLSHADE("gebco_world_subice_hillshade.tif") + GEBCO_WORLD_SUBICE_HILLSHADE -- merge --> DEM_WORLD_HILLSHADE("dem_world_hillshade.tif") + GEBCO_WORLD_ICESURFACE_HILLSHADE -- merge --> DEM_WORLD_HILLSHADE + + %% Arctic + DEM_ARCTIC_ICESURFACE -- hillshade --> DEM_ARCTIC_ICESURFACE_HILLSHADE("dem_arctic_icesurface_hillshade.tif") + DEM_ARCTIC_SUBICE -- hillshade --> DEM_ARCTIC_SUBICE_HILLSHADE("dem_arctic_subice_hillshade.tif") + DEM_ARCTIC_SUBICE_HILLSHADE -- merge --> DEM_ARCTIC_HILLSHADE("dem_arctic_hillshade.tif") + DEM_ARCTIC_ICESURFACE_HILLSHADE -- merge --> DEM_ARCTIC_HILLSHADE + + %% Antarctic + DEM_ANTARCTIC_ICESURFACE -- hillshade --> DEM_ANTARCTIC_ICESURFACE_HILLSHADE("gebco_antarctic_icesurface_hillshade.tif") + DEM_ANTARCTIC_SUBICE -- hillshade --> DEM_ANTARCTIC_SUBICE_HILLSHADE("gebco_antarctic_subice_hillshade.tif") + DEM_ANTARCTIC_SUBICE_HILLSHADE -- merge --> DEM_ANTARCTIC_HILLSHADE("gebco_antarctic_hillshade.tif") + DEM_ANTARCTIC_ICESURFACE_HILLSHADE -- merge --> DEM_ANTARCTIC_HILLSHADE + end + subgraph burn["Burn Vector Layers"] + %% World + ADD_SHELF_ICE -- burn 20000.0 --> DEM_WORLD + ADD_ICE_SHEET -- burn 30000.0 --> DEM_WORLD + ADD_ROCK_OUTCROP -- burn 3000.0 --> DEM_WORLD + GIMP -- burn 30000.0 --> DEM_WORLD + GLIMS_WORLD -- burn 30000.0 --> DEM_WORLD + + %% Arctic + GIMP -- burn 30000.0 --> DEM_ARCTIC + GLIMS_ARCTIC -- burn 30000.0 --> DEM_ARCTIC + + %% Antarctic + ADD_SHELF_ICE -- burn 20000.0 --> DEM_ANTARCTIC + ADD_ICE_SHEET -- burn 30000.0 --> DEM_ANTARCTIC + ADD_ROCK_OUTCROP -- burn 3000.0 --> DEM_ANTARCTIC + GLIMS_ANTARCTIC -- burn 30000.0 --> DEM_ANTARCTIC + end + subgraph basemap["Create Basemaps"] + %% World + DEM_WORLD -- copy --> WORLD_DEM_SEA("world_dem_sea.tif") + GSHHG_WORLD -- cut landmask --> WORLD_DEM_SEA + WORLD_DEM_SEA -- color and fix nodata --> WORLD_RGB_SEA("world_rgb_sea.tif") + DEM_WORLD -- color and fix nodata --> WORLD_RGB_LAND("world_rgb_land.tif") + WORLD_RGB_SEA -- merge --> WORLD_RGB("world_rgb.tif") + WORLD_RGB_LAND -- merge --> WORLD_RGB + WORLD_RGB -- shade --> WORLD_SHADED("world_shaded.tif") + DEM_WORLD_HILLSHADE -- shade --> WORLD_SHADED + WORLD_SHADED -- finalize and create overviews --> BASEMAP_WORLD("AWI_Basemap_World_*.tif") + + %% Arctic + DEM_ARCTIC -- copy --> ARCTIC_DEM_SEA("arctic_dem_sea.tif") + GSHHG_WORLD -- cut landmask --> ARCTIC_DEM_SEA + ARCTIC_DEM_SEA -- color and fix nodata --> ARCTIC_RGB_SEA("arctic_rgb_sea.tif") + DEM_ARCTIC -- color and fix nodata --> ARCTIC_RGB_LAND("arctic_rgb_land.tif") + ARCTIC_RGB_SEA -- merge --> ARCTIC_RGB("arctic_rgb.tif") + ARCTIC_RGB_LAND -- merge --> ARCTIC_RGB + ARCTIC_RGB -- shade --> ARCTIC_SHADED("arctic_shaded.tif") + DEM_ARCTIC_HILLSHADE -- shade --> ARCTIC_SHADED + ARCTIC_SHADED -- finalize and create overviews --> BASEMAP_ARCTIC("AWI_Basemap_Arctic_*.tif") + + %% Antarctic + DEM_ANTARCTIC -- copy --> ANTARCTIC_DEM_SEA("antarctic_dem_sea.tif") + GSHHG_WORLD -- cut landmask --> ANTARCTIC_DEM_SEA + ANTARCTIC_DEM_SEA -- color and fix nodata --> ANTARCTIC_RGB_SEA("antarctic_rgb_sea.tif") + DEM_ANTARCTIC -- color and fix nodata --> ANTARCTIC_RGB_LAND("antarctic_rgb_land.tif") + ANTARCTIC_RGB_SEA -- merge --> ANTARCTIC_RGB("antarctic_rgb.tif") + ANTARCTIC_RGB_LAND -- merge --> ANTARCTIC_RGB + ANTARCTIC_RGB -- shade --> ANTARCTIC_SHADED("antarctic_shaded.tif") + DEM_ANTARCTIC_HILLSHADE -- shade --> ANTARCTIC_SHADED + ANTARCTIC_SHADED -- finalize and create overviews --> BASEMAP_ANTARCTIC("AWI_Basemap_Antarctic_*.tif") + end +``` diff --git a/data/gshhg/gshhg.md b/data/gshhg/gshhg.md new file mode 100644 index 0000000000000000000000000000000000000000..8d8ef55242cc7c1aea9141d1101c272275e37fe5 --- /dev/null +++ b/data/gshhg/gshhg.md @@ -0,0 +1,20 @@ +# Global Self-consistent Hierarchical High-resolution Geography (GSHHG) + +## Summary + +GSHHG coastlines are used as a landmask for dividing land and sea color palettes in the AWI Basemap process + +See the [GSHHG website](https://www.soest.hawaii.edu/pwessel/gshhg/) for more information. + +The citation refers to last used GSHHG version and might need to be adapted when updating the dataset. + +## Files to download + +- Title: **GSHHS_f_L1** +- Format: ESRI Shapefile (SHP) +- Filename: `GSHHS_f_L1.shp` (plus auxiliary files) +- Link: ftp://ftp.soest.hawaii.edu/gshhg/gshhg-shp-2.3.7.zip + +## Citation + +Wessel, P., and W. H. F. Smith, A Global Self-consistent, Hierarchical, High-resolution Shoreline Database, J. Geophys. Res., 101, 8741-8743, 1996. \ No newline at end of file diff --git a/data/ibcao/ibcao.md b/data/ibcao/ibcao.md new file mode 100644 index 0000000000000000000000000000000000000000..2e5010d9d746d21a030726d7610d26b7f7ec7f62 --- /dev/null +++ b/data/ibcao/ibcao.md @@ -0,0 +1,27 @@ +# International Bathymetric Chart of the Arctic Ocean (IBCAO) + +## Summary + +The goal of the IBCAO initiative is to develop a digital data base that contains all available bathymetric data north of 64° North, for use by mapmakers, researchers, institutions, and others whose work requires a detailed and accurate knowledge of the depth and the shape of the Arctic seabed. + +See the [IBCAO website](https://www.gebco.net/about_us/committees_and_groups/scrum/ibcao/) for more information. + +The filename, download link and citation refer to last used IBCAO version and might need to be adapted when updating the dataset. + +## Files to download + +- Title: **IBCAO_v5 Grid 400mx400m (with elevation data for the Greenland Ice Sheet)** +- Format: GeoTIFF (TIFF) +- Filename: `ibcao_v5_2024_ice_400m.tiff` +- Link: https://www.bodc.ac.uk/data/open_download/ibcao/ibcao_v5_400m_ice/geotiff/ +- General Link: https://www.gebco.net/data_and_products/gridded_bathymetry_data/arctic_ocean/ + +- Title: **IBCAO_v5 Grid 400mx400m (without elevation data for the Greenland Ice Sheet)** +- Format: GeoTIFF (TIFF) +- Filename: `ibcao_v5_2024_depth_400m.tiff` +- Link: https://www.bodc.ac.uk/data/open_download/ibcao/ibcao_v5_400m/geotiff/ +- General Link: https://www.gebco.net/data_and_products/gridded_bathymetry_data/arctic_ocean/ + +## Citation + +Jakobsson, M., Mayer, L.A., Bringensparr, C. et al. The International Bathymetric Chart of the Arctic Ocean Version 4.0. Sci Data 7, 176 (2020). https://doi.org/10.1038/s41597-020-0520-9 \ No newline at end of file diff --git a/data/ibcso/ibcso.md b/data/ibcso/ibcso.md new file mode 100644 index 0000000000000000000000000000000000000000..d8e03bc7d2ef7f2ef1cb05307433428d0364be8d --- /dev/null +++ b/data/ibcso/ibcso.md @@ -0,0 +1,28 @@ +# International Bathymetric Chart of the Southern Ocean (IBCSO) + +## Summary + + +IBCSO is the authoritative map of the Southern Ocean with the largest database of depth measurements. With billions of soundings contributed by organisations across the globe, it portrays the Southern Ocean seafloor in so-far unprecedented detail. + +See the [IBCSO website](https://ibcso.org/) for more information. + +The filename, download link and citation refer to last used IBCSO version and might need to be adapted when updating the dataset. + +## Files to download + +- Title: **IBCSO v2 ice-surface** +- Format: GeoTIFF (TIF) +- Filename: `IBCSO_v2_ice-surface.tif` +- Link: https://download.pangaea.de/dataset/937574/files/IBCSO_v2_ice-surface.tif +- General Link: https://www.gebco.net/data_and_products/gridded_bathymetry_data/ + +- Title: **IBCSO v2 bed** +- Format: GeoTIFF (TIF) +- Filename: `IBCSO_v2_bed.tif` +- Link: https://download.pangaea.de/dataset/937574/files/IBCSO_v2_bed.tif +- General Link: https://www.gebco.net/data_and_products/gridded_bathymetry_data/ + +## Citation + +Dorschel, Boris; Hehemann, Laura; Viquerat, Sacha; Warnke, Fynn; Dreutter, Simon; Schulze Tenberge, Yvonne et al. (2022): The International Bathymetric Chart of the Southern Ocean Version 2 (IBCSO v2) [dataset]. PANGAEA, https://doi.org/10.1594/PANGAEA.937574 diff --git a/process/9_create_contours.py b/process/0_process_gshhg.py similarity index 61% rename from process/9_create_contours.py rename to process/0_process_gshhg.py index 832932206a526f4a7358f2442999874b270c3e29..ecac44f6567819b0a5e64c2d36409f1c5fa067a3 100644 --- a/process/9_create_contours.py +++ b/process/0_process_gshhg.py @@ -4,11 +4,14 @@ #################################################################### # # # AWI Basemap # -# COMPUTE CONTOURS # +# PROCESS GSHHG COASTLINE DATA # # # #################################################################### -This script computes a contour layer from the GEBCO grid. +This script is processing the Global Self-consistent Hierarchical +High-resolution Geography (GSHHG) input for the AWI Basemap. All +geometries are fixed (with zero buffer) and the layer is converted +to a GeoPackage. """ @@ -17,8 +20,8 @@ This script computes a contour layer from the GEBCO grid. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -33,21 +36,18 @@ from config import * # PROCESS # ================================================================== -ELEV_FIELD = 'elevation' -CONTOUR_INTERVAL = 50.0 -CONTOURS_WORLD = '../data/gebco/contours_world.gpkg' +# layer names +gshhg_in_name = GSHHG_IN.stem +gshhg_world_name = GSHHG_WORLD.stem # heading print() print('====================================================================') -print(f'{"COMPUTE CONTOURS":^68}') - -msg = 'Creating World Contours...' -cmd = (f'gdal_contour' - f' -b 1' - f' -a {ELEV_FIELD}' - f' -i {CONTOUR_INTERVAL}' - f' -f "GPKG"' - f' {GEBCO_IN}' - f' {CONTOURS_WORLD}') +print(f'{"COASTLINES / GSHHG":^68}') + +msg = 'Fixing GSHHG geometries...' +cmd = (f'ogr2ogr' + f' {GSHHG_WORLD} {GSHHG_IN}' + f' -dialect sqlite' + f' -sql "SELECT ST_Union(ST_Buffer(geometry, 0.0)) AS geom FROM \"{gshhg_in_name}\"" -nln "{gshhg_world_name}" -f "GPKG"') run(msg, cmd) diff --git a/process/7_create_basemaps.py b/process/10_create_basemaps.py similarity index 62% rename from process/7_create_basemaps.py rename to process/10_create_basemaps.py index 2ed2a09c3edfb222ab6df8b4770081deb85b8de1..bb82367c8cfe0802c0f2dc4dc5627e3b517c04eb 100644 --- a/process/7_create_basemaps.py +++ b/process/10_create_basemaps.py @@ -9,10 +9,18 @@ #################################################################### This script creates the final AWI Basemaps in all three projections -and with different color palettes. This happens in two steps. First -the DEM is rendered with the color palette into an RGB color raster. -Then the shaded map is calculated by combining the colored raster -with the shading raster. +and with different color palettes. This happens in multiple steps. + + - the DEM is copied to get one for land and one for sea + - the coastlines are used as a landmask and cut out of the sea DEM + - sea and land DEMs are rendered with different color palettes + to make sure the coastline is prominent inregions with very + shallow seas where GEBCO might have close to zero values + - NoData values are set to zero + - sea and land RGB images are merged into one + - the shaded map is calculated by combining the colored raster + with the shading raster + At the end, the raster files are finalized by creating tiles and pyramids and by adding metadata tags. @@ -23,8 +31,8 @@ pyramids and by adding metadata tags. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -32,9 +40,12 @@ __status__ = 'Development' # IMPORT # ================================================================== +import shutil + # import AWI Basemap configuration from config import * + # ================================================================== # FUNCTIONS # ================================================================== @@ -58,19 +69,70 @@ def create_basemap(name, grid, hillshade, color_palette, epsg, output): Path to output RGB grid """ - # create RGB version with grid and color palette - msg = f'Creating {name} RGB...' + msg = f'Copying {name} DEM...' + print('====================================================================') + print() + print(msg) + print() + print(f'{grid} > {TMP_DEM_SEA}') + print() + shutil.copy(grid, TMP_DEM_SEA) + + msg = f'Cut land from {name} sea DEM...' + gshhg_world_name = GSHHG_WORLD.stem + cmd = (f'gdal_rasterize' + f' -l {gshhg_world_name}' + f' -burn {DEM_NODATA}' + f' {GSHHG_WORLD} {TMP_DEM_SEA}') + run(msg, cmd) + + msg = f'Rendering {name} sea as colored RGB...' cmd = (f'gdaldem' f' color-relief' - f' {grid}' + f' {TMP_DEM_SEA}' f' {color_palette}' - f' {TMP_RGB}' + f' {TMP_RGB_SEA}' + f' -of GTiff' + f' -b 1' + f' -compute_edges' + f' {GDAL_CREATE_OPTIONS}') + run(msg, cmd) + + msg = f'Fixing {name} sea Nodata...' + cmd = (f'gdal_edit' + f' -a_nodata 0' + f' {TMP_RGB_SEA}') + run(msg, cmd) + + msg = f'Rendering {name} land as colored RGB...' + cmd = (f'gdaldem' + f' color-relief' + f' {grid}' + f' {CP_LAND}' + f' {TMP_RGB_LAND}' f' -of GTiff' f' -b 1' f' -compute_edges' f' {GDAL_CREATE_OPTIONS}') run(msg, cmd) + msg = f'Fixing {name} sea Nodata...' + cmd = (f'gdal_edit' + f' -a_nodata 0' + f' {TMP_RGB_LAND}') + run(msg, cmd) + + msg = 'Merging sea and land RGB grids...' + cmd = (f'gdal_merge' + f' -o {TMP_RGB}' + f' {TMP_RGB_LAND} {TMP_RGB_SEA}') + run(msg, cmd) + + # cleanup + cleanup(TMP_DEM_SEA) + cleanup(TMP_RGB_LAND) + cleanup(TMP_RGB_SEA) + # compile shaded and colored RGB grid msg = f'Creating shaded {name} map...' cmd = (f'gdal_calc' @@ -84,7 +146,7 @@ def create_basemap(name, grid, hillshade, color_palette, epsg, output): f' --allBands=A' f' --overwrite' f' --outfile {TMP_SHADED}') - # {GDAL_CREATE_OPTIONS_PY} + # {GDAL_CREATE_OPTIONS_PY} # TODO run(msg, cmd) # cleanup @@ -94,6 +156,7 @@ def create_basemap(name, grid, hillshade, color_palette, epsg, output): msg = f'Finalizing {name}...' cmd = (f'gdal_translate' f' -a_srs EPSG:{epsg}' + f' -a_nodata {RGB_NODATA}' f' -stats' f' -of GTiff' f' {GDAL_CREATE_OPTIONS_FINAL}' @@ -105,12 +168,11 @@ def create_basemap(name, grid, hillshade, color_palette, epsg, output): cleanup(Path(f'{TMP_SHADED}.aux.xml')) # create internal overview layers - msg = f'Creating overview for {name}...' + msg = f'Creating overviews for {name}...' cmd = (f'gdaladdo' f' -r {OVERVIEW_METHOD}' f' --config COMPRESS_OVERVIEW NONE' f' --config INTERLEAVE_OVERVIEW PIXEL' - #f' --config BIGTIFF_OVERVIEW IF_NEEDED' f' --config BIGTIFF_OVERVIEW IF_SAFER' f' --config GDAL_TIFF_OVR_BLOCKSIZE {BLOCKSIZE}' f' {output}' @@ -128,6 +190,7 @@ def create_basemap(name, grid, hillshade, color_palette, epsg, output): ds.update_tags(**METADATA) print() + # ================================================================== # PROCESS # ================================================================== @@ -142,9 +205,10 @@ for kwargs in MAPS: create_basemap(**kwargs) # cleanup -cleanup(GEBCO_WORLD) -cleanup(GEBCO_WORLD_HILLSHADE) -cleanup(GEBCO_ARCTIC) -cleanup(GEBCO_ARCTIC_HILLSHADE) -cleanup(GEBCO_ANTARCTIC) -cleanup(GEBCO_ANTARCTIC_HILLSHADE) +cleanup(GSHHG_WORLD) +cleanup(DEM_WORLD) +cleanup(DEM_WORLD_HILLSHADE) +cleanup(DEM_ARCTIC) +cleanup(DEM_ARCTIC_HILLSHADE) +cleanup(DEM_ANTARCTIC) +cleanup(DEM_ANTARCTIC_HILLSHADE) diff --git a/process/8_metadata.py b/process/11_metadata.py similarity index 98% rename from process/8_metadata.py rename to process/11_metadata.py index 18b87ec9b1cdaa7d90b17c1d00ee61ba8a7d8f26..722438a05caa629bbb84a71c67e1f499393e06f3 100644 --- a/process/8_metadata.py +++ b/process/11_metadata.py @@ -18,8 +18,8 @@ the TOML configuration files for the WMS. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' diff --git a/process/12_create_contours.py b/process/12_create_contours.py new file mode 100644 index 0000000000000000000000000000000000000000..0de977ff8dc36aaa1a62c44bd4067125663fde44 --- /dev/null +++ b/process/12_create_contours.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +""" +#################################################################### +# # +# AWI Basemap # +# COMPUTE CONTOURS # +# # +#################################################################### + +This script computes a contour layer from the GEBCO grid. + +""" + +# ================================================================== +# SCRIPT INFO +# ================================================================== + +__author__ = 'Simon Dreutter' +__version__ = '0.7' +__date__ = '2024-11-18' +__email__ = 'simon.dreutter@awi.de' +__status__ = 'Development' + +# ================================================================== +# IMPORT +# ================================================================== + +# import AWI Basemap configuration +from config import * + +# ================================================================== +# PROCESS +# ================================================================== + +ELEV_FIELD = 'elevation' # TODO +CONTOUR_INTERVAL = 50.0 # TODO +CONTOUR_NAME = 'contour' +MIN_LENGTH = 10000 # m +CONTOURS_WORLD_RAW = PATH_RESULT / 'contours_world_raw.gpkg' # TODO +CONTOURS_WORLD_LENGTH = PATH_RESULT / 'contours_world_length.gpkg' # TODO +CONTOURS_WORLD_FILTER = PATH_RESULT / 'contours_world_filter.gpkg' # TODO +CONTOURS_WORLD = PATH_RESULT / 'contours_world.gpkg' # TODO +CONTOURS_WORLD = PATH_RESULT / 'contours_world_final.gpkg' # DEBUG + +# heading +print() +print('====================================================================') +print(f'{"COMPUTE CONTOURS":^68}') + +msg = 'Creating World Contours...' +cmd = (f'gdal_contour' + f' -b 1' + f' -a {ELEV_FIELD}' + f' -i {CONTOUR_INTERVAL}' + f' -nln "{CONTOUR_NAME}"' + f' -f "GPKG"' + f' {GEBCO_IN}' + f' {CONTOURS_WORLD_RAW}') +# run(msg, cmd) # DEBUG # TODO + +msg = 'Write line length...' +cmd = (f'ogr2ogr' + f' -a_srs EPSG:{EPSG_WORLD}' + f' -nln "{CONTOUR_NAME}"' + f' -nlt LINESTRING' + f' -f GPKG' + f' -overwrite' + f' {CONTOURS_WORLD_RAW} {CONTOURS_WORLD_LENGTH}' + f' -dialect SQLite' + f' -sql "SELECT *, CAST(ST_Length(ST_Transform (geom, 3395)) AS int) AS length FROM \'{CONTOUR_NAME}\'"') +run(msg, cmd) + +msg = 'Filter contours by length...' +cmd = (f'ogr2ogr' + f' -a_srs EPSG:{EPSG_WORLD}' + f' -nln "{CONTOUR_NAME}"' + f' -nlt LINESTRING' + f' -f GPKG' + f' -overwrite' + f' {CONTOURS_WORLD_LENGTH} {CONTOURS_WORLD}' + f' -dialect SQLite' + f' -sql "SELECT {ELEV_FIELD}, geom FROM \'{CONTOUR_NAME}\' WHERE length > {MIN_LENGTH}"') +run(msg, cmd) + +# ogr2ogr {contoursFile} {contoursFile} -update -dialect SQLITE -sql 'UPDATE contour SET geom = ST_Reverse(geom)'" + + +# TODO: Smooth / Simplyfy, Reverse, PGdump diff --git a/process/1_process_add.py b/process/1_process_add.py index 1a888cf432a6839f9bbba0fa22a6872ec2f37a4d..01a1001abfe05c0f4e029bf88cd2b44fe2cb4684 100644 --- a/process/1_process_add.py +++ b/process/1_process_add.py @@ -21,8 +21,8 @@ and all geometries are fixed (with zero buffer). # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -52,7 +52,7 @@ add_rock_outcrop_in_name = ADD_ROCK_OUTCROP_IN.stem # DEBUG # inconsistency with add 7.3 layer names, variable needs to be # overwritten -# TODO: remove the DEBUG block once this is fixed in the ADD layer +# TODO: remove the DEBUG block once the issue is fixed in the ADD layer add_rock_outcrop_in_name = 'add_rock_outcrop_medium_res_polygon_v7_3' # /DEBUG add_rock_outcrop_name = ADD_ROCK_OUTCROP.stem @@ -62,11 +62,12 @@ print() print('====================================================================') print(f'{"ANTARCTIC DIGITAL DATABASE / ADD":^68}') -msg = 'Reprojecting and extracting land mask from ADD coastlines...' +msg = 'Reprojecting and extracting ice sheet from ADD coastlines...' cmd = (f'ogr2ogr' f' -s_srs EPSG:{EPSG_ADD}' f' -t_srs EPSG:{EPSG_WORLD}' - f' -wrapdateline -nln "{add_ice_sheet_name}"' + f' -wrapdateline' + f' -nln "{add_ice_sheet_name}"' f' -nlt MULTIPOLYGON' f' -f GPKG' f' -overwrite' diff --git a/process/2_process_gimp.py b/process/2_process_gimp.py index d36241e80c0d2f9356626854335774d1ecdb0b68..abc64cb678b08fff93123a41e766e4005572ecf3 100644 --- a/process/2_process_gimp.py +++ b/process/2_process_gimp.py @@ -19,8 +19,8 @@ handling and then polygonized to get a vector dataset. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' diff --git a/process/3_process_glims.py b/process/3_process_glims.py index 752b67850dec096f867cba1741a6d0d0050afc62..5f374ef51bf4955b33cbba02ca823224bc4e3249 100644 --- a/process/3_process_glims.py +++ b/process/3_process_glims.py @@ -20,8 +20,8 @@ Arctic and the Antarctic. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -50,8 +50,10 @@ print(f'{"GLOBAL LAND ICE MEASUREMENTS FROM SPACE / GLIMS":^68}') msg = 'Fixing GLIMS geometries...' cmd = (f'ogr2ogr' f' {GLIMS_WORLD} {GLIMS_IN}' + f' -spat -180.0 90. 180.0 -60.0' # cut off outdated Antarctic glaciers + f' -clipsrc spat_extent' f' -dialect sqlite' - f' -sql "SELECT ST_Union(ST_Buffer(geometry, 0.0)) AS geometry,* FROM \"{glims_in_name}\"" -nln "{glims_world_name}" -f "GPKG"') + f' -sql "SELECT ST_Union(ST_Buffer(geometry, 0.0)) AS geom FROM \"{glims_in_name}\"" -nln "{glims_world_name}" -f "GPKG"') run(msg, cmd) msg = 'Clipping GLIMS for the Arctic...' diff --git a/process/4_process_ibcao.py b/process/4_process_ibcao.py new file mode 100644 index 0000000000000000000000000000000000000000..2005452c5f9a76a5002d895cc380d78a4c4254f9 --- /dev/null +++ b/process/4_process_ibcao.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- + +""" +#################################################################### +# # +# AWI Basemap # +# PROCESS INTERNATIONAL BATHYMETRIC CHART OF THE ARCTIC OCEAN # +# # +#################################################################### + +This script is processing the International Bathymetric Chart of the +Arctic Ocean (IBCAO) input for the AWI Basemap. The dataset is +reprojected (warped) to the Arctic projection (EPSG_ARCTIC) and +resampled to the target resolution (RESOLUTION_M). + +Due to ice shelves there is a very steep drop in the DEM from shelf +ice edge down to the seabed, which creates hillshade artifacts. To +avoid these, the IBCAO grid will be processed twice, once the ice +surface DEM and once the sub ice topography DEM. The main hillshade +is created from the sub ice DEM. Then all data above sea level is +extracted from the ice surface DEM, a hillshade is created for these +areas and the sub ice hillshade is replaced in these areas. + +""" + +# ================================================================== +# SCRIPT INFO +# ================================================================== + +__author__ = 'Simon Dreutter' +__version__ = '0.7' +__date__ = '2024-11-18' +__email__ = 'simon.dreutter@awi.de' +__status__ = 'Development' + +# ================================================================== +# IMPORT +# ================================================================== + +# import AWI Basemap configuration +from config import * + +# ================================================================== +# GLOBAL VARIABLES +# ================================================================== + +# projection of IBCAO data +EPSG_IBCAO = 3996 + +SOURCE_NODATA = DEM_NODATA + +RESAMPLING = 'cubic' # 'near' + +# ================================================================== +# PROCESS +# ================================================================== + +# heading +print() +print('====================================================================') +print(f'{"INTERNATIONAL BATHYMETRIC CHART OF THE ARCTIC OCEAN / IBCAO":^68}') + +# ice surface +msg = 'Warping and resampling IBCAO ice surface to target resolution...' +cmd = (f'gdalwarp' + f' -s_srs EPSG:{EPSG_IBCAO}' + f' -t_srs EPSG:{EPSG_ARCTIC}' + f' -tr {RESOLUTION_M} {RESOLUTION_M}' + f' -r {RESAMPLING}' + f' -of GTiff' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO + f' {GDAL_CREATE_OPTIONS}' + f' {IBCAO_IN} {IBCAO_ARCTIC_ICESURFACE}') +run(msg, cmd) + +# sub ice +msg = 'Warping and resampling IBCAO sub ice to target resolution...' +cmd = (f'gdalwarp' + f' -s_srs EPSG:{EPSG_IBCAO}' + f' -t_srs EPSG:{EPSG_ARCTIC}' + f' -tr {RESOLUTION_M} {RESOLUTION_M}' + f' -r {RESAMPLING}' + f' -of GTiff' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO + f' {GDAL_CREATE_OPTIONS}' + f' {IBCAO_SUBICE_IN} {IBCAO_ARCTIC_SUBICE}') +run(msg, cmd) + +# DEBUG +# there is an artifact in IBCAO v5 on the Greenland ice sheet that +# will be clipped out. In a later step the holes will be filled with +# GEBCO. +# TODO: remove DEBUG block once the issue is fixed in IBCAO +clip = PATH_IBCAO / 'clip_ibcao_artifacts.gpkg' +clip_name = clip.stem +msg = 'Fixing issues in IBCAO ice surface raster...' +cmd = (f'gdal_rasterize' + f' -l {clip_name}' + f' -burn {DEM_NODATA}' + f' {clip} {IBCAO_ARCTIC_ICESURFACE}') +run(msg, cmd) +# /DEBUG diff --git a/process/5_process_ibcso.py b/process/5_process_ibcso.py new file mode 100644 index 0000000000000000000000000000000000000000..4438586f7b5c634ee53b02e8de4de8b7683dd39c --- /dev/null +++ b/process/5_process_ibcso.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +""" +#################################################################### +# # +# AWI Basemap # +# PROCESS INTERNATIONAL BATHYMETRIC CHART OF THE SOUTHERN OCEAN # +# # +#################################################################### + +This script is processing the International Bathymetric Chart of the +Southern Ocean (IBCSO) input for the AWI Basemap. The dataset is +reprojected (warped) to the Antarctic projection (EPSG_ANTARCTIC) +and resampled to the target resolution (RESOLUTION_M). + +Due to ice shelves there is a very steep drop in the DEM from shelf +ice edge down to the seabed, which creates hillshade artifacts. To +avoid these, the IBCSO grid will be processed twice, once the ice +surface DEM and once the sub ice topography DEM. The main hillshade +is created from the sub ice DEM. Then all data above sea level is +extracted from the ice surface DEM, a hillshade is created for these +areas and the sub ice hillshade is replaced in these areas. + +""" + +# ================================================================== +# SCRIPT INFO +# ================================================================== + +__author__ = 'Simon Dreutter' +__version__ = '0.7' +__date__ = '2024-11-18' +__email__ = 'simon.dreutter@awi.de' +__status__ = 'Development' + +# ================================================================== +# IMPORT +# ================================================================== + +# import AWI Basemap configuration +from config import * + +# ================================================================== +# GLOBAL VARIABLES +# ================================================================== + +# projection of IBCSO data +EPSG_IBCSO = 9354 + +SOURCE_NODATA = -32768 + +RESAMPLING = 'cubic' # 'near' + +# ================================================================== +# PROCESS +# ================================================================== + +# heading +print() +print('====================================================================') +print(f'{"INTERNATIONAL BATHYMETRIC CHART OF THE SOUTHERN OCEAN / IBCSO":^68}') + +# ice surface +msg = 'Warping and resampling IBCSO ice surface to target resolution...' +cmd = (f'gdalwarp' + f' -s_srs EPSG:{EPSG_IBCSO}' + f' -t_srs EPSG:{EPSG_ANTARCTIC}' + f' -tr {RESOLUTION_M} {RESOLUTION_M}' + f' -r {RESAMPLING}' + f' -of GTiff' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO + f' {GDAL_CREATE_OPTIONS}' + f' {IBCSO_IN} {IBCSO_ANTARCTIC_ICESURFACE}') +run(msg, cmd) + +# sub ice +msg = 'Warping and resampling IBCSO sub ice to target resolution...' +cmd = (f'gdalwarp' + f' -s_srs EPSG:{EPSG_IBCSO}' + f' -t_srs EPSG:{EPSG_ANTARCTIC}' + f' -tr {RESOLUTION_M} {RESOLUTION_M}' + f' -r {RESAMPLING}' + f' -of GTiff' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO + f' {GDAL_CREATE_OPTIONS}' + f' {IBCSO_SUBICE_IN} {IBCSO_ANTARCTIC_SUBICE}') +run(msg, cmd) diff --git a/process/4_process_gebco.py b/process/6_process_gebco.py similarity index 56% rename from process/4_process_gebco.py rename to process/6_process_gebco.py index f3e25080cfb6106b03dac12fadf020a9bdc22c9a..0ff1e4afe6297281682aec3844d8f4fc162bb6b0 100644 --- a/process/4_process_gebco.py +++ b/process/6_process_gebco.py @@ -32,8 +32,8 @@ replaced in these areas. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -46,6 +46,14 @@ import shutil # import AWI Basemap configuration from config import * +# ================================================================== +# GLOBAL VARIABLES +# ================================================================== + +SOURCE_NODATA = -32768 + +RESAMPLING = 'cubic' # 'near' + # ================================================================== # PROCESS # ================================================================== @@ -56,13 +64,12 @@ print('====================================================================') print(f'{"GENERAL BATHYMETRIC CHART OF THE OCEANS / GEBCO":^68}') # World - -# DEBUG +# if RESOLUTION_DEG almost matches the GEBCO resolution, then use +# original GEBCO input without resampling if RESOLUTION_DEG == (1 / 60 / 60 * 15): - tr = '' + tr = '' else: - tr = f' -tr {RESOLUTION_DEG} {RESOLUTION_DEG}' -#/DEBUG + tr = f' -tr {RESOLUTION_DEG} {RESOLUTION_DEG}' # ice surface msg = 'Resampling GEBCO ice surface...' @@ -70,9 +77,11 @@ cmd = (f'gdalwarp' f' -s_srs EPSG:{EPSG_WORLD}' f' -t_srs EPSG:{EPSG_WORLD}' f'{tr}' - f' -r cubic' + f' -r {RESAMPLING}' f' -of GTiff' - f' {WARP_OPTIONS}' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO f' {GDAL_CREATE_OPTIONS}' f' {GEBCO_IN} {GEBCO_WORLD_ICESURFACE_TMP1}') run(msg, cmd) @@ -82,6 +91,8 @@ print('====================================================================') print() print(msg) print() +print(f'{GEBCO_WORLD_ICESURFACE_TMP1} > {GEBCO_WORLD}') +print() shutil.copy(GEBCO_WORLD_ICESURFACE_TMP1, GEBCO_WORLD) msg = 'Extracting World DEM above sea level...' @@ -99,6 +110,7 @@ msg = 'Fixing World DEM above sea level NoData...' cmd = (f'gdalwarp' f' -overwrite' f' -srcnodata 0' + f' -dstnodata {DEM_NODATA}' f' {GEBCO_WORLD_ICESURFACE_TMP2}' f' {GEBCO_WORLD_ICESURFACE}') run(msg, cmd) @@ -109,9 +121,11 @@ cmd = (f'gdalwarp' f' -s_srs EPSG:{EPSG_WORLD}' f' -t_srs EPSG:{EPSG_WORLD}' f'{tr}' - f' -r cubic' + f' -r {RESAMPLING}' f' -of GTiff' - f' {WARP_OPTIONS}' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO f' {GDAL_CREATE_OPTIONS}' f' {GEBCO_SUBICE_IN} {GEBCO_WORLD_SUBICE}') run(msg, cmd) @@ -121,129 +135,49 @@ msg = 'Clipping GEBCO for the Arctic...' cmd = (f'gdal_translate' f' -projwin -180.0 90.0 180.0 {ARCTIC_EXTENT_LAT}' f' -a_srs EPSG:{EPSG_WORLD}' - f' -of VRT' - f' {GEBCO_IN} {GEBCO_ARCTIC_CLIP_VRT}') + f' -of GTiff' + f' {GEBCO_IN} {GEBCO_ARCTIC_CLIP}') run(msg, cmd) -msg = 'Reprojecting GEBCO for the Arctic...' +msg = 'Reprojecting and resampling GEBCO for the Arctic...' cmd = (f'gdalwarp' f' -s_srs EPSG:{EPSG_WORLD}' f' -t_srs EPSG:{EPSG_ARCTIC}' - f' -r near' - f' -of VRT' - f' {WARP_OPTIONS}' - f' {GEBCO_ARCTIC_CLIP_VRT} {GEBCO_ARCTIC_FULL_VRT}') -run(msg, cmd) - -msg = 'Resampling Arctic to target resolution...' -cmd = (f'gdalwarp' - f' -s_srs EPSG:{EPSG_ARCTIC}' - f' -t_srs EPSG:{EPSG_ARCTIC}' f' -tr {RESOLUTION_M} {RESOLUTION_M}' - f' -r cubic' + f' -r {RESAMPLING}' f' -of GTiff' - f' {WARP_OPTIONS}' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO f' {GDAL_CREATE_OPTIONS}' - f' {GEBCO_ARCTIC_FULL_VRT} {GEBCO_ARCTIC}') + f' {GEBCO_ARCTIC_CLIP} {GEBCO_ARCTIC}') run(msg, cmd) # Antarctic -# ice surface -msg = 'Clipping GEBCO ice surface for the Antarctic...' +msg = 'Clipping GEBCO for the Antarctic...' cmd = (f'gdal_translate' f' -projwin -180.0 {ANTARCTIC_EXTENT_LAT} 180.0 -90.0' f' -a_srs EPSG:{EPSG_WORLD}' - f' -of VRT' - f' {GEBCO_IN} {GEBCO_ANTARCTIC_ICESURFACE_CLIP_VRT}') -run(msg, cmd) - -msg = 'Reprojecting GEBCO ice surface for the Antarctic...' -cmd = (f'gdalwarp' - f' -s_srs EPSG:{EPSG_WORLD}' - f' -t_srs EPSG:{EPSG_ANTARCTIC}' - f' -r near' - f' -of VRT' - f' {WARP_OPTIONS}' - f' {GEBCO_ANTARCTIC_ICESURFACE_CLIP_VRT} {GEBCO_ANTARCTIC_ICESURFACE_FULL_VRT}') -run(msg, cmd) - -msg = 'Resampling Antarctic ice surface to target resolution...' -cmd = (f'gdalwarp' - f' -s_srs EPSG:{EPSG_ANTARCTIC}' - f' -t_srs EPSG:{EPSG_ANTARCTIC}' - f' -tr {RESOLUTION_M} {RESOLUTION_M}' - f' -r cubic' f' -of GTiff' - f' {WARP_OPTIONS}' - f' {GDAL_CREATE_OPTIONS}' - f' {GEBCO_ANTARCTIC_ICESURFACE_FULL_VRT} {GEBCO_ANTARCTIC_ICESURFACE_TMP1}') -run(msg, cmd) - -msg = 'Copying Antarctic DEM...' -print('====================================================================') -print() -print(msg) -print() -shutil.copy(GEBCO_ANTARCTIC_ICESURFACE_TMP1, GEBCO_ANTARCTIC) - -msg = 'Extracting Antarctic DEM above sealevel...' -cmd = (f'gdal_calc' - f' --calc "(A >= 0) * A"' - f' --format GTiff' - f' -A {GEBCO_ANTARCTIC_ICESURFACE_TMP1}' - f' --A_band 1' - f' --overwrite' - f' --outfile {GEBCO_ANTARCTIC_ICESURFACE_TMP2}' - f' --NoDataValue=0') -run(msg, cmd) - -msg = 'Fixing Antarctic DEM above sealevel NoData...' -cmd = (f'gdalwarp' - f' -overwrite' - f' -srcnodata 0' - f' {GEBCO_ANTARCTIC_ICESURFACE_TMP2}' - f' {GEBCO_ANTARCTIC_ICESURFACE}') + f' {GEBCO_IN} {GEBCO_ANTARCTIC_CLIP}') run(msg, cmd) -# sub ice -msg = 'Clipping GEBCO sub ice for the Antarctic...' -cmd = (f'gdal_translate' - f' -projwin -180.0 {ANTARCTIC_EXTENT_LAT} 180.0 -90.0' - f' -a_srs EPSG:{EPSG_WORLD}' - f' -of VRT' - f' {GEBCO_SUBICE_IN} {GEBCO_ANTARCTIC_SUBICE_CLIP_VRT}') -run(msg, cmd) - -msg = 'Reprojecting GEBCO sub ice for the Antarctic...' +msg = 'Reprojecting and resampling GEBCO for the Antarctic...' cmd = (f'gdalwarp' f' -s_srs EPSG:{EPSG_WORLD}' f' -t_srs EPSG:{EPSG_ANTARCTIC}' - f' -r near' - f' -of VRT' - f' {WARP_OPTIONS}' - f' {GEBCO_ANTARCTIC_SUBICE_CLIP_VRT} {GEBCO_ANTARCTIC_SUBICE_FULL_VRT}') -run(msg, cmd) - -msg = 'Resampling Antarctic sub ice to target resolution...' -cmd = (f'gdalwarp' - f' -s_srs EPSG:{EPSG_ANTARCTIC}' - f' -t_srs EPSG:{EPSG_ANTARCTIC}' f' -tr {RESOLUTION_M} {RESOLUTION_M}' - f' -r cubic' + f' -r {RESAMPLING}' f' -of GTiff' - f' {WARP_OPTIONS}' + f' -srcnodata {SOURCE_NODATA}' + f' -dstnodata {DEM_NODATA}' + # f' {WARP_OPTIONS}' # TODO f' {GDAL_CREATE_OPTIONS}' - f' {GEBCO_ANTARCTIC_SUBICE_FULL_VRT} {GEBCO_ANTARCTIC_SUBICE}') + f' {GEBCO_ANTARCTIC_CLIP} {GEBCO_ANTARCTIC}') run(msg, cmd) # cleanup cleanup(GEBCO_WORLD_ICESURFACE_TMP1) cleanup(GEBCO_WORLD_ICESURFACE_TMP2) -cleanup(GEBCO_ARCTIC_CLIP_VRT) -cleanup(GEBCO_ARCTIC_FULL_VRT) -cleanup(GEBCO_ANTARCTIC_ICESURFACE_CLIP_VRT) -cleanup(GEBCO_ANTARCTIC_ICESURFACE_FULL_VRT) -cleanup(GEBCO_ANTARCTIC_ICESURFACE_TMP1) -cleanup(GEBCO_ANTARCTIC_ICESURFACE_TMP2) -cleanup(GEBCO_ANTARCTIC_SUBICE_CLIP_VRT) -cleanup(GEBCO_ANTARCTIC_SUBICE_FULL_VRT) +cleanup(GEBCO_ARCTIC_CLIP) +cleanup(GEBCO_ANTARCTIC_CLIP) diff --git a/process/7_prepare_dems.py b/process/7_prepare_dems.py new file mode 100644 index 0000000000000000000000000000000000000000..06ca1b5cb10ded8f2ca652db0c4cb6bf2ce619fa --- /dev/null +++ b/process/7_prepare_dems.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +""" +#################################################################### +# # +# AWI Basemap # +# PREPARE DEMs # +# # +#################################################################### + +This script prepares the GEBCO, IBCAO and IBCSO raster DEMs to get +the final DEMs (World, Arctic, Antarctic), both sub ice and ice +surface. + +""" + +# ================================================================== +# SCRIPT INFO +# ================================================================== + +__author__ = 'Simon Dreutter' +__version__ = '0.7' +__date__ = '2024-11-18' +__email__ = 'simon.dreutter@awi.de' +__status__ = 'Development' + +# ================================================================== +# IMPORT +# ================================================================== + +import shutil + +# import AWI Basemap configuration +from config import * + +# ================================================================== +# PROCESS +# ================================================================== + +# heading +print() +print('====================================================================') +print(f'{"PREPARE DEMs":^68}') + +# World +msg = 'Copying World DEM...' +print('====================================================================') +print() +print(msg) +print() +print(f'{GEBCO_WORLD} > {DEM_WORLD}') +print() +shutil.copy(GEBCO_WORLD, DEM_WORLD) + +# Arctic +# ice surface +msg = 'Merging Arctic ice surface DEMs...' +cmd = (f'gdal_merge' + f' -o {DEM_ARCTIC}' + f' -n {DEM_NODATA}' + f' -a_nodata {DEM_NODATA}' + f' {GEBCO_ARCTIC} {IBCAO_ARCTIC_ICESURFACE}') +run(msg, cmd) + +msg = 'Copying Arctic DEM...' +print('====================================================================') +print() +print(msg) +print() +print(f'{DEM_ARCTIC} > {DEM_ARCTIC_ICESURFACE_TMP1}') +print() +shutil.copy(DEM_ARCTIC, DEM_ARCTIC_ICESURFACE_TMP1) + +msg = 'Extracting Arctic DEM above sea level...' +cmd = (f'gdal_calc' + f' --calc "(A >= 0) * A"' + f' --format GTiff' + f' -A {DEM_ARCTIC_ICESURFACE_TMP1}' + f' --A_band 1' + f' --overwrite' + f' --outfile {DEM_ARCTIC_ICESURFACE_TMP2}' + f' --NoDataValue=0') +run(msg, cmd) + +msg = 'Fixing Arctic DEM above sea level NoData...' +cmd = (f'gdalwarp' + f' -overwrite' + f' -srcnodata 0' + f' -dstnodata {DEM_NODATA}' + f' {DEM_ARCTIC_ICESURFACE_TMP2}' + f' {DEM_ARCTIC_ICESURFACE}') +run(msg, cmd) + +# sub ice +msg = 'Merging Arctic sub ice DEMs...' +cmd = (f'gdal_merge' + f' -o {DEM_ARCTIC_SUBICE}' + f' -n {DEM_NODATA}' + f' -a_nodata {DEM_NODATA}' + f' {GEBCO_ARCTIC} {IBCAO_ARCTIC_SUBICE}') +run(msg, cmd) + +# Antarctic +# ice surface +msg = 'Merging Antarctic ice surface DEMs...' +cmd = (f'gdal_merge' + f' -o {DEM_ANTARCTIC}' + f' -n {DEM_NODATA}' + f' -a_nodata {DEM_NODATA}' + f' {GEBCO_ANTARCTIC} {IBCSO_ANTARCTIC_ICESURFACE}') +run(msg, cmd) + +msg = 'Copying Antarctic DEM...' +print('====================================================================') +print() +print(msg) +print() +print(f'{DEM_ANTARCTIC} > {DEM_ANTARCTIC_ICESURFACE_TMP1}') +print() +shutil.copy(DEM_ANTARCTIC, DEM_ANTARCTIC_ICESURFACE_TMP1) + +msg = 'Extracting Antarctic DEM above sea level...' +cmd = (f'gdal_calc' + f' --calc "(A >= 0) * A"' + f' --format GTiff' + f' -A {DEM_ANTARCTIC_ICESURFACE_TMP1}' + f' --A_band 1' + f' --overwrite' + f' --outfile {DEM_ANTARCTIC_ICESURFACE_TMP2}' + f' --NoDataValue=0') +run(msg, cmd) + +msg = 'Fixing Antarctic DEM above sea level NoData...' +cmd = (f'gdalwarp' + f' -overwrite' + f' -srcnodata 0' + f' -dstnodata {DEM_NODATA}' + f' {DEM_ANTARCTIC_ICESURFACE_TMP2}' + f' {DEM_ANTARCTIC_ICESURFACE}') +run(msg, cmd) + +# sub ice +msg = 'Merging Antarctic sub ice DEMs...' +cmd = (f'gdal_merge' + f' -o {DEM_ANTARCTIC_SUBICE}' + f' -n {DEM_NODATA}' + f' -a_nodata {DEM_NODATA}' + f' {GEBCO_ANTARCTIC} {IBCSO_ANTARCTIC_SUBICE}') +run(msg, cmd) + +# cleanup +cleanup(GEBCO_ARCTIC) +cleanup(GEBCO_ANTARCTIC) +cleanup(IBCAO_ARCTIC_ICESURFACE) +cleanup(IBCAO_ARCTIC_SUBICE) +cleanup(IBCSO_ANTARCTIC_ICESURFACE) +cleanup(IBCSO_ANTARCTIC_SUBICE) +cleanup(DEM_ARCTIC_ICESURFACE_TMP1) +cleanup(DEM_ARCTIC_ICESURFACE_TMP2) +cleanup(DEM_ANTARCTIC_ICESURFACE_TMP1) +cleanup(DEM_ANTARCTIC_ICESURFACE_TMP2) diff --git a/process/5_create_shading_layers.py b/process/8_compute_shading_layers.py similarity index 76% rename from process/5_create_shading_layers.py rename to process/8_compute_shading_layers.py index 7ebb8c63afc425906c4711f005177c5e671d1774..af6ce12125bc260e1e85fd30a7faa4b9ae575a00 100644 --- a/process/5_create_shading_layers.py +++ b/process/8_compute_shading_layers.py @@ -16,6 +16,9 @@ shading is used to get "Simon's magical relief visualization", which combines shading by synthetic illumination and shading by slope inclination. +Hillshades are compute for the <sub ice> and <ice surface> versions +and then merged (<ice surface> on top of <sub ice>) + """ # ================================================================== @@ -23,8 +26,8 @@ inclination. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -45,21 +48,6 @@ print('====================================================================') print(f'{"COMPUTE SHADING LAYERS":^68}') # World -msg = 'Creating World Hillshade...' -cmd = (f'gdaldem' - f' hillshade' - f' -b 1' - f' -z {Z_FACTOR}' - f' -s 111120.0' - f' -az 315.0' - f' -alt 45.0' - f' -compute_edges' - f' -combined' - f' -of GTiff' - f' {GDAL_CREATE_OPTIONS}' - f' {GEBCO_WORLD} {GEBCO_WORLD_HILLSHADE}') -run(msg, cmd) - msg = 'Creating World ice surface Hillshade...' cmd = (f'gdaldem' f' hillshade' @@ -92,14 +80,29 @@ run(msg, cmd) msg = 'Merging World Hillshades...' cmd = (f'gdal_merge' - f' -o {GEBCO_WORLD_HILLSHADE}' + f' -o {DEM_WORLD_HILLSHADE}' f' -n 0' f' -a_nodata 0' f' {GEBCO_WORLD_SUBICE_HILLSHADE} {GEBCO_WORLD_ICESURFACE_HILLSHADE}') run(msg, cmd) # Arctic -msg = 'Creating Arctic Hillshade...' +msg = 'Creating Arctic ice surface Hillshade...' +cmd = (f'gdaldem' + f' hillshade' + f' -b 1' + f' -z {Z_FACTOR}' + f' -s 1.0' + f' -az 315.0' + f' -alt 45.0' + f' -compute_edges' + f' -combined' + f' -of GTiff' + f' {GDAL_CREATE_OPTIONS}' + f' {DEM_ARCTIC_ICESURFACE} {DEM_ARCTIC_ICESURFACE_HILLSHADE}') +run(msg, cmd) + +msg = 'Creating Arctic sub ice Hillshade...' cmd = (f'gdaldem' f' hillshade' f' -b 1' @@ -111,7 +114,15 @@ cmd = (f'gdaldem' f' -combined' f' -of GTiff' f' {GDAL_CREATE_OPTIONS}' - f' {GEBCO_ARCTIC} {GEBCO_ARCTIC_HILLSHADE}') + f' {DEM_ARCTIC_SUBICE} {DEM_ARCTIC_SUBICE_HILLSHADE}') +run(msg, cmd) + +msg = 'Merging Arctic Hillshades...' +cmd = (f'gdal_merge' + f' -o {DEM_ARCTIC_HILLSHADE}' + f' -n 0' + f' -a_nodata 0' + f' {DEM_ARCTIC_SUBICE_HILLSHADE} {DEM_ARCTIC_ICESURFACE_HILLSHADE}') run(msg, cmd) # Antarctic @@ -127,7 +138,7 @@ cmd = (f'gdaldem' f' -combined' f' -of GTiff' f' {GDAL_CREATE_OPTIONS}' - f' {GEBCO_ANTARCTIC_ICESURFACE} {GEBCO_ANTARCTIC_ICESURFACE_HILLSHADE}') + f' {DEM_ANTARCTIC_ICESURFACE} {DEM_ANTARCTIC_ICESURFACE_HILLSHADE}') run(msg, cmd) msg = 'Creating Antarctic sub ice Hillshade...' @@ -142,15 +153,15 @@ cmd = (f'gdaldem' f' -combined' f' -of GTiff' f' {GDAL_CREATE_OPTIONS}' - f' {GEBCO_ANTARCTIC_SUBICE} {GEBCO_ANTARCTIC_SUBICE_HILLSHADE}') + f' {DEM_ANTARCTIC_SUBICE} {DEM_ANTARCTIC_SUBICE_HILLSHADE}') run(msg, cmd) msg = 'Merging Antarctic Hillshades...' cmd = (f'gdal_merge' - f' -o {GEBCO_ANTARCTIC_HILLSHADE}' + f' -o {DEM_ANTARCTIC_HILLSHADE}' f' -n 0' f' -a_nodata 0' - f' {GEBCO_ANTARCTIC_SUBICE_HILLSHADE} {GEBCO_ANTARCTIC_ICESURFACE_HILLSHADE}') + f' {DEM_ANTARCTIC_SUBICE_HILLSHADE} {DEM_ANTARCTIC_ICESURFACE_HILLSHADE}') run(msg, cmd) # cleanup @@ -158,7 +169,11 @@ cleanup(GEBCO_WORLD_ICESURFACE) cleanup(GEBCO_WORLD_ICESURFACE_HILLSHADE) cleanup(GEBCO_WORLD_SUBICE) cleanup(GEBCO_WORLD_SUBICE_HILLSHADE) -cleanup(GEBCO_ANTARCTIC_ICESURFACE) -cleanup(GEBCO_ANTARCTIC_ICESURFACE_HILLSHADE) -cleanup(GEBCO_ANTARCTIC_SUBICE) -cleanup(GEBCO_ANTARCTIC_SUBICE_HILLSHADE) +cleanup(DEM_ARCTIC_ICESURFACE) +cleanup(DEM_ARCTIC_ICESURFACE_HILLSHADE) +cleanup(DEM_ARCTIC_SUBICE) +cleanup(DEM_ARCTIC_SUBICE_HILLSHADE) +cleanup(DEM_ANTARCTIC_ICESURFACE) +cleanup(DEM_ANTARCTIC_ICESURFACE_HILLSHADE) +cleanup(DEM_ANTARCTIC_SUBICE) +cleanup(DEM_ANTARCTIC_SUBICE_HILLSHADE) diff --git a/process/6_burn_vector_layers.py b/process/9_burn_vector_layers.py similarity index 87% rename from process/6_burn_vector_layers.py rename to process/9_burn_vector_layers.py index 50234a7e16c2fcfe204fb068efbddeccee654b4f..4dfb4e35b2379277bc794a8b81469fa55c2c0fac 100644 --- a/process/6_burn_vector_layers.py +++ b/process/9_burn_vector_layers.py @@ -20,8 +20,8 @@ wherever they intersect with the vector layers. # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.5' -__date__ = '2024-09-09' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -55,18 +55,19 @@ print() print('====================================================================') print(f'{"BURN VECTOR LAYERS":^68}') +# World msg = 'Burning Antarctic ice shelves in World raster...' cmd = (f'gdal_rasterize' f' -l {add_shelf_ice_name}' f' -burn {V_SHELF_ICE}' - f' {ADD_SHELF_ICE} {GEBCO_WORLD}') + f' {ADD_SHELF_ICE} {DEM_WORLD}') run(msg, cmd) msg = 'Burning Antarctic ice sheet in World raster...' cmd = (f'gdal_rasterize' f' -l {add_ice_sheet_name}' f' -burn {V_ICE_SHEET}' - f' {ADD_ICE_SHEET} {GEBCO_WORLD}') + f' {ADD_ICE_SHEET} {DEM_WORLD}') run(msg, cmd) msg = 'Burning Antarctic rock outcrops in World raster...' @@ -74,49 +75,51 @@ cmd = (f'gdal_rasterize' f' -l {add_rock_outcrop_name}' f' -burn {V_ROCK_OUTCROPS}' f' -at' - f' {ADD_ROCK_OUTCROP} {GEBCO_WORLD}') + f' {ADD_ROCK_OUTCROP} {DEM_WORLD}') run(msg, cmd) msg = 'Burning Greenland ice sheet in World raster...' cmd = (f'gdal_rasterize' f' -l {gimp_name}' f' -burn {V_ICE_SHEET}' - f' {GIMP} {GEBCO_WORLD}') + f' {GIMP} {DEM_WORLD}') run(msg, cmd) msg = 'Burning glaciers in World raster...' cmd = (f'gdal_rasterize' f' -l {glims_world_name}' f' -burn {V_ICE_SHEET}' - f' {GLIMS_WORLD} {GEBCO_WORLD}') + f' {GLIMS_WORLD} {DEM_WORLD}') run(msg, cmd) +# Arctic msg = 'Burning Greenland ice sheet in Arctic raster...' cmd = (f'gdal_rasterize' f' -l {gimp_name}' f' -burn {V_ICE_SHEET}' - f' {GIMP} {GEBCO_ARCTIC}') + f' {GIMP} {DEM_ARCTIC}') run(msg, cmd) msg = 'Burning glaciers in Arctic raster...' cmd = (f'gdal_rasterize' f' -l {glims_arctic_name}' f' -burn {V_ICE_SHEET}' - f' {GLIMS_ARCTIC} {GEBCO_ARCTIC}') + f' {GLIMS_ARCTIC} {DEM_ARCTIC}') run(msg, cmd) +# Antarctic msg = 'Burning Antarctic ice shelves in Antarctic raster...' cmd = (f'gdal_rasterize' f' -l {add_shelf_ice_name}' f' -burn {V_SHELF_ICE}' - f' {ADD_SHELF_ICE} {GEBCO_ANTARCTIC}') + f' {ADD_SHELF_ICE} {DEM_ANTARCTIC}') run(msg, cmd) msg = 'Burning Antarctic ice sheet in Antarctic raster...' cmd = (f'gdal_rasterize' f' -l {add_ice_sheet_name}' f' -burn {V_ICE_SHEET}' - f' {ADD_ICE_SHEET} {GEBCO_ANTARCTIC}') + f' {ADD_ICE_SHEET} {DEM_ANTARCTIC}') run(msg, cmd) msg = 'Burning Antarctic rock outcrops in Antarctic raster...' @@ -124,14 +127,14 @@ cmd = (f'gdal_rasterize' f' -l {add_rock_outcrop_name}' f' -burn {V_ROCK_OUTCROPS}' f' -at' - f' {ADD_ROCK_OUTCROP} {GEBCO_ANTARCTIC}') + f' {ADD_ROCK_OUTCROP} {DEM_ANTARCTIC}') run(msg, cmd) msg = 'Burning glaciers in Antarctic raster...' cmd = (f'gdal_rasterize' f' -l {glims_antarctic_name}' f' -burn {V_ICE_SHEET}' - f' {GLIMS_ANTARCTIC} {GEBCO_ANTARCTIC}') + f' {GLIMS_ANTARCTIC} {DEM_ANTARCTIC}') run(msg, cmd) # cleanup diff --git a/process/RUN.py b/process/RUN.py index 5a248c44cdd039a662e6e2c94d069f37b64c892b..20b71f1446cda753334b5e60c7622705e340c218 100644 --- a/process/RUN.py +++ b/process/RUN.py @@ -14,8 +14,8 @@ # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -43,14 +43,18 @@ print() PYTHON = sys.executable +subprocess.call([PYTHON, '0_process_gshhg.py']) subprocess.call([PYTHON, '1_process_add.py']) subprocess.call([PYTHON, '2_process_gimp.py']) subprocess.call([PYTHON, '3_process_glims.py']) -subprocess.call([PYTHON, '4_process_gebco.py']) -subprocess.call([PYTHON, '5_create_shading_layers.py']) -subprocess.call([PYTHON, '6_burn_vector_layers.py']) -subprocess.call([PYTHON, '7_create_basemaps.py']) -subprocess.call([PYTHON, '8_metadata.py']) +subprocess.call([PYTHON, '4_process_ibcao.py']) +subprocess.call([PYTHON, '5_process_ibcso.py']) +subprocess.call([PYTHON, '6_process_gebco.py']) +subprocess.call([PYTHON, '7_prepare_dems.py']) +subprocess.call([PYTHON, '8_compute_shading_layers.py']) +subprocess.call([PYTHON, '9_burn_vector_layers.py']) +subprocess.call([PYTHON, '10_create_basemaps.py']) +subprocess.call([PYTHON, '11_metadata.py']) # ================================================================== diff --git a/process/config.py b/process/config.py index f1413631b476bf7b184c912bc6a9abeaf7708cfd..b349a02b921e991078c99ce579b9eef067ddbd01 100644 --- a/process/config.py +++ b/process/config.py @@ -29,8 +29,8 @@ here: # ================================================================== __author__ = 'Simon Dreutter' -__version__ = '0.6' -__date__ = '2024-11-08' +__version__ = '0.7' +__date__ = '2024-11-18' __email__ = 'simon.dreutter@awi.de' __status__ = 'Development' @@ -76,16 +76,19 @@ TITLE = 'AWI Basemap' VERSION = '2024' ABSTRACT = f''' -The {TITLE} (version {VERSION}) is a global basemap for GIS applications or web map viewers. The map is a rendered and shaded RGB version of the current GEBCO grid with ice overlays from ADD, GLIMS and GIMP. It is available in three projections, {CRS_WORLD.to_string()} for the global map as well as {CRS_ARCTIC.to_string()} and {CRS_ANTARCTIC.to_string()} for the polar stereographic versions. +The {TITLE} (version {VERSION}) is a global basemap for GIS applications or web map viewers. The map is a rendered and shaded RGB version of the current GEBCO grid with polar grids from IBCAO and IBCSO and ice overlays from ADD, GLIMS and GIMP. It is available in three projections, {CRS_WORLD.to_string()} for the global map as well as {CRS_ARCTIC.to_string()} and {CRS_ANTARCTIC.to_string()} for the polar stereographic versions. '''.strip() SOURCES = ''' GEBCO Compilation Group (2024) GEBCO 2024 Grid. https://doi.org/10.5285/1c44ce99-0a0d-5f4f-e063-7086abc0ea0f +Jakobsson, M., Mayer, L.A., Bringensparr, C. et al. The International Bathymetric Chart of the Arctic Ocean Version 4.0. Sci Data 7, 176 (2020). https://doi.org/10.1038/s41597-020-0520-9 +Dorschel, Boris; Hehemann, Laura; Viquerat, Sacha; Warnke, Fynn; Dreutter, Simon; Schulze Tenberge, Yvonne et al. (2022): The International Bathymetric Chart of the Southern Ocean Version 2 (IBCSO v2) [dataset]. PANGAEA, https://doi.org/10.1594/PANGAEA.937574 GLIMS Consortium, 2005. GLIMS Glacier Database, Version 1. Boulder Colorado, USA. NASA National Snow and Ice Data Center Distributed Active Archive Center. https://doi.org/10.7265/N5V98602 [2023-05-16] Howat, I. 2017. MEaSUREs Greenland Ice Mapping Project (GIMP) Land Ice and Ocean Classification Mask, Version 1. [GimpIceMask_90m_2015_v1.2]. Boulder, Colorado USA. NASA National Snow and Ice Data Center Distributed Active Archive Center. https://doi.org/10.5067/B8X58MQBFUPA [2024-09-09] Howat, I., A. Negrete, and B. Smith. 2014. The Greenland Ice Mapping Project (GIMP) land classification and surface elevation data sets. The Cryosphere, 8. 1509-1518. https://doi.org/10.5194/tc-8-1509-2014 Gerrish, L., Ireland, L., Fretwell, P., & Cooper, P. (2024). Medium resolution vector polygons of the Antarctic coastline (7.9) [Data set]. UK Polar Data Centre, Natural Environment Research Council, UK Research & Innovation. https://doi.org/10.5285/aaec1295-b0a8-4c49-a751-d964c326ce8d Gerrish, L., Fretwell, P., & Cooper, P. (2020). Medium resolution vector polygons of Antarctic rock outcrop (7.3) [Data set]. UK Polar Data Centre, Natural Environment Research Council, UK Research & Innovation. https://doi.org/10.5285/077e1f04-7068-4327-a4f2-71d863f70064 +Wessel, P., and W. H. F. Smith, A Global Self-consistent, Hierarchical, High-resolution Shoreline Database, J. Geophys. Res., 101, 8741-8743, 1996. '''.strip() ABSTRACT_WMS = f''' @@ -145,6 +148,9 @@ PATH_ADD = PATH_DATA / 'add' PATH_GEBCO = PATH_DATA / 'gebco' PATH_GIMP = PATH_DATA / 'gimp' PATH_GLIMS = PATH_DATA / 'glims' +PATH_GSHHG = PATH_DATA / 'gshhg' +PATH_IBCAO = PATH_DATA / 'ibcao' +PATH_IBCSO = PATH_DATA / 'ibcso' # path to result directory PATH_RESULT = Path('..', 'result').resolve() @@ -172,6 +178,17 @@ GIMP_IN = PATH_GIMP / 'GimpIceMask_90m_2015_v1.2.tif' # input filepath to GLIMS Esri Shapefile GLIMS_IN = PATH_GLIMS / 'glims_polygons.shp' +# input filepath to GSHHG Esri Shapefile +GSHHG_IN = PATH_GSHHG / 'GSHHS_f_L1.shp' + +# input filepath to IBCAO GeoTIFF grids +IBCAO_IN = PATH_IBCAO / 'ibcao_v5_2024_ice_400m.tiff' +IBCAO_SUBICE_IN = PATH_IBCAO / 'ibcao_v5_2024_depth_400m.tiff' + +# input filepath to IBCSO GeoTIFF grids +IBCSO_IN = PATH_IBCSO / 'IBCSO_v2_ice-surface.tif' +IBCSO_SUBICE_IN = PATH_IBCSO / 'IBCSO_v2_bed.tif' + # ================================================================== # GENERAL CREATE OPTIONS # ================================================================== @@ -194,8 +211,8 @@ GLIMS_IN = PATH_GLIMS / 'glims_polygons.shp' # warping in the lower latitudes. # Final AWI Basemap (World) resolution -RESOLUTION_DEG = 1 / 60 / 60 * 15 # 15 arc seconds (original GEBCO resolution) -# RESOLUTION_DEG = 1 / 60 / 60 * 30 # 30 arc seconds +RESOLUTION_DEG = 1 / 60 / 60 * 15 # 15 arc seconds (original GEBCO resolution) +# RESOLUTION_DEG = 1 / 60 / 60 * 30 # 30 arc seconds # Final AWI Basemap (Arctic and Antarctic) resolution RESOLUTION_M = 500.0 # approximate pendant to 15 arc seconds @@ -218,6 +235,11 @@ Z_FACTOR = 10.0 # cleaned up) during the process. The variables care used throughout # the different scripts. +# GSHHG: +GSHHG_WORLD = PATH_GSHHG / 'gshhg_world.gpkg' + +# ================================================================== + # ADD: ADD_ICE_SHEET = PATH_ADD / 'add_ice_sheet.gpkg' ADD_SHELF_ICE = PATH_ADD / 'add_shelf_ice.gpkg' @@ -238,6 +260,18 @@ GLIMS_ANTARCTIC = PATH_GLIMS / 'glims_antarctic.gpkg' # ================================================================== +# IBCAO: +IBCAO_ARCTIC_ICESURFACE = PATH_IBCAO / 'ibcao_arctic_icesurface.tif' +IBCAO_ARCTIC_SUBICE = PATH_IBCAO / 'ibcao_arctic_subice.tif' + +# ================================================================== + +# IBCSO: +IBCSO_ANTARCTIC_ICESURFACE = PATH_IBCSO / 'ibcso_antarctic_icesurface.tif' +IBCSO_ANTARCTIC_SUBICE = PATH_IBCSO / 'ibcso_antarctic_subice.tif' + +# ================================================================== + # GEBCO: # GEBCO World ice surface GEBCO_WORLD_ICESURFACE_TMP1 = PATH_GEBCO / 'gebco_world_icesurface_tmp1.tif' @@ -249,37 +283,50 @@ GEBCO_WORLD_ICESURFACE_HILLSHADE = PATH_GEBCO / 'gebco_world_icesurface_hillshad GEBCO_WORLD_SUBICE = PATH_GEBCO / 'gebco_world_subice.tif' GEBCO_WORLD_SUBICE_HILLSHADE = PATH_GEBCO / 'gebco_world_subice_hillshade.tif' -# GEBCO World combined +# GEBCO World GEBCO_WORLD = PATH_GEBCO / 'gebco_world.tif' -GEBCO_WORLD_HILLSHADE = PATH_GEBCO / 'gebco_world_hillshade.tif' # GEBCO Arctic -GEBCO_ARCTIC_CLIP_VRT = PATH_GEBCO / 'gebco_arctic_clip.vrt' -GEBCO_ARCTIC_FULL_VRT = PATH_GEBCO / 'gebco_arctic_full.vrt' +GEBCO_ARCTIC_CLIP = PATH_GEBCO / 'gebco_arctic_clip.tif' GEBCO_ARCTIC = PATH_GEBCO / 'gebco_arctic.tif' -GEBCO_ARCTIC_HILLSHADE = PATH_GEBCO / 'gebco_arctic_hillshade.tif' - -# GEBCO Antarctic ice surface -GEBCO_ANTARCTIC_ICESURFACE_CLIP_VRT = PATH_GEBCO / 'gebco_antarctic_icesurface_clip.vrt' -GEBCO_ANTARCTIC_ICESURFACE_FULL_VRT = PATH_GEBCO / 'gebco_antarctic_icesurface_full.vrt' -GEBCO_ANTARCTIC_ICESURFACE_TMP1 = PATH_GEBCO / 'gebco_antarctic_icesurface_tmp1.tif' -GEBCO_ANTARCTIC_ICESURFACE_TMP2 = PATH_GEBCO / 'gebco_antarctic_icesurface_tmp2.tif' -GEBCO_ANTARCTIC_ICESURFACE = PATH_GEBCO / 'gebco_antarctic_icesurface.tif' -GEBCO_ANTARCTIC_ICESURFACE_HILLSHADE = PATH_GEBCO / 'gebco_antarctic_icesurface_hillshade.tif' - -# GEBCO Antarctic sub ice -GEBCO_ANTARCTIC_SUBICE_CLIP_VRT = PATH_GEBCO / 'gebco_antarctic_subice_clip.vrt' -GEBCO_ANTARCTIC_SUBICE_FULL_VRT = PATH_GEBCO / 'gebco_antarctic_subice_full.vrt' -GEBCO_ANTARCTIC_SUBICE = PATH_GEBCO / 'gebco_antarctic_subice.tif' -GEBCO_ANTARCTIC_SUBICE_HILLSHADE = PATH_GEBCO / 'gebco_antarctic_subice_hillshade.tif' - -# Antarctic combined + +# GEBCO Antarctic +GEBCO_ANTARCTIC_CLIP = PATH_GEBCO / 'gebco_antarctic_clip.tif' GEBCO_ANTARCTIC = PATH_GEBCO / 'gebco_antarctic.tif' -GEBCO_ANTARCTIC_HILLSHADE = PATH_GEBCO / 'gebco_antarctic_hillshade.tif' + +# ================================================================== + +# DEMs: +# World +DEM_WORLD = PATH_GEBCO / 'dem_world.tif' +DEM_WORLD_HILLSHADE = PATH_GEBCO / 'dem_world_hillshade.tif' + +# Arctic +DEM_ARCTIC_ICESURFACE_TMP1 = PATH_GEBCO / 'dem_arctic_icesurface_tmp1.tif' +DEM_ARCTIC_ICESURFACE_TMP2 = PATH_GEBCO / 'dem_arctic_icesurface_tmp2.tif' +DEM_ARCTIC_ICESURFACE = PATH_GEBCO / 'dem_arctic_icesurface.tif' +DEM_ARCTIC_ICESURFACE_HILLSHADE = PATH_GEBCO / 'dem_arctic_icesurface_hillshade.tif' +DEM_ARCTIC_SUBICE = PATH_GEBCO / 'dem_arctic_subice.tif' +DEM_ARCTIC_SUBICE_HILLSHADE = PATH_GEBCO / 'dem_arctic_subice_hillshade.tif' +DEM_ARCTIC = PATH_GEBCO / 'dem_arctic.tif' +DEM_ARCTIC_HILLSHADE = PATH_GEBCO / 'dem_arctic_hillshade.tif' + +# Antarctic +DEM_ANTARCTIC_ICESURFACE_TMP1 = PATH_GEBCO / 'dem_antarctic_icesurface_tmp1.tif' +DEM_ANTARCTIC_ICESURFACE_TMP2 = PATH_GEBCO / 'dem_antarctic_icesurface_tmp2.tif' +DEM_ANTARCTIC_ICESURFACE = PATH_GEBCO / 'dem_antarctic_icesurface.tif' +DEM_ANTARCTIC_ICESURFACE_HILLSHADE = PATH_GEBCO / 'dem_antarctic_icesurface_hillshade.tif' +DEM_ANTARCTIC_SUBICE = PATH_GEBCO / 'dem_antarctic_subice.tif' +DEM_ANTARCTIC_SUBICE_HILLSHADE = PATH_GEBCO / 'dem_antarctic_subice_hillshade.tif' +DEM_ANTARCTIC = PATH_GEBCO / 'dem_antarctic.tif' +DEM_ANTARCTIC_HILLSHADE = PATH_GEBCO / 'dem_antarctic_hillshade.tif' # ================================================================== # temporary files for final shading +TMP_DEM_SEA = PATH_GEBCO / 'tmp_dem_sea.tif' +TMP_RGB_LAND = PATH_GEBCO / 'tmp_rgb_land.tif' +TMP_RGB_SEA = PATH_GEBCO / 'tmp_rgb_sea.tif' TMP_RGB = PATH_GEBCO / 'tmp_rgb.tif' TMP_SHADED = PATH_GEBCO / 'tmp_shaded.tif' @@ -312,73 +359,76 @@ BASEMAP_ANTARCTIC_GREY = PATH_RESULT / 'AWI_Basemap_Antarctic_grey.tif' # ================================================================== # color palettes -CP_BLUE = Path('..', 'styles', 'color_palettes', 'basemap_blue.txt').resolve() -CP_GREYBLUE = Path('..', 'styles', 'color_palettes', 'basemap_greyblue.txt').resolve() -CP_GREY = Path('..', 'styles', 'color_palettes', 'basemap_grey.txt').resolve() +PATH_COLORS = Path('..', 'styles', 'color_palettes').resolve() + +CP_LAND = PATH_COLORS / 'basemap_land.txt' +CP_BLUE = PATH_COLORS / 'basemap_blue_sea.txt' +CP_GREYBLUE = PATH_COLORS / 'basemap_greyblue_sea.txt' +CP_GREY = PATH_COLORS / 'basemap_grey_sea.txt' # ================================================================== # map combinations to be compiled at the end MAPS = [ {'name': 'AWI Basemap World blue', - 'grid': GEBCO_WORLD, - 'hillshade': GEBCO_WORLD_HILLSHADE, + 'grid': DEM_WORLD, + 'hillshade': DEM_WORLD_HILLSHADE, 'color_palette': CP_BLUE, 'epsg': EPSG_WORLD, 'output': BASEMAP_WORLD_BLUE}, {'name': 'AWI Basemap Arctic blue', - 'grid': GEBCO_ARCTIC, - 'hillshade': GEBCO_ARCTIC_HILLSHADE, + 'grid': DEM_ARCTIC, + 'hillshade': DEM_ARCTIC_HILLSHADE, 'color_palette': CP_BLUE, 'epsg': EPSG_ARCTIC, 'output': BASEMAP_ARCTIC_BLUE}, {'name': 'AWI Basemap Antarctic blue', - 'grid': GEBCO_ANTARCTIC, - 'hillshade': GEBCO_ANTARCTIC_HILLSHADE, + 'grid': DEM_ANTARCTIC, + 'hillshade': DEM_ANTARCTIC_HILLSHADE, 'color_palette': CP_BLUE, 'epsg': EPSG_ANTARCTIC, 'output': BASEMAP_ANTARCTIC_BLUE}, {'name': 'AWI Basemap World greyblue', - 'grid': GEBCO_WORLD, - 'hillshade': GEBCO_WORLD_HILLSHADE, + 'grid': DEM_WORLD, + 'hillshade': DEM_WORLD_HILLSHADE, 'color_palette': CP_GREYBLUE, 'epsg': EPSG_WORLD, 'output': BASEMAP_WORLD_GREYBLUE}, {'name': 'AWI Basemap Arctic greyblue', - 'grid': GEBCO_ARCTIC, - 'hillshade': GEBCO_ARCTIC_HILLSHADE, + 'grid': DEM_ARCTIC, + 'hillshade': DEM_ARCTIC_HILLSHADE, 'color_palette': CP_GREYBLUE, 'epsg': EPSG_ARCTIC, 'output': BASEMAP_ARCTIC_GREYBLUE}, {'name': 'AWI Basemap Antarctic greyblue', - 'grid': GEBCO_ANTARCTIC, - 'hillshade': GEBCO_ANTARCTIC_HILLSHADE, + 'grid': DEM_ANTARCTIC, + 'hillshade': DEM_ANTARCTIC_HILLSHADE, 'color_palette': CP_GREYBLUE, 'epsg': EPSG_ANTARCTIC, 'output': BASEMAP_ANTARCTIC_GREYBLUE}, {'name': 'AWI Basemap World grey', - 'grid': GEBCO_WORLD, - 'hillshade': GEBCO_WORLD_HILLSHADE, + 'grid': DEM_WORLD, + 'hillshade': DEM_WORLD_HILLSHADE, 'color_palette': CP_GREY, 'epsg': EPSG_WORLD, 'output': BASEMAP_WORLD_GREY}, {'name': 'AWI Basemap Arctic grey', - 'grid': GEBCO_ARCTIC, - 'hillshade': GEBCO_ARCTIC_HILLSHADE, + 'grid': DEM_ARCTIC, + 'hillshade': DEM_ARCTIC_HILLSHADE, 'color_palette': CP_GREY, 'epsg': EPSG_ARCTIC, 'output': BASEMAP_ARCTIC_GREY}, {'name': 'AWI Basemap Antarctic grey', - 'grid': GEBCO_ANTARCTIC, - 'hillshade': GEBCO_ANTARCTIC_HILLSHADE, + 'grid': DEM_ANTARCTIC, + 'hillshade': DEM_ANTARCTIC_HILLSHADE, 'color_palette': CP_GREY, 'epsg': EPSG_ANTARCTIC, 'output': BASEMAP_ANTARCTIC_GREY}, @@ -400,13 +450,17 @@ OWNER_LAYER_TOML = PATH_RESULT / 'owner.layer.toml' # GDAL creation options # GDAL_CREATE_OPTIONS = '-co COMPRESS=NONE -co BIGTIFF=IF_NEEDED' +# GDAL_CREATE_OPTIONS = '-co COMPRESS=NONE -co BIGTIFF=IF_SAFER' # GDAL_CREATE_OPTIONS = '-co COMPRESS=DEFLATE -co PREDICTOR=2 -co ZLEVEL=9 -co BIGTIFF=YES' -GDAL_CREATE_OPTIONS = '-co COMPRESS=DEFLATE -co PREDICTOR=2 -co ZLEVEL=9 -co BIGTIFF=IF_NEEDED' +# GDAL_CREATE_OPTIONS = '-co COMPRESS=DEFLATE -co PREDICTOR=2 -co ZLEVEL=9 -co BIGTIFF=IF_NEEDED' +GDAL_CREATE_OPTIONS = '-co COMPRESS=DEFLATE -co PREDICTOR=2 -co ZLEVEL=9 -co BIGTIFF=IF_SAFER' # GDAL creation options for python modules # GDAL_CREATE_OPTIONS_PY = '--co COMPRESS=NONE --co BIGTIFF=IF_NEEDED' +# GDAL_CREATE_OPTIONS_PY = '--co COMPRESS=NONE --co BIGTIFF=IF_SAFER' # GDAL_CREATE_OPTIONS_PY = '--co COMPRESS=DEFLATE --co PREDICTOR=2 --co ZLEVEL=9 --co BIGTIFF=YES' -GDAL_CREATE_OPTIONS_PY = '--co COMPRESS=DEFLATE --co PREDICTOR=2 --co ZLEVEL=9 --co BIGTIFF=IF_NEEDED' +# GDAL_CREATE_OPTIONS_PY = '--co COMPRESS=DEFLATE --co PREDICTOR=2 --co ZLEVEL=9 --co BIGTIFF=IF_NEEDED' +GDAL_CREATE_OPTIONS_PY = '--co COMPRESS=DEFLATE --co PREDICTOR=2 --co ZLEVEL=9 --co BIGTIFF=IF_SAFER' # GDAL warp options WARP_OPTIONS = '-wo SOURCE_EXTRA=1000 -et 0' @@ -424,6 +478,12 @@ OVERVIEW_METHOD = 'cubic' # Overview levels OVERVIEWS = [2, 4, 8, 16, 32, 64] +# DEM NoData value before RGB rendering +DEM_NODATA = -32767 +# RGB Nodata value +RGB_NODATA = 255 + + # ================================================================== # RUN FUNCTION # ================================================================== @@ -439,41 +499,63 @@ def run(msg, cmd): os.system(cmd) print() + # ================================================================== # CLEANUP # ================================================================== # list of temporary files that shall not be deleted -DONT_DELETE = [ - # ADD_SHELF_ICE, +DO_NOT_DELETE = [ + # GSHHG_WORLD, # ADD_ICE_SHEET, + # ADD_SHELF_ICE, # ADD_ROCK_OUTCROP, # GIMP_RASTER, # GIMP, # GLIMS_WORLD, # GLIMS_ARCTIC, # GLIMS_ANTARCTIC, + # IBCAO_ARCTIC_ICESURFACE, + # IBCAO_ARCTIC_SUBICE, + # IBCSO_ANTARCTIC_ICESURFACE, + # IBCSO_ANTARCTIC_SUBICE, + # GEBCO_WORLD_ICESURFACE_TMP1, + # GEBCO_WORLD_ICESURFACE_TMP2, # GEBCO_WORLD_ICESURFACE, # GEBCO_WORLD_ICESURFACE_HILLSHADE, # GEBCO_WORLD_SUBICE, # GEBCO_WORLD_SUBICE_HILLSHADE, # GEBCO_WORLD, - # GEBCO_WORLD_HILLSHADE, + # GEBCO_ARCTIC_CLIP, # GEBCO_ARCTIC, - # GEBCO_ARCTIC_HILLSHADE, - # GEBCO_ANTARCTIC_ICESURFACE, - # GEBCO_ANTARCTIC_ICESURFACE_HILLSHADE, - # GEBCO_ANTARCTIC_SUBICE, - # GEBCO_ANTARCTIC_SUBICE_HILLSHADE, + # GEBCO_ANTARCTIC_CLIP, # GEBCO_ANTARCTIC, - # GEBCO_ANTARCTIC_HILLSHADE + # DEM_WORLD, + # DEM_WORLD_HILLSHADE, + # DEM_ARCTIC_ICESURFACE_TMP1, + # DEM_ARCTIC_ICESURFACE_TMP2, + # DEM_ARCTIC_ICESURFACE, + # DEM_ARCTIC_ICESURFACE_HILLSHADE, + # DEM_ARCTIC_SUBICE, + # DEM_ARCTIC_SUBICE_HILLSHADE, + # DEM_ARCTIC, + # DEM_ARCTIC_HILLSHADE, + # DEM_ANTARCTIC_ICESURFACE_TMP1, + # DEM_ANTARCTIC_ICESURFACE_TMP2, + # DEM_ANTARCTIC_ICESURFACE, + # DEM_ANTARCTIC_ICESURFACE_HILLSHADE, + # DEM_ANTARCTIC_SUBICE, + # DEM_ANTARCTIC_SUBICE_HILLSHADE, + # DEM_ANTARCTIC, + # DEM_ANTARCTIC_HILLSHADE, ] + # function to clean up temporary files if they are not in the -# DONT_DELETE list +# DO_NOT_DELETE list def cleanup(dataset): if isinstance(dataset, str): dataset = Path(dataset) - if dataset not in DONT_DELETE: + if dataset not in DO_NOT_DELETE: if dataset.is_file(): dataset.unlink() diff --git a/styles/color_palettes/basemap_blue.txt b/styles/color_palettes/basemap_blue.txt index c3376309e136362622d130ca252447e7831da91f..db711bf51777c528d85d2313e1c7e8a165573d9f 100644 --- a/styles/color_palettes/basemap_blue.txt +++ b/styles/color_palettes/basemap_blue.txt @@ -1,9 +1,10 @@ +nv 0 0 0 255 -12000 40 53 64 255 -6000 68 92 110 255 -1000 142 209 229 255 --10 232 250 255 255 --4 255 255 255 255 -5 230 230 230 255 +-50 232 250 255 255 +0 255 255 255 255 +10 230 230 230 255 100 204 204 204 255 1000 179 179 179 255 10000 153 153 153 255 diff --git a/styles/color_palettes/basemap_blue_sea.txt b/styles/color_palettes/basemap_blue_sea.txt new file mode 100644 index 0000000000000000000000000000000000000000..c554646fc9453b44393d66764f1ce3bf8ca341c0 --- /dev/null +++ b/styles/color_palettes/basemap_blue_sea.txt @@ -0,0 +1,7 @@ +nv 0 0 0 255 +-12000 40 53 64 255 +-6000 68 92 110 255 +-1000 142 209 229 255 +-50 232 250 255 255 +10 240 250 255 255 +100 240 250 255 255 diff --git a/styles/color_palettes/basemap_grey.txt b/styles/color_palettes/basemap_grey.txt index 149d6187fb68ac0f79c2988eca3d3a543d80d5f7..52f9eb86631acbaee3de505244078c234f83db19 100644 --- a/styles/color_palettes/basemap_grey.txt +++ b/styles/color_palettes/basemap_grey.txt @@ -1,9 +1,10 @@ +nv 0 0 0 255 -12000 54 60 64 255 -6000 94 103 110 255 -1000 195 221 229 255 --10 242 252 255 255 --4 255 255 255 255 -5 230 230 230 255 +-50 242 252 255 255 +0 255 255 255 255 +10 230 230 230 255 100 204 204 204 255 1000 179 179 179 255 10000 153 153 153 255 diff --git a/styles/color_palettes/basemap_grey_sea.txt b/styles/color_palettes/basemap_grey_sea.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8770d85f0f8ed51956b35bdf016de07a065e0da --- /dev/null +++ b/styles/color_palettes/basemap_grey_sea.txt @@ -0,0 +1,8 @@ +nv 0 0 0 255 +-12000 54 60 64 255 +-6000 94 103 110 255 +-1000 195 221 229 255 +-50 242 252 255 255 +10 245 252 255 255 +100 245 252 255 255 + diff --git a/styles/color_palettes/basemap_greyblue.txt b/styles/color_palettes/basemap_greyblue.txt index 3117e34e308fdbe77bc261944799b3f1e03c10ec..862f9aa4c4dd6dbff9ba9637b5eb1e01f91183a8 100644 --- a/styles/color_palettes/basemap_greyblue.txt +++ b/styles/color_palettes/basemap_greyblue.txt @@ -1,9 +1,10 @@ +nv 0 0 0 255 -12000 48 57 64 255 -6000 82 98 110 255 -1000 172 216 229 255 --10 242 252 255 255 --4 255 255 255 255 -5 230 230 230 255 +-50 242 252 255 255 +0 255 255 255 255 +10 230 230 230 255 100 204 204 204 255 1000 179 179 179 255 10000 153 153 153 255 diff --git a/styles/color_palettes/basemap_greyblue_sea.txt b/styles/color_palettes/basemap_greyblue_sea.txt new file mode 100644 index 0000000000000000000000000000000000000000..6eef0ec10c513bd26772270e195452d4a0f559f2 --- /dev/null +++ b/styles/color_palettes/basemap_greyblue_sea.txt @@ -0,0 +1,7 @@ +nv 0 0 0 255 +-12000 48 57 64 255 +-6000 82 98 110 255 +-1000 172 216 229 255 +-50 242 252 255 255 +10 245 252 255 255 +100 245 252 255 255 diff --git a/styles/color_palettes/basemap_land.txt b/styles/color_palettes/basemap_land.txt new file mode 100644 index 0000000000000000000000000000000000000000..16608d3b71211085511723634b54b22e6c2dc820 --- /dev/null +++ b/styles/color_palettes/basemap_land.txt @@ -0,0 +1,8 @@ +nv 0 0 0 255 +-10 255 255 255 255 +10 230 230 230 255 +100 204 204 204 255 +1000 179 179 179 255 +10000 153 153 153 255 +20000 250 250 250 255 +30000 255 255 255 255 diff --git a/styles/qml_layer_styles/basemap_blue.qml b/styles/qml_layer_styles/basemap_blue.qml index 9dd306655042cf5feb2873520ad976ea4e282e80..bee9def35cb6160142c4751c18ca75a8dd66e612 100644 --- a/styles/qml_layer_styles/basemap_blue.qml +++ b/styles/qml_layer_styles/basemap_blue.qml @@ -1,30 +1,17 @@ <!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'> -<qgis hasScaleBasedVisibilityFlag="0" styleCategories="AllStyleCategories" version="3.20.3-Odense" maxScale="0" minScale="1e+08"> - <flags> - <Identifiable>1</Identifiable> - <Removable>1</Removable> - <Searchable>1</Searchable> - <Private>0</Private> - </flags> - <temporal fetchMode="0" enabled="0" mode="0"> - <fixedRange> - <start></start> - <end></end> - </fixedRange> - </temporal> - <customproperties> +<qgis styleCategories="Symbology|Labeling" version="3.38.0-Grenoble"> + <pipe-data-defined-properties> <Option type="Map"> - <Option value="false" type="QString" name="WMSBackgroundLayer"/> - <Option value="false" type="QString" name="WMSPublishDataSourceUrl"/> - <Option value="0" type="QString" name="embeddedWidgets/count"/> - <Option value="Value" type="QString" name="identify/format"/> + <Option value="" type="QString" name="name"/> + <Option name="properties"/> + <Option value="collection" type="QString" name="type"/> </Option> - </customproperties> + </pipe-data-defined-properties> <pipe> <provider> - <resampling zoomedOutResamplingMethod="nearestNeighbour" enabled="false" maxOversampling="2" zoomedInResamplingMethod="nearestNeighbour"/> + <resampling zoomedOutResamplingMethod="nearestNeighbour" zoomedInResamplingMethod="nearestNeighbour" enabled="false" maxOversampling="2"/> </provider> - <rasterrenderer type="singlebandpseudocolor" classificationMin="-12000" classificationMax="30000" opacity="1" alphaBand="-1" nodataColor="" band="1"> + <rasterrenderer classificationMin="-12000" band="1" opacity="1" alphaBand="-1" nodataColor="" classificationMax="30000" type="singlebandpseudocolor"> <rasterTransparency/> <minMaxOrigin> <limits>None</limits> @@ -35,50 +22,47 @@ <stdDevFactor>2</stdDevFactor> </minMaxOrigin> <rastershader> - <colorrampshader classificationMode="1" minimumValue="-12000" clip="0" maximumValue="30000" labelPrecision="0" colorRampType="INTERPOLATED"> + <colorrampshader maximumValue="30000" clip="0" minimumValue="-12000" colorRampType="INTERPOLATED" labelPrecision="0" classificationMode="1"> <colorramp type="gradient" name="[source]"> <Option type="Map"> - <Option value="40,53,64,255" type="QString" name="color1"/> - <Option value="255,255,255,255" type="QString" name="color2"/> + <Option value="40,53,64,255,rgb:0.15686274509803921,0.20784313725490197,0.25098039215686274,1" type="QString" name="color1"/> + <Option value="255,255,255,255,rgb:1,1,1,1" type="QString" name="color2"/> + <Option value="ccw" type="QString" name="direction"/> <Option value="0" type="QString" name="discrete"/> <Option value="gradient" type="QString" name="rampType"/> - <Option value="0.142857;68,92,110,255:0.261905;142,209,229,255:0.285476;232,250,255,255:0.285619;255,255,255,255:0.285833;230,230,230,255:0.288095;204,204,204,255:0.309524;179,179,179,255:0.52381;153,153,153,255:0.761905;250,250,250,255" type="QString" name="stops"/> + <Option value="rgb" type="QString" name="spec"/> + <Option value="0.142857;68,92,110,255,rgb:0.26666666666666666,0.36078431372549019,0.43137254901960786,1;rgb;ccw:0.261905;142,209,229,255,rgb:0.55686274509803924,0.81960784313725488,0.89803921568627454,1;rgb;ccw:0.285476;232,250,255,255,rgb:0.90980392156862744,0.98039215686274506,1,1;rgb;ccw:0.285714;255,255,255,255,rgb:1,1,1,1;rgb;ccw:0.285952;230,230,230,255,rgb:0.90196078431372551,0.90196078431372551,0.90196078431372551,1;rgb;ccw:0.288095;204,204,204,255,rgb:0.80000000000000004,0.80000000000000004,0.80000000000000004,1;rgb;ccw:0.309524;179,179,179,255,rgb:0.70196078431372544,0.70196078431372544,0.70196078431372544,1;rgb;ccw:0.52381;153,153,153,255,rgb:0.59999999999999998,0.59999999999999998,0.59999999999999998,1;rgb;ccw:0.761905;250,250,250,255,rgb:0.98039215686274506,0.98039215686274506,0.98039215686274506,1;rgb;ccw" type="QString" name="stops"/> </Option> - <prop v="40,53,64,255" k="color1"/> - <prop v="255,255,255,255" k="color2"/> - <prop v="0" k="discrete"/> - <prop v="gradient" k="rampType"/> - <prop v="0.142857;68,92,110,255:0.261905;142,209,229,255:0.285476;232,250,255,255:0.285619;255,255,255,255:0.285833;230,230,230,255:0.288095;204,204,204,255:0.309524;179,179,179,255:0.52381;153,153,153,255:0.761905;250,250,250,255" k="stops"/> </colorramp> - <item value="-12000" color="#283540" label="-12000" alpha="255"/> - <item value="-6000" color="#445c6e" label="-6000" alpha="255"/> - <item value="-1000" color="#8ed1e5" label="-1000" alpha="255"/> - <item value="-10" color="#e8faff" label="-10" alpha="255"/> - <item value="-4" color="#ffffff" label="-4" alpha="255"/> - <item value="5" color="#e6e6e6" label="5" alpha="255"/> - <item value="100" color="#cccccc" label="100" alpha="255"/> - <item value="1000" color="#b3b3b3" label="1000" alpha="255"/> - <item value="10000" color="#999999" label="10000" alpha="255"/> - <item value="20000" color="#fafafa" label="Shelf Ice" alpha="255"/> - <item value="30000" color="#ffffff" label="Ice Sheet" alpha="255"/> - <rampLegendSettings prefix="" minimumLabel="" maximumLabel="" suffix="" useContinuousLegend="1" orientation="2" direction="0"> + <item color="#283540" label="-12000" alpha="255" value="-12000"/> + <item color="#445c6e" label="-6000" alpha="255" value="-6000"/> + <item color="#8ed1e5" label="-1000" alpha="255" value="-1000"/> + <item color="#e8faff" label="-10" alpha="255" value="-10"/> + <item color="#ffffff" label="0" alpha="255" value="0"/> + <item color="#e6e6e6" label="10" alpha="255" value="10"/> + <item color="#cccccc" label="100" alpha="255" value="100"/> + <item color="#b3b3b3" label="1000" alpha="255" value="1000"/> + <item color="#999999" label="10000" alpha="255" value="10000"/> + <item color="#fafafa" label="Shelf Ice" alpha="255" value="20000"/> + <item color="#ffffff" label="Ice Sheet" alpha="255" value="30000"/> + <rampLegendSettings minimumLabel="" direction="0" maximumLabel="" useContinuousLegend="1" prefix="" suffix="" orientation="2"> <numericFormat id="basic"> <Option type="Map"> - <Option value="" type="QChar" name="decimal_separator"/> + <Option type="invalid" name="decimal_separator"/> <Option value="6" type="int" name="decimals"/> <Option value="0" type="int" name="rounding_type"/> <Option value="false" type="bool" name="show_plus"/> <Option value="true" type="bool" name="show_thousand_separator"/> <Option value="false" type="bool" name="show_trailing_zeros"/> - <Option value="" type="QChar" name="thousand_separator"/> + <Option type="invalid" name="thousand_separator"/> </Option> </numericFormat> </rampLegendSettings> </colorrampshader> </rastershader> </rasterrenderer> - <brightnesscontrast brightness="0" contrast="0" gamma="1"/> - <huesaturation grayscaleMode="0" colorizeBlue="128" saturation="0" colorizeGreen="128" colorizeOn="0" colorizeStrength="100" colorizeRed="255"/> + <brightnesscontrast gamma="1" brightness="0" contrast="0"/> + <huesaturation grayscaleMode="0" colorizeBlue="128" colorizeStrength="100" invertColors="0" colorizeGreen="128" saturation="0" colorizeRed="255" colorizeOn="0"/> <rasterresampler maxOversampling="2"/> <resamplingStage>resamplingFilter</resamplingStage> </pipe> diff --git a/styles/qml_layer_styles/basemap_grey.qml b/styles/qml_layer_styles/basemap_grey.qml index be174ba6d4509a2b47a5147aba3ee85b324f9066..60da68f21ee2f9634125fbd365724f6da64101f0 100644 --- a/styles/qml_layer_styles/basemap_grey.qml +++ b/styles/qml_layer_styles/basemap_grey.qml @@ -1,30 +1,17 @@ <!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'> -<qgis hasScaleBasedVisibilityFlag="0" styleCategories="AllStyleCategories" version="3.20.3-Odense" maxScale="0" minScale="1e+08"> - <flags> - <Identifiable>1</Identifiable> - <Removable>1</Removable> - <Searchable>1</Searchable> - <Private>0</Private> - </flags> - <temporal fetchMode="0" enabled="0" mode="0"> - <fixedRange> - <start></start> - <end></end> - </fixedRange> - </temporal> - <customproperties> +<qgis styleCategories="Symbology|Labeling" version="3.38.0-Grenoble"> + <pipe-data-defined-properties> <Option type="Map"> - <Option value="false" type="QString" name="WMSBackgroundLayer"/> - <Option value="false" type="QString" name="WMSPublishDataSourceUrl"/> - <Option value="0" type="QString" name="embeddedWidgets/count"/> - <Option value="Value" type="QString" name="identify/format"/> + <Option value="" type="QString" name="name"/> + <Option name="properties"/> + <Option value="collection" type="QString" name="type"/> </Option> - </customproperties> + </pipe-data-defined-properties> <pipe> <provider> - <resampling zoomedOutResamplingMethod="nearestNeighbour" enabled="false" maxOversampling="2" zoomedInResamplingMethod="nearestNeighbour"/> + <resampling zoomedOutResamplingMethod="nearestNeighbour" zoomedInResamplingMethod="nearestNeighbour" enabled="false" maxOversampling="2"/> </provider> - <rasterrenderer type="singlebandpseudocolor" classificationMin="-12000" classificationMax="30000" opacity="1" alphaBand="-1" nodataColor="" band="1"> + <rasterrenderer classificationMin="-12000" band="1" opacity="1" alphaBand="-1" nodataColor="" classificationMax="30000" type="singlebandpseudocolor"> <rasterTransparency/> <minMaxOrigin> <limits>None</limits> @@ -35,50 +22,47 @@ <stdDevFactor>2</stdDevFactor> </minMaxOrigin> <rastershader> - <colorrampshader classificationMode="1" minimumValue="-12000" clip="0" maximumValue="30000" labelPrecision="0" colorRampType="INTERPOLATED"> + <colorrampshader maximumValue="30000" clip="0" minimumValue="-12000" colorRampType="INTERPOLATED" labelPrecision="0" classificationMode="1"> <colorramp type="gradient" name="[source]"> <Option type="Map"> - <Option value="54,60,64,255" type="QString" name="color1"/> - <Option value="255,255,255,255" type="QString" name="color2"/> + <Option value="54,60,64,255,rgb:0.21176470588235294,0.23529411764705882,0.25098039215686274,1" type="QString" name="color1"/> + <Option value="255,255,255,255,rgb:1,1,1,1" type="QString" name="color2"/> + <Option value="ccw" type="QString" name="direction"/> <Option value="0" type="QString" name="discrete"/> <Option value="gradient" type="QString" name="rampType"/> - <Option value="0.142857;94,103,110,255:0.261905;195,221,229,255:0.285476;242,252,255,255:0.285619;255,255,255,255:0.285833;230,230,230,255:0.288095;204,204,204,255:0.309524;179,179,179,255:0.52381;153,153,153,255:0.761905;250,250,250,255" type="QString" name="stops"/> + <Option value="rgb" type="QString" name="spec"/> + <Option value="0.142857;94,103,110,255,rgb:0.36862745098039218,0.40392156862745099,0.43137254901960786,1;rgb;ccw:0.261905;195,221,229,255,rgb:0.76470588235294112,0.8666666666666667,0.89803921568627454,1;rgb;ccw:0.285476;242,252,255,255,rgb:0.94901960784313721,0.9882352941176471,1,1;rgb;ccw:0.285714;255,255,255,255,rgb:1,1,1,1;rgb;ccw:0.285952;230,230,230,255,rgb:0.90196078431372551,0.90196078431372551,0.90196078431372551,1;rgb;ccw:0.288095;204,204,204,255,rgb:0.80000000000000004,0.80000000000000004,0.80000000000000004,1;rgb;ccw:0.309524;179,179,179,255,rgb:0.70196078431372544,0.70196078431372544,0.70196078431372544,1;rgb;ccw:0.52381;153,153,153,255,rgb:0.59999999999999998,0.59999999999999998,0.59999999999999998,1;rgb;ccw:0.761905;250,250,250,255,rgb:0.98039215686274506,0.98039215686274506,0.98039215686274506,1;rgb;ccw" type="QString" name="stops"/> </Option> - <prop v="54,60,64,255" k="color1"/> - <prop v="255,255,255,255" k="color2"/> - <prop v="0" k="discrete"/> - <prop v="gradient" k="rampType"/> - <prop v="0.142857;94,103,110,255:0.261905;195,221,229,255:0.285476;242,252,255,255:0.285619;255,255,255,255:0.285833;230,230,230,255:0.288095;204,204,204,255:0.309524;179,179,179,255:0.52381;153,153,153,255:0.761905;250,250,250,255" k="stops"/> </colorramp> - <item value="-12000" color="#363c40" label="-12000" alpha="255"/> - <item value="-6000" color="#5e676e" label="-6000" alpha="255"/> - <item value="-1000" color="#c3dde5" label="-1000" alpha="255"/> - <item value="-10" color="#f2fcff" label="-10" alpha="255"/> - <item value="-4" color="#ffffff" label="-4" alpha="255"/> - <item value="5" color="#e6e6e6" label="5" alpha="255"/> - <item value="100" color="#cccccc" label="100" alpha="255"/> - <item value="1000" color="#b3b3b3" label="1000" alpha="255"/> - <item value="10000" color="#999999" label="10000" alpha="255"/> - <item value="20000" color="#fafafa" label="Shelf Ice" alpha="255"/> - <item value="30000" color="#ffffff" label="Ice Sheet" alpha="255"/> - <rampLegendSettings prefix="" minimumLabel="" maximumLabel="" suffix="" useContinuousLegend="1" orientation="2" direction="0"> + <item color="#363c40" label="-12000" alpha="255" value="-12000"/> + <item color="#5e676e" label="-6000" alpha="255" value="-6000"/> + <item color="#c3dde5" label="-1000" alpha="255" value="-1000"/> + <item color="#f2fcff" label="-10" alpha="255" value="-10"/> + <item color="#ffffff" label="0" alpha="255" value="0"/> + <item color="#e6e6e6" label="10" alpha="255" value="10"/> + <item color="#cccccc" label="100" alpha="255" value="100"/> + <item color="#b3b3b3" label="1000" alpha="255" value="1000"/> + <item color="#999999" label="10000" alpha="255" value="10000"/> + <item color="#fafafa" label="Shelf Ice" alpha="255" value="20000"/> + <item color="#ffffff" label="Ice Sheet" alpha="255" value="30000"/> + <rampLegendSettings minimumLabel="" direction="0" maximumLabel="" useContinuousLegend="1" prefix="" suffix="" orientation="2"> <numericFormat id="basic"> <Option type="Map"> - <Option value="" type="QChar" name="decimal_separator"/> + <Option type="invalid" name="decimal_separator"/> <Option value="6" type="int" name="decimals"/> <Option value="0" type="int" name="rounding_type"/> <Option value="false" type="bool" name="show_plus"/> <Option value="true" type="bool" name="show_thousand_separator"/> <Option value="false" type="bool" name="show_trailing_zeros"/> - <Option value="" type="QChar" name="thousand_separator"/> + <Option type="invalid" name="thousand_separator"/> </Option> </numericFormat> </rampLegendSettings> </colorrampshader> </rastershader> </rasterrenderer> - <brightnesscontrast brightness="0" contrast="0" gamma="1"/> - <huesaturation grayscaleMode="0" colorizeBlue="128" saturation="0" colorizeGreen="128" colorizeOn="0" colorizeStrength="100" colorizeRed="255"/> + <brightnesscontrast gamma="1" brightness="0" contrast="0"/> + <huesaturation grayscaleMode="0" colorizeBlue="128" colorizeStrength="100" invertColors="0" colorizeGreen="128" saturation="0" colorizeRed="255" colorizeOn="0"/> <rasterresampler maxOversampling="2"/> <resamplingStage>resamplingFilter</resamplingStage> </pipe> diff --git a/styles/qml_layer_styles/basemap_greyblue.qml b/styles/qml_layer_styles/basemap_greyblue.qml index ba64487a63d419085fd88095138059980f62b848..9e0005592d317157346bcf2e5893abe2b4a0fa9b 100644 --- a/styles/qml_layer_styles/basemap_greyblue.qml +++ b/styles/qml_layer_styles/basemap_greyblue.qml @@ -1,30 +1,17 @@ <!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'> -<qgis hasScaleBasedVisibilityFlag="0" styleCategories="AllStyleCategories" version="3.20.3-Odense" maxScale="0" minScale="1e+08"> - <flags> - <Identifiable>1</Identifiable> - <Removable>1</Removable> - <Searchable>1</Searchable> - <Private>0</Private> - </flags> - <temporal fetchMode="0" enabled="0" mode="0"> - <fixedRange> - <start></start> - <end></end> - </fixedRange> - </temporal> - <customproperties> +<qgis styleCategories="Symbology|Labeling" version="3.38.0-Grenoble"> + <pipe-data-defined-properties> <Option type="Map"> - <Option value="false" type="QString" name="WMSBackgroundLayer"/> - <Option value="false" type="QString" name="WMSPublishDataSourceUrl"/> - <Option value="0" type="QString" name="embeddedWidgets/count"/> - <Option value="Value" type="QString" name="identify/format"/> + <Option value="" type="QString" name="name"/> + <Option name="properties"/> + <Option value="collection" type="QString" name="type"/> </Option> - </customproperties> + </pipe-data-defined-properties> <pipe> <provider> - <resampling zoomedOutResamplingMethod="nearestNeighbour" enabled="false" maxOversampling="2" zoomedInResamplingMethod="nearestNeighbour"/> + <resampling zoomedOutResamplingMethod="nearestNeighbour" zoomedInResamplingMethod="nearestNeighbour" enabled="false" maxOversampling="2"/> </provider> - <rasterrenderer type="singlebandpseudocolor" classificationMin="-12000" classificationMax="30000" opacity="1" alphaBand="-1" nodataColor="" band="1"> + <rasterrenderer classificationMin="-12000" band="1" opacity="1" alphaBand="-1" nodataColor="" classificationMax="30000" type="singlebandpseudocolor"> <rasterTransparency/> <minMaxOrigin> <limits>None</limits> @@ -35,50 +22,47 @@ <stdDevFactor>2</stdDevFactor> </minMaxOrigin> <rastershader> - <colorrampshader classificationMode="1" minimumValue="-12000" clip="0" maximumValue="30000" labelPrecision="0" colorRampType="INTERPOLATED"> + <colorrampshader maximumValue="30000" clip="0" minimumValue="-12000" colorRampType="INTERPOLATED" labelPrecision="0" classificationMode="1"> <colorramp type="gradient" name="[source]"> <Option type="Map"> - <Option value="48,57,64,255" type="QString" name="color1"/> - <Option value="255,255,255,255" type="QString" name="color2"/> + <Option value="48,57,64,255,rgb:0.18823529411764706,0.22352941176470589,0.25098039215686274,1" type="QString" name="color1"/> + <Option value="255,255,255,255,rgb:1,1,1,1" type="QString" name="color2"/> + <Option value="ccw" type="QString" name="direction"/> <Option value="0" type="QString" name="discrete"/> <Option value="gradient" type="QString" name="rampType"/> - <Option value="0.142857;82,98,110,255:0.261905;172,216,229,255:0.285476;242,252,255,255:0.285619;255,255,255,255:0.285833;230,230,230,255:0.288095;204,204,204,255:0.309524;179,179,179,255:0.52381;153,153,153,255:0.761905;250,250,250,255" type="QString" name="stops"/> + <Option value="rgb" type="QString" name="spec"/> + <Option value="0.142857;82,98,110,255,rgb:0.32156862745098042,0.3843137254901961,0.43137254901960786,1;rgb;ccw:0.261905;172,216,229,255,rgb:0.67450980392156867,0.84705882352941175,0.89803921568627454,1;rgb;ccw:0.285476;242,252,255,255,rgb:0.94901960784313721,0.9882352941176471,1,1;rgb;ccw:0.285714;255,255,255,255,rgb:1,1,1,1;rgb;ccw:0.285952;230,230,230,255,rgb:0.90196078431372551,0.90196078431372551,0.90196078431372551,1;rgb;ccw:0.288095;204,204,204,255,rgb:0.80000000000000004,0.80000000000000004,0.80000000000000004,1;rgb;ccw:0.309524;179,179,179,255,rgb:0.70196078431372544,0.70196078431372544,0.70196078431372544,1;rgb;ccw:0.52381;153,153,153,255,rgb:0.59999999999999998,0.59999999999999998,0.59999999999999998,1;rgb;ccw:0.761905;250,250,250,255,rgb:0.98039215686274506,0.98039215686274506,0.98039215686274506,1;rgb;ccw" type="QString" name="stops"/> </Option> - <prop v="48,57,64,255" k="color1"/> - <prop v="255,255,255,255" k="color2"/> - <prop v="0" k="discrete"/> - <prop v="gradient" k="rampType"/> - <prop v="0.142857;82,98,110,255:0.261905;172,216,229,255:0.285476;242,252,255,255:0.285619;255,255,255,255:0.285833;230,230,230,255:0.288095;204,204,204,255:0.309524;179,179,179,255:0.52381;153,153,153,255:0.761905;250,250,250,255" k="stops"/> </colorramp> - <item value="-12000" color="#303940" label="-12000" alpha="255"/> - <item value="-6000" color="#52626e" label="-6000" alpha="255"/> - <item value="-1000" color="#acd8e5" label="-1000" alpha="255"/> - <item value="-10" color="#f2fcff" label="-10" alpha="255"/> - <item value="-4" color="#ffffff" label="-4" alpha="255"/> - <item value="5" color="#e6e6e6" label="5" alpha="255"/> - <item value="100" color="#cccccc" label="100" alpha="255"/> - <item value="1000" color="#b3b3b3" label="1000" alpha="255"/> - <item value="10000" color="#999999" label="10000" alpha="255"/> - <item value="20000" color="#fafafa" label="Shelf Ice" alpha="255"/> - <item value="30000" color="#ffffff" label="Ice Sheet" alpha="255"/> - <rampLegendSettings prefix="" minimumLabel="" maximumLabel="" suffix="" useContinuousLegend="1" orientation="2" direction="0"> + <item color="#303940" label="-12000" alpha="255" value="-12000"/> + <item color="#52626e" label="-6000" alpha="255" value="-6000"/> + <item color="#acd8e5" label="-1000" alpha="255" value="-1000"/> + <item color="#f2fcff" label="-10" alpha="255" value="-10"/> + <item color="#ffffff" label="0" alpha="255" value="0"/> + <item color="#e6e6e6" label="10" alpha="255" value="10"/> + <item color="#cccccc" label="100" alpha="255" value="100"/> + <item color="#b3b3b3" label="1000" alpha="255" value="1000"/> + <item color="#999999" label="10000" alpha="255" value="10000"/> + <item color="#fafafa" label="Shelf Ice" alpha="255" value="20000"/> + <item color="#ffffff" label="Ice Sheet" alpha="255" value="30000"/> + <rampLegendSettings minimumLabel="" direction="0" maximumLabel="" useContinuousLegend="1" prefix="" suffix="" orientation="2"> <numericFormat id="basic"> <Option type="Map"> - <Option value="" type="QChar" name="decimal_separator"/> + <Option type="invalid" name="decimal_separator"/> <Option value="6" type="int" name="decimals"/> <Option value="0" type="int" name="rounding_type"/> <Option value="false" type="bool" name="show_plus"/> <Option value="true" type="bool" name="show_thousand_separator"/> <Option value="false" type="bool" name="show_trailing_zeros"/> - <Option value="" type="QChar" name="thousand_separator"/> + <Option type="invalid" name="thousand_separator"/> </Option> </numericFormat> </rampLegendSettings> </colorrampshader> </rastershader> </rasterrenderer> - <brightnesscontrast brightness="0" contrast="0" gamma="1"/> - <huesaturation grayscaleMode="0" colorizeBlue="128" saturation="0" colorizeGreen="128" colorizeOn="0" colorizeStrength="100" colorizeRed="255"/> + <brightnesscontrast gamma="1" brightness="0" contrast="0"/> + <huesaturation grayscaleMode="0" colorizeBlue="128" colorizeStrength="100" invertColors="0" colorizeGreen="128" saturation="0" colorizeRed="255" colorizeOn="0"/> <rasterresampler maxOversampling="2"/> <resamplingStage>resamplingFilter</resamplingStage> </pipe>