Skip to content

Instantly share code, notes, and snippets.

@mdsumner
Last active January 9, 2026 03:10
Show Gist options
  • Select an option

  • Save mdsumner/a2115df9dd7c3aac3c353f1e784a725c to your computer and use it in GitHub Desktop.

Select an option

Save mdsumner/a2115df9dd7c3aac3c353f1e784a725c to your computer and use it in GitHub Desktop.

IBCSO v2 Digital Chart - COG Viewer

Experimental browser-based visualization of the International Bathymetric Chart of the Southern Ocean (IBCSO) v2 using deck.gl-raster.

https://projects.pawsey.org.au/image-cogs/index.html

The modified code is available at https://github.com/mdsumner/deck.gl-raster/tree/modified-polar

Viewer

Base URL: https://projects.pawsey.org.au/image-cogs/index.html

Add ?cog=<URL> to load a specific COG. e.g. bottom left quadrant IBCSO

This figure shows the tl/tr/bl/br (topleft, topright, bottomlef, bottomright) configuration, then each in the corresponding Mercator view:

image image

Available COGs

The original IBCSO chart is in EPSG:9354 (WGS 84 / IBCSO Polar Stereographic), centered on the South Pole. Because WebMercator cannot represent the pole (it maps to infinity), the image has been split into four quadrants that exclude the polar region within 533km of 90°S.

Quadrant URL Extent (xmin, xmax, ymin, ymax)
Top Left IBCSO_v2_digital_chart_tl.tif -4833000, -533000, 533000, 4797000
Top Right IBCSO_v2_digital_chart_tr.tif 533000, 4837000, 533000, 4797000
Bottom Left IBCSO_v2_digital_chart_bl.tif -4833000, -533000, -6629000, -533000
Bottom Right IBCSO_v2_digital_chart_br.tif 533000, 4837000, -6629000, -533000

Original (Full Extent) - Use with Caution

The complete chart is also available:

https://projects.pawsey.org.au/image-cogs/images/IBCSO_v2_digital_chart.tif

⚠️ Warning: Do not load this with the ?cog= viewer. The image includes the South Pole, which (presumably) causes the adaptive mesh reprojection to hang as it attempts to refine triangles near the Mercator singularity at -90° latitude.

Another two are included, and the antimeridian one also thrashes, the other is ok.

Section URL Extent (xmin, xmax, ymin, ymax)
Prime Meridian IBCSO_v2_digital_chart_primem.tif -4833000, 4837000, -533000, -6629000
Anti Meridian IBCSO_v2_digital_chart_antim.tif -4833000, 4837000, 533000, -6629000

Technical Notes

Projection String Bug

The geotiff-geokeys-to-proj4 library does not correctly handle EPSG:9354. It produces:

+proj=stere +lon_0=0 +lat_ts=-65 +x_0=0 +y_0=0 +ellps=WGS84 ...

This is missing the critical +lat_0=-90 parameter, which defines the projection center at the South Pole. Without it, the image is incorrectly placed at the equator.

The viewer includes a workaround that detects ProjectedCSTypeGeoKey: 9354 and substitutes the correct proj4 string:

+proj=stere +lat_0=-90 +lat_ts=-65 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs

The modification is made in App.tsx in GeoKeysParser:

   // Fix for EPSG:9354 - IBCSO Polar Stereographic (missing lat_0)
  if (geoKeys.ProjectedCSTypeGeoKey === 9354) {
    const proj4def = "+proj=stere +lat_0=-90 +lat_ts=-65 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs";
    console.log("Using custom proj4 for EPSG:9354:", proj4def);
    return {
      def: proj4def,
      parsed: proj.parseCrs(proj4def),
      coordinatesUnits: "metre" as proj.SupportedCrsUnit,
    };
  }

Source Data

  • Dataset: IBCSO v2 Digital Chart
  • Citation: Dorschel et al. (2022) The International Bathymetric Chart of the Southern Ocean Version 2, Scientific Data. https://doi.org/10.1038/s41597-022-01366-7
  • Original CRS: EPSG:9354 (WGS 84 / IBCSO Polar Stereographic)
  • Original resolution: ~1949m × 1935m per pixel

Raw R code for plots and COG creation

Just running locally for now. Source image is at

https://github.com/mdsumner/ibcso-cog/raw/refs/heads/main/IBCSO_v2_digital_chart.tif

tl <- c(-4833000, -533000, 533000, 4797000)
tr <- c(533000, 4837000, 533000, 4797000)
bl <- c(-4833000, -533000, -6629000, -533000)
br <- c(533000, 4837000, -6629000, -533000)

l <- list(tl = tl, tr = tr, bl = bl, br = br)

ex <- c(-1, 1, -1, 1) * pi * 6378137
vaster::plot_extent(ex, asp = 1)
library(wk)
library(geos)
trans <- PROJ::proj_trans_create("EPSG:9354", "EPSG:3857")
for (i in l) {
  plot(wk::wk_transform( geos_densify(wk::rct(i[1], i[3], i[2], i[4]), 10000), trans = trans), add = TRUE)
}


cmds <- c('gdal_translate -projwin -4833000 4797000 -533000 533000 ~/IBCSO_v2_digital_chart.tif ~/IBCSO_v2_digital_chart_tl.tif -of COG', 
'gdal_translate -projwin 533000 4797000 4837000 533000 ~/IBCSO_v2_digital_chart.tif ~/IBCSO_v2_digital_chart_tr.tif -of COG', 
'gdal_translate -projwin -4833000 -533000 -533000 -6629000 ~/IBCSO_v2_digital_chart.tif ~/IBCSO_v2_digital_chart_bl.tif -of COG',
'gdal_translate -projwin 533000 -533000 4837000 -6629000 ~/IBCSO_v2_digital_chart.tif ~/IBCSO_v2_digital_chart_br.tif -of COG')

for (cm in cmds) system(cm)

system("gdal_translate -projwin -4833000 -6629000   4837000 -533000 ~/IBCSO_v2_digital_chart.tif ~/IBCSO_v2_digital_chart_antim.tif -of COG")

system("gdal_translate -projwin -4833000 4797000   4837000  533000 ~/IBCSO_v2_digital_chart.tif ~/IBCSO_v2_digital_chart_primem.tif -of COG")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment