---
title: "Null Island has a weather station"
author: "Ivo Sandoval (@nullisland)"
date: 2026-04-14T08:33:38.256Z
updated: 2026-04-14T08:33:38.256Z
canonical: "https://jot.place/@nullisland/null-island-has-a-weather-station"
description: "0,0 is three kilometres of open water in the Gulf of Guinea and the busiest coordinate on Earth. Why zero and nothing keep collapsing into each other."
tags:
  - "cartography"
  - "debugging"
  - "postgres"
  - "tools"
  - "trivia"
---

# Null Island has a weather station

There is a spot in the Gulf of Guinea where the equator crosses the prime meridian, and if you sailed to it you would find something like 4,940 m of water under the keel and nothing else whatsoever. The nearest land is a small islet belonging to Ghana, about 570 km north. Open ocean, three kilometres of it straight down, no reason for anybody to care.

More things claim to be at that spot than in most capital cities.

One of them was honest about it. Station 13010 was a moored buoy in the PIRATA array (Prediction and Research Moored Array in the Tropical Atlantic, running since 1997 as a joint American, French and Brazilian effort), sitting at 0 north, 0 east and reporting air and sea temperature, wind speed and direction. PIRATA moorings are named after musical genres, so this one was Soul.[^1] Conical ATLAS type buoy, 3.8 m tall, tethered by cable to the seabed. The first one went missing less than a year after installation, which I find almost unbearably good. A replacement went in during 1998, and it was decommissioned in March 2021, so the busiest coordinate pair on Earth is currently unstaffed.

## Zero and nothing are different ideas that almost no language distinguishes

The whole mechanism fits in four lines.

```js
Number("")      // 0
Number(null)    // 0
Number(" ")     // 0
parseFloat("")  // NaN
```

Look at the last two. A missing latitude coerces cleanly to zero, and the one function that would have raised a flag hands you `NaN`, which is exactly why everybody writes `parseFloat(row.lat) || 0` to make the `NaN` go away. Probably the most productive line of code in the history of the Gulf of Guinea.

It gets better one layer down. In PostGIS the unknown spatial reference system is SRID 0, which the manual describes as an infinite Cartesian plane with no units assigned to its axes, and if you omit the SRID when building a geometry it defaults to 0. So the collapse repeats one level above coordinates: the geometry whose reference frame nobody recorded and the geometry in the frame numbered zero are the same row. And the geometry itself is fine. `POINT(0 0)` is valid, has a defined area, indexes beautifully, and will pass any test you can write that does not already know the answer. The bug is not in the geometry layer. It happened four systems earlier, in a cast.

:::info
The asymmetry is the interesting part. In SQL, null propagates: `null + 1` is null, and the missingness rides along with the value all the way to the report. Zero absorbs. The moment a missing coordinate becomes 0.0, the fact that it was ever missing is gone, and no amount of care downstream can bring it back. Which is why 0,0 is not really a place. It is the memory of a cast.
:::

## The island exists on purpose

Around 2010 or 2011 a polygon appeared at 0,0 in Natural Earth, the public domain dataset a great deal of the world's cartography quietly rests on. It is documented as a one square metre island with scale rank 100, which the project notes means the feature should never be shown at any scale. So it is a canary. If Null Island renders, your scale filtering is broken, and better to learn that from an absurd one metre island than from a missing city.[^2]

The genre it traps is older than the dataset. A geocoder gets an address it cannot match and returns something rather than nothing. A receiver with no fix reports its initialised state. A photo has no GPS tags and the tool writes the struct anyway, zeroed. The Strava activity data that surfaced at 0,0 in January 2018 was not even a coercion bug: people had typed 0,0 into the app on purpose to hide where they had actually been running. I love that inversion. The place data goes when it has nothing to say is also the place people send data when they have something to conceal.

## The part that should worry you

Nothing is geometrically distinguished about 0,0. It is interesting only because a conference in Washington in 1884 ran the prime meridian through Greenwich and most of the world eventually agreed (France took its time). Change the convention and the sink moves.

Which is fine while the sink is in the ocean. It is not fine for local grids, and local grids are where the work happens. A projected reference system usually carries a false easting and northing so that its origin sits well outside the working area. Not all of them bother. ETRS89 / Portugal TM06 (EPSG:3763), the system I spend most of my working life in, has its origin at 39.6682583 north, 8.1331083 west, with false easting and northing both zero. That point is the Picoto da Melriça, in Vila de Rei, which carries the monument marking the geodesic centre of mainland Portugal.

Charming choice of origin. It also means that in my national grid, failed geocodes do not go to sea. They pile up on a hill in the middle of the country, next to a monument, and nobody notices, because a point in central Portugal looks entirely reasonable on a map of central Portugal. That is the lesson and it is not a funny one: Null Island is harmless because it is absurd, and the dangerous null point is the one that lands somewhere plausible. Every local grid has one. You can find yours in ninety seconds by reading the false easting and northing off the definition.

Nobody makes this mistake dramatically. It is always a default that was almost right, discovered later than you would like. For what that feels like from the pager end of the building, @grep/postmortem-forty-three-minutes-of-502s is the canonical account.

[^1]: Which means the tropical Atlantic is instrumented by a small array of music genres reporting sea surface temperature. I think about this more than is reasonable.

[^2]: The related trap: EPSG:4326 officially lists latitude as its first axis, while GeoJSON per RFC 7946 is always longitude first, no exceptions. A library that respects the authority order (pyproj, unless you pass `always_xy=True`) therefore reads your longitude as a latitude and hands back a plausible point in the wrong hemisphere, raising nothing, because nothing exceptional happened.
