From aa8aed6636ac64fb584965ff5b9c0d2827a4c363 Mon Sep 17 00:00:00 2001
From: simondreutter <simon.dreutter@awi.de>
Date: Sat, 23 Nov 2024 15:37:01 +0100
Subject: [PATCH] basemap v0.7

---
 PROCESS.md                                    | 139 ++++++++++++
 data/gshhg/gshhg.md                           |  20 ++
 data/ibcao/ibcao.md                           |  27 +++
 data/ibcso/ibcso.md                           |  28 +++
 ..._create_contours.py => 0_process_gshhg.py} |  34 +--
 ...eate_basemaps.py => 10_create_basemaps.py} | 102 +++++++--
 process/{8_metadata.py => 11_metadata.py}     |   4 +-
 process/12_create_contours.py                 |  89 ++++++++
 process/1_process_add.py                      |  11 +-
 process/2_process_gimp.py                     |   4 +-
 process/3_process_glims.py                    |   8 +-
 process/4_process_ibcao.py                    | 106 +++++++++
 process/5_process_ibcso.py                    |  91 ++++++++
 ...{4_process_gebco.py => 6_process_gebco.py} | 152 ++++---------
 process/7_prepare_dems.py                     | 161 ++++++++++++++
 ..._layers.py => 8_compute_shading_layers.py} |  71 +++---
 ...ctor_layers.py => 9_burn_vector_layers.py} |  29 +--
 process/RUN.py                                |  18 +-
 process/config.py                             | 204 ++++++++++++------
 styles/color_palettes/basemap_blue.txt        |   7 +-
 styles/color_palettes/basemap_blue_sea.txt    |   7 +
 styles/color_palettes/basemap_grey.txt        |   7 +-
 styles/color_palettes/basemap_grey_sea.txt    |   8 +
 styles/color_palettes/basemap_greyblue.txt    |   7 +-
 .../color_palettes/basemap_greyblue_sea.txt   |   7 +
 styles/color_palettes/basemap_land.txt        |   8 +
 styles/qml_layer_styles/basemap_blue.qml      |  76 +++----
 styles/qml_layer_styles/basemap_grey.qml      |  76 +++----
 styles/qml_layer_styles/basemap_greyblue.qml  |  76 +++----
 29 files changed, 1164 insertions(+), 413 deletions(-)
 create mode 100644 PROCESS.md
 create mode 100644 data/gshhg/gshhg.md
 create mode 100644 data/ibcao/ibcao.md
 create mode 100644 data/ibcso/ibcso.md
 rename process/{9_create_contours.py => 0_process_gshhg.py} (61%)
 rename process/{7_create_basemaps.py => 10_create_basemaps.py} (62%)
 rename process/{8_metadata.py => 11_metadata.py} (98%)
 create mode 100644 process/12_create_contours.py
 create mode 100644 process/4_process_ibcao.py
 create mode 100644 process/5_process_ibcso.py
 rename process/{4_process_gebco.py => 6_process_gebco.py} (56%)
 create mode 100644 process/7_prepare_dems.py
 rename process/{5_create_shading_layers.py => 8_compute_shading_layers.py} (76%)
 rename process/{6_burn_vector_layers.py => 9_burn_vector_layers.py} (87%)
 create mode 100644 styles/color_palettes/basemap_blue_sea.txt
 create mode 100644 styles/color_palettes/basemap_grey_sea.txt
 create mode 100644 styles/color_palettes/basemap_greyblue_sea.txt
 create mode 100644 styles/color_palettes/basemap_land.txt

diff --git a/PROCESS.md b/PROCESS.md
new file mode 100644
index 0000000..b60d280
--- /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 0000000..8d8ef55
--- /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 0000000..2e5010d
--- /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 0000000..d8e03bc
--- /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 8329322..ecac44f 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 2ed2a09..bb82367 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 18b87ec..722438a 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 0000000..0de977f
--- /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 1a888cf..01a1001 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 d36241e..abc64cb 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 752b678..5f374ef 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 0000000..2005452
--- /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 0000000..4438586
--- /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 f3e2508..0ff1e4a 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 0000000..06ca1b5
--- /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 7ebb8c6..af6ce12 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 50234a7..4dfb4e3 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 5a248c4..20b71f1 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 f141363..b349a02 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 c337630..db711bf 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 0000000..c554646
--- /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 149d618..52f9eb8 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 0000000..d8770d8
--- /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 3117e34..862f9aa 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 0000000..6eef0ec
--- /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 0000000..16608d3
--- /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 9dd3066..bee9def 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 be174ba..60da68f 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 ba64487..9e00055 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>
-- 
GitLab