How this light pollution map is made
The map is built from David Lorenz's light pollution atlas, which models sky brightness from NOAA VIIRS satellite night lights, recalibrated here against 2979 measured SQM readings, which halves a systematic half-magnitude bias. What follows is the full disclosure the map's own panel deliberately keeps to one small chip: the sources, their licences, and exactly how accurate the result is.
Sources and licences
Three sources make up what the map shows, and only one of them is data about light pollution itself:
- Zenith brightness grid — David Lorenz's Light Pollution Atlas, built from NOAA/NASA VIIRS satellite night-lights data via the Earth Observation Group (EOG), 2025 imagery. Lorenz's atlas carries no published licence file; we use it with the author's own written permission, on the one condition covered below.
- Terrain — Terrarium elevation tiles, published on AWS Open Data. Open, no attribution condition attached. They are fetched only after you press the Terrain control — nine tiles around the point you chose. That request carries those coordinates, at roughly one-kilometre resolution, and nothing else: no photograph, no account and no identifier. Leave Terrain off and the page reaches no elevation host at all.
-
Base map — the coastlines, roads and place names under the brightness overlay
are drawn in your browser from our own copy of the
Protomaps planet basemap, built from
OpenStreetMap data and published under the
Open Database Licence (ODbL). That licence is why
© OpenStreetMap contributors · Protomaps appears beside the map itself and
not only here. It is one 35.6 GB file on this domain, and your browser asks it for the few
kilobytes covering what is on your screen — so, unlike the third-party tile service this
replaced in September 2026, no request leaves this site at all and the map is no longer served
with a vendor’s watermark across it. The map’s Layers control turns the base map off
entirely, and the privacy page says what each request does and does not carry.
The ODbL is a database licence: it binds that archive and any derivative database of it, and a map image rendered from it may be licensed however we like provided the credit above is shown. It does not reach the light pollution overlay drawn on top of it, this site’s own code or text, or anything you upload to the stacker. -
Time zones — the map prints every time in the civil local time of the point you
picked, not on your own clock, so it has to turn a coordinate into a time-zone name. That mapping is
timezone-boundary-builder,
built from OpenStreetMap data and published under the same Open Database Licence (ODbL)
as the base map, packed into a 73 KB table by
@photostructure/tz-lookup(CC0-1.0). It runs in your browser over a file served from this domain: resolving the zone sends nothing anywhere. It is also approximate — a lossy quadtree, whose own README puts roughly 5% of random points on a different offset than an exact lookup, with the errors on borders — which is exactly why the panel prints the zone it resolved, as Times in America/Los_Angeles (UTC−7), instead of using it silently. Where no zone resolves it says Times in UTC and renders in UTC. The full notice is published with the site.
The map itself carries the attribution these sources require: Light Pollution Atlas © David Lorenz, VIIRS: EOG, © OpenStreetMap contributors · Protomaps, and time zones from timezone-boundary-builder under the ODbL. The Sun, Moon and Milky Way positions shown are computed in your browser from standard formulae and need no attribution of their own.
Why this is not the Falchi World Atlas
The atlas most people have actually heard of is Falchi's World Atlas of Artificial Night Sky Brightness (2015). It appears once on this page, in the accuracy table below, purely as a published point of comparison — and it is worth saying plainly why it stops there. The dataset's own README states that further distribution of its files and commercial use are both generally prohibited. We do not ship it, link to a copy of it, or derive our tiles from it. Lorenz's atlas is the only sky-brightness source that is actually redistributable here, which is also why it is the one we hold written permission for.
Calibration, measured against 2979 real readings
Lorenz's atlas hard-codes a natural sky of 22.00 mag/arcsec² and takes its own artificial-brightness scale at face value. Both are approximations, and this session measured by how much: ground truth came from Globe at Night, an open citizen-science archive of sky-brightness readings, filtered to n = 2979 observations from real SQM (Sky Quality Meter) devices, under clear skies, during astronomical night, with the Moon below the horizon.
| Model | MAE | Bias | RMSE | r |
|---|---|---|---|---|
| Falchi / World Atlas 2015 (comparison only, not shipped) | 0.926 | −0.83 | 1.25 | 0.786 |
| Lorenz 2025, as shipped | 0.693 | −0.51 | 1.10 | 0.768 |
| Ours, recalibrated | 0.578 | −0.22 | 1.00 | 0.768 |
Scroll the table sideways for the remaining columns.
Falchi's World Atlas 2015 is in that table for comparison only and is never fetched or shipped by this project: scored against the same readings it gives a mean absolute error of 0.926 magnitudes, a bias of −0.83 and an RMSE of 1.25.
All three figures are magnitudes: mean absolute error, mean signed bias against the measured value, and root-mean-square error. Recalibrating against 2979 real Globe at Night SQM readings lowers the atlas error from 0.693 to 0.578 mean absolute magnitude, a 16.6% improvement — call it about 15% given Globe at Night's own systematics, the same hedge as always. An earlier five-fold cross-validation figure (0.670 → about 0.56) predates the correction described below and is not restated here as current; the two contemporaneous notes of that superseded run disagree in the third decimal and it cannot be re-derived, which is itself part of why it was replaced. The fit itself lands on a natural sky of 21.83 mag/arcsec² (excluding the Milky Way's own contribution) and a Milky Way term worth +0.54 mag on the galactic plane — both values astronomy already knows independently, which is the sanity check that this found real structure rather than noise.
Read this honestly rather than as more than it is: Globe at Night's readings are weighted toward North America and Europe, and SQM devices carry their own instrument-to-instrument systematics. The residual error is dominated by ordinary night-to-night atmospheric variability and measurement noise, not by which model is used — every independent physical model of this kind agrees with the others far better than any of them agrees with a real measurement. That is also why this project has not written a third from-scratch propagation model: the model is not where the remaining error lives.
These figures were corrected on 2026-09-07. An earlier run of this measurement reported n = 2917 and an as-shipped/ours MAE of 0.670 and about 0.56: its live per-reading fetch of the atlas tiles silently dropped any reading whose fetch failed that afternoon, 62 of them. research/validate-light-pollution.mjs instead reads the atlas from the tiles already committed in this repository, so nothing is dropped, and the table above is the complete, reproducible measurement. The Falchi comparison row is carried over unchanged from the original session as a published reference point; it has not been re-run against the corrected sample.
Why sky brightness, and Bortle only as a small approximation
The map's headline number is zenith sky brightness in mag/arcsec², not the Bortle scale. That is a condition of the permission behind this project: the atlas's author asked that his data not be presented as the Bortle scale, and this map honours that everywhere it appears. It is also, independently, the better choice for a tool aimed at astrophotographers — mag/arcsec² is a continuous, directly measured quantity, where Bortle is a nine-step subjective ladder describing the whole sky rather than one number at the zenith. Wherever the map shows a Bortle value, it is a small, explicitly labelled approximation (“≈ Bortle”) derived from the measured brightness, never the other way round.
It is one of those nine classes, as a whole number. The map used to interpolate inside them and print a tenth of a class — “≈ Bortle 4.7” — and there is no such class: each Bortle step is a description of what a whole sky shows, not a point on a continuous axis, so a decimal placed on top of a modelled brightness promised a resolution neither the scale nor the model has. The map now names the class the modelled brightness falls into, on the scale’s published boundaries, and leaves the continuous quantity to the mag/arcsec² figure above it, which is the one that really is continuous.