← PenguinTracker All field notes
· method

Why web maps cannot draw Antarctica, and what fixes it.

Scroll to the bottom of Google Maps and Antarctica is a white smear across the whole width of the screen, wider than every other continent put together, with no south coast and no pole. That is not a rendering bug or a missing dataset. The South Pole does not exist in the projection. It is not there to draw.

This is the first thing anyone building an Antarctic map runs into, and it kills more projects than the data ever does. So here is the problem, the fix, and the trap waiting on the other side of the fix.

Mercator goes to infinity at the poles

Almost every web map on Earth uses Web Mercator, formally EPSG:3857. It is a cylinder wrapped round the equator: longitude maps to x linearly, and latitude maps to y through a logarithm that stretches further and further as you move away from the equator. That stretch is the whole point. It keeps angles correct, so a compass bearing is a straight line, which is why it was drawn for sailors in 1569 and why it survives on screens today.

The cost is that the y coordinate does not converge. As latitude approaches 90 degrees the stretch factor runs away to infinity, so the poles are infinitely far up and down the map. You cannot render infinity, so every implementation cuts the map off. The conventional cut is 85.05113 degrees, chosen for a reason that has nothing to do with geography: it is the latitude at which the map becomes exactly as tall as it is wide, which makes the tile scheme a clean square.

Antarctica runs from 60 degrees south to 90 degrees south. So in a web map, the last five degrees of the planet are cut off entirely, the pole is undefined, and what remains is smeared so far horizontally that area comparison is meaningless. There is nothing to fix in the tiles. The projection has no room for the place.

And you cannot always switch it off. When we checked the library our sibling project runs its city map on, MapLibre GL 4.7.1, the method that would change projection, setProjection, did not exist on the map object. Mercator was not the default. It was the only option.

The fix is EPSG:3031

Antarctic Polar Stereographic. The pole sits at the centre of the map, the meridians radiate out from it like spokes, and the continent renders round, with its entire coastline visible at once and no edge case anywhere. It is what NSIDC uses, what the Polar Geospatial Center uses, and what Quantarctica ships. If you are drawing anything south of 60 degrees, this is the answer.

EPSG:3031  Antarctic Polar Stereographic
full extent  -4194304, -4194304, 4194304, 4194304  metres
tile origin  -4194304, 4194304
tile size    512 px
resolutions  8192 down to 256 m/px

Working in metres from the pole rather than in degrees also turns out to be the right frame for the science. Distance to a coastline, the area of a set of grid cells, the radius of sea around a colony: all of them are one subtraction in 3031 and an unpleasant geodesic problem in degrees.

Four routes get you there, in rough order of how much work they are. Leaflet with proj4leaflet and polar tiles is proven, simple and correct, and loses the WebGL layer. MapLibre GL v5 has a globe projection, which keeps the whole 3D stack but gives you a globe rather than a polar map, so the everything-at-once overview suffers. d3-geo azimuthal gives total control with no tiles, which is right when the map is more diagram than map. deck.gl with a custom view is the most work and the most power. We went with Leaflet in 3031 for the interactive map, and with a hand rolled 3031 projection in SVG for the generated pages, because the point of an Antarctic map is that Antarctica is the centre of the world, and only a polar projection says that.

The basemap is free and needs no key

The part nobody seems to know: NASA's Global Imagery Browse Services publishes roughly 250 layers in EPSG:3031, through both WMTS and WMS, free, no account, no API key, most of them dated daily. Coastlines as a transparent vector PNG. Graticules. Daily MODIS and VIIRS true colour of the whole continent. Sea ice concentration. Ice velocity. Surface temperature. Shaded relief and bathymetry.

https://gibs.earthdata.nasa.gov/wmts/epsg3031/best/1.0.0/WMTSCapabilities.xml
https://gibs.earthdata.nasa.gov/wms/epsg3031/best/wms.cgi

One WMS request with the full extent bounding box returns the entire continent as a single image at whatever size you ask for. That is the cheapest Antarctic basemap there is, and it is documented and public.

The trap on the other side

Getting into a polar projection is the easy half. Staying oriented in it is the half that will cost you a day, because a polar map has no obvious up.

Here is the one that caught us. The NSIDC passive microwave sea ice files, the archive behind most of the sea ice numbers on this site, disagree with themselves about which way north is. The coordinate system embedded in the file is EPSG:3412 with a central meridian of 0 degrees. An attribute inside the same file, straight_vertical_longitude_from_pole, says 180.

Trust the attribute and you rotate Antarctica half a turn. Nothing errors. Nothing looks obviously wrong, because the continent is roughly round and a rotated round thing is still a round thing. Every coastal site simply lands on the opposite side of the continent, and every number you compute from it comes back plausible and wrong. A colony on the Ross Sea gets assigned the sea ice history of the Weddell.

The embedded coordinate system is the correct one. We know because we proved it rather than assumed it: all 729 known penguin breeding sites were plotted onto the land mask derived from those files, and under the right reading they land on coastline and under the wrong one they land in the middle of the ice sheet or out in open ocean. That is the general rule and it is worth more than the specific bug. In a polar projection, do not trust a rotation you have not seen drawn. Put something on the map whose position you already know, and look at it.

The same instinct applies one level up. An HTTP 200 is not proof of anything, an empty transparent PNG returns 200 perfectly happily, and a k-means cluster that has exactly the brightness, the spectral shape and the area you expected for a penguin colony can turn out, when you finally plot it on the image, to be sunlit snow. Count the non transparent pixels. Draw the thing. Look at it.

The whole continent, drawn correctly, is on the map, and 262,000 GPU particles moving through real measured ice velocities are on the ice page. If you want the reasoning behind the project, it is here.