Colophon

About How Far, Really?

What inspired this tool, where the data comes from, and how it's drawn.


Inspiration

It started with this BBC article — a static map of Iranian missile ranges that left a nagging question: what does that actually look like on a globe, from somewhere I care about?


Missile range data

Range figures are compiled from CSIS Missile Threat and the Missile Defense Advocacy Alliance. They represent approximate maximum ranges — real-world performance varies by payload and trajectory.


Topographical data

Country borders, coastlines and graticule come from Natural Earth's 1:110m Cultural Vectors, packaged as TopoJSON via Mike Bostock's world-atlas. Natural Earth's data is in the public domain.


City list

Around 225 capitals plus extra major cities for the ten most populous countries, hand-curated. Coordinates were cross-referenced from public geographic databases — there's no single upstream feed.


Technologies

Built with Clojure and ClojureScript, rendered with UIx (a thin DSL over React 19), and drawn with D3.js on HTML canvas.

D3 features in use

  • d3-geogeoOrthographic for the globe, geoMercator for the flat map, geoPath to render both to canvas, geoGraticule10 for the lat/lng grid. Projection methods used: fitSize, clipExtent, clipAngle(90), rotate, translate, scale.
  • d3-dragPointer-driven globe rotation with momentum/inertia.
  • d3-zoomPinch, wheel and double-click zoom on the map (scale 1–20×) and globe (0.5–8×).
  • d3-selectionBinds D3 behaviours (drag, zoom) to each canvas element.
  • d3-transitionSmooth animated zoom-to-feature transitions on the map.
  • topojson-clientDecodes the Natural Earth TopoJSON to GeoJSON in the browser before rendering.

Border smoothing

The range rings aren't drawn as circles in the browser. They're pre-computed at build time so the runtime only loads finished geometry.

Each launch site gets its own Azimuthal Equidistant projection centred on the site itself. In that projected space, distance from the centre is true kilometres — so a JTS BufferOp at, say, 2,000 km produces a ring that really is 2,000 km away on the ground.

The buffered geometry is simplified with TopologyPreservingSimplifier to drop redundant vertices, projected back to lng/lat, and shipped with the build. The map and globe both read from that file.


Created by

This project was created by Kenneth Kalmer, a South African software developer living in London. Ken loves visualisations and relishes any opportunity to build something that tells a story with data (visually, or otherwise).