Emergent topography: what language models think Earth looks like, in 3D

Written with Opus 5.5

Background

I read Henry's post and I found it very interesting. I wondered if this could be extended beyond a 2D map and how models internally represented the globe. Here's what he did, in his words:

First, we sample latitude and longitude pairs evenly from across the globe. […] Then, for each coordinate, we ask an instruct-tuned model some variation of:

If this location is over land, say 'Land'. If this location is over water, say 'Water'. Do not say anything else. x° S, y° W

[…] Next, we simply find within the model's output the logprobs for "Land" and "Water", and softmax the two, giving probabilities that sums to 1. […] From there, we can put all the probabilities together into an image, and view our map.

He found that small models said land everywhere, but as the models grew their geography got better. I replicated that and added elevation: four yes/no questions per point (above 3000m, above 1000m, below −1000m, below −4000m), combined into elevation bands and 3D globes.

Method

My pipeline has four steps that get run separately for each model. We first sample cell centers on a 4° grid. We then ask five independent binary questions per cell: probing the model on land vs water as well as four elevation thresholds. Each of these answers gets read out as a probability and then we assemble the five resulting probability fields into 2D maps, a banded elevation map, and 3D renders.

Grid

I started by laying a 4° grid over the planet and used the middle of each cell: around 4,050 cells. I tried an 8° grid first, but since 8 doesn't divide 180 evenly, that one topped out at 82°N. (Halving the cell size means four times the calls… and four times the bill 🙁.)

Every cell got its own API call, with nothing else in the context. No maps, no neighboring cells, none of the model's earlier answers. Whatever it says has to come out of memory. The cells also go out in a shuffled order each run (seed 3).

Prompts

With a coordinate in hand, the model gets one of these two prompts, word for word:

Land/water:
Location: 45.0° N, 90.0° W
If this location is over land, say 'Land'. If this location is over water, say 'Water'. Reply with only the word.

Threshold T (example T=+1000):
Location: 45.0° N, 90.0° W
If this location is above 1000 meters elevation, say 'Yes'. Otherwise say 'No'. Reply with only the word.

For the deep-water questions we switched in “below N meters elevation (i.e. deeper ocean than Nm)”. For both of the questions the output around the edges (is a coastline cell land or water?) is fuzzy, but I leave it in because how a model answers it will still give us some insight about that model.

Henry actually found that the wording barely matters. The order, it turns out, matters a great deal. If we put the instruction before the coordinates, Ollama's chat template flattens Qwen2.5 into a 96.5% land planet. If we put the coordinates first, then the oceans come back. Raw completions with no template act like the coordinates-first version, so the issue seems to come from the template in that specific order rather than the words themselves.

Readout

Turning answers into numbers worked differently for the two kinds of models. For the local ones, I just read the top 15 logprobs of the first answer token and then softmax over the two answer words, so each cell gets a probability between 0 and 1. If a word is split across tokens, then its first piece would be what we take. Everything runs at temperature 0.

The frontier APIs don't hand out logprobs, so each answer is parsed straight from text as a 0 or a 1. Answers that won't parse are left blank rather than guessed. Frontier models also like to deliberate, and unfortunately deliberation is billed by the token. During the run on the test cells, extra reasoning just increased cost at no change to the answers, so each of those models just got run at their lowest settings.

Finally, we can lay the probabilities back onto the grid, and now each question is an equirectangular map.

Models

On the local side, Ollama runs Qwen2.5-7B-Instruct, Qwen3-8B, Llama3.1-8B, and Gemma2-9B at 4-bit. On the frontier side, OpenRouter serves GPT-6-Astra, Claude-Fable-5.1, and Claude-Opus-5.5. Qwen3-8B was a bust: its OpenAI-compatible endpoint returned no usable logprobs in my setup (its thinking block got in the way), and its native API produced a noisy, mostly-land map. It stays in as a negative result, shown only where its output could be read (Gallery).

Isolation

No model had web access or tools, so every answer comes from what the model already knows. Evidence from the code and the run data:

Replication

ModelAccuracyAUCPredicted landValid
Opus0.9920.9910.3350.93
Astra0.9840.9710.3280.98
Fable0.9680.9740.3620.80
Qwen2.50.7260.6380.1711.00
Gemma0.4910.6960.7981.00
Llama0.6680.5320.0001.00

Frontier models are nearly perfect. Qwen2.5 is unsure and calls too little land, but ranks cells in the right order. Gemma ranks best of the small models but calls far too much land. Llama never goes above 0.5, so its accuracy equals the water share and its ranking is near chance. On hard cells, Fable often explains instead of giving one word, which lowers its valid rate; a stricter prompt fixed some of this. Its explanations name the right place.

real map
Fig. 1 — Real map (Natural Earth 110m, 4°).
Fig. 2 — Opus P(land).
Fig. 3 — Astra P(land).
Fig. 4 — Fable P(land).
Fig. 5 — Qwen2.5 P(land). Blobby.

Elevation

Mean P(yes)>3000m>1000m<−1000m<−4000m
Real (ETOPO1)0.0350.1320.5600.303
Astra0.0370.1330.5780.417
Fable0.0600.1980.7730.411
Opus0.0290.1200.5670.305
Qwen2.50.0000.0000.2310.109
Llama0.2920.4080.8580.810
Gemma0.0390.0590.9980.999
vs ETOPO1AUC >3000mAUC >1000mAUC <−1000mAUC <−4000mBands exactBands ±1
Astra0.9900.9920.9790.9180.8120.998
Fable0.9850.9790.9850.9430.4500.866
Opus0.9660.9940.9920.9750.7930.988
Qwen2.50.7760.6830.5330.5410.1920.578
Llama0.8370.7230.6150.5970.3030.560
Gemma0.8620.7460.6360.6060.2950.546
real elevation bands
Fig. 6 — Real elevation bands (ETOPO1 ice surface, at cell centers).
Fig. 7 — Astra elevation bands. Andes, snowy Tibet, deep Pacific.
Fig. 8 — Fable elevation bands. Noisier oceans.
Fig. 9 — Opus elevation bands. Sharpest coasts.
Fig. 10 — Qwen2.5 elevation bands. Flat: only shelf and lowland.
Fig. 11 — Astra 3D terrain.
Fig. 12 — Fable 3D terrain.
Fig. 13 — Opus 3D terrain.
Fig. 14 — Qwen2.5 3D terrain.
Fig. 15 — Gemma 3D terrain.
Fig. 16 — Llama 3D terrain. Flat, with one spike.
Fig. 17 — Astra relief globe, Atlantic view. Blocky mountains, plateau, and trenches.

Mechanism

Small models know the facts but fail all six landmark tests given as coordinates, including Everest, the Altiplano, and the Mariana Trench. They only place a coordinate to within roughly 1,000 km: enough for continents, too coarse for elevation. Astra and Opus pass all six; Fable passes four (one explanation, one blank). Llama refuses where Qwen2.5 makes up an answer, though both know the facts, so refusing or inventing is separate from knowing.

QuestionQwen2.5LlamaAstra
“How high is Mount Everest?”884888488848.86
Elevation at (28°N, 87°E)150mrefusedabove 3000m (yes/no)
Place at (28°N, 87°E)HyderabadMumbaiMount Everest

Limitations

  1. The maps record what each model answers about each coordinate. They don't read the model's internal activations, so they show that the knowledge is stored, not how it is stored.
  2. The 110m map misses small islands and exact coastlines, so some model “errors” are map errors.
  3. The lat/lon grid over-counts the poles, equally for every model.
  4. Frontier answers are a single 0 or 1, given after brief reasoning (about 95 thinking tokens for Opus). They lose the confidence that logprobs keep, and they show what a model can work out, not what it believes in one pass.
  5. No model gives a height. The elevation bands and 3D relief come from my rule for combining four yes/no answers, and an unanswered cell counts as “no” (a missing land answer becomes ocean).
  6. Elevation is checked at each cell's center point, but a 4° cell can hold both peaks and valleys, so one point may not stand for the whole cell.
  7. Fable's scores skip cells where it explained instead of answering, which skews them.

Cost

Local: ~150k queries on Apple Silicon, free. Frontier: ~60k queries, ~$200 on OpenRouter. About two days in the background, mostly waiting on APIs.

Gallery

Every map for each model. In the 3D plots, x is longitude, y is latitude, and z is the probability (for terrain, the elevation band). Gray cells in the 2D maps have no answer; the 3D plots fill them with the average.

Astra

P(land).
P(above 3000m), 98% answered.
P(above 1000m), 97% answered.
P(below −1000m), 98% answered.
P(below −4000m), 93% answered.
Elevation bands.
3D: P(land).
3D: P(above 3000m).
3D: P(above 1000m).
3D: P(below −1000m).
3D: P(below −4000m).
3D terrain from the elevation bands.
Relief globe, Atlantic side.
Relief globe, Pacific side.

Fable

P(land).
P(above 3000m), 66% answered.
P(above 1000m), 56% answered.
P(below −1000m), 39% answered.
P(below −4000m), 21% answered.
Elevation bands.
3D: P(land).
3D: P(above 3000m).
3D: P(above 1000m).
3D: P(below −1000m).
3D: P(below −4000m).
3D terrain from the elevation bands.
Relief globe, Atlantic side.
Relief globe, Pacific side.

Opus

P(land).
P(above 3000m), 96% answered.
P(above 1000m), 94% answered.
P(below −1000m), 93% answered.
P(below −4000m), 79% answered.
Elevation bands.
3D: P(land).
3D: P(above 3000m).
3D: P(above 1000m).
3D: P(below −1000m).
3D: P(below −4000m).
3D terrain from the elevation bands.
Relief globe, Atlantic side.
Relief globe, Pacific side.

Qwen2.5

P(land), 4°.
P(land), 8° test run. Same blobs, rougher coasts.
P(land), 2° run. Stopped at 63% of cells.
P(above 3000m). Empty.
P(above 1000m).
P(below −1000m).
P(below −4000m).
Elevation bands.
3D: P(land), 4°.
3D: P(land), 8°.
3D: P(land), 2° (partial).
3D terrain from the elevation bands.
Relief globe, Atlantic side.
Relief globe, Pacific side.

Gemma

P(land).
P(above 3000m). Speckled.
P(above 1000m).
P(below −1000m).
P(below −4000m).
Elevation bands. Mostly land, with deep ocean in the wrong places.
3D: P(land).
3D terrain from the elevation bands.
Relief globe, Atlantic side.
Relief globe, Pacific side.

Llama

P(land).
P(above 3000m). Featureless.
P(above 1000m).
P(below −1000m).
P(below −4000m). Roughly inverted land.
Elevation bands. Deep ocean everywhere.
3D: P(land).
3D terrain. Flat, with one spike.
Relief globe, Atlantic side.
Relief globe, Pacific side.

Qwen3

8° test run, native API. Accuracy 0.47. Left out of elevation.

Code and run logs are available on request. All 92 model figures come straight from model outputs; I only added colormaps and smoothing for display.