The tools and datasets I use to tell stories with maps
SEPTEMBER 16, 2026 · MAPS · TOOLS · DATASETS · GEOSPATIAL · CARTOGRAPHYA few months ago Daniel O'Donohue invited me onto the MapScaping podcast and asked me to count down the top ten tools I'm using for mapping. Here's a recap of that list, plus a few extras that didn't make the cut for that.
The ten from the episode
10. Felt
Felt earns its place on collaboration. For a video about the Swiss rail system, Johnny set out to visit all 26 cantons by train in under 24 hours, and we planned the whole route in Felt before he left. He opened it on his phone, hit a button, and watched his own GPS dot move through it. If you rewatch that video there are cameos of him doing exactly that.
The other half is "upload anything." Drag in a KML he exported from Google Earth, or a CSV he pulled out of a research paper, and it just works. No deciding whether it's raster or vector, no hunting for the projection. Handing data to a non-technical colleague and saying "drop this in and build your own thing" is the whole promise, and Felt delivers it. It is expensive. It's still worth it.
9. PostGIS on Crunchy Bridge
PostGIS is the obvious part. Crunchy Bridge is the easiest way I've found to get a managed instance running in the cloud without it getting expensive. I've deployed Postgres in Google Cloud and it was fine, but it was harder and the bill climbed faster.
What I appreciate is the small stuff. The connection tab gives you every user role, and it'll hand you credentials as a URL string or as YAML, which matters because I don't want to parse a connection string to type it into QGIS. I connect with QGIS and DBeaver depending on whether I'm working spatially or tabularly. Worth remembering that QGIS was built as a PostGIS client in the first place.
8. GeoLayers 3
GeoLayers 3 is a mapping extension for Adobe After Effects, and it's clever in a specific way: it takes all the slippy-map infrastructure the web mapping world already built and translates it into After Effects. Set your zoom extents and it chunks the tiles into your timeline as native After Effects objects, and turns your vector data into shape layers the animators can style.
That's also why it's Mercator-only. My own use of it is narrow. I'll set up a canvas, import data, and time it against the voiceover, so that when we say a particular word the map switches to a particular GeoJSON. The fancy work belongs to animators like Jason Boone, who is worth following if you aren't already.
7. CShapes
CShapes is technically a dataset, but I use it like a tool because I come back to it constantly. Think Natural Earth, but for historical borders. Researchers at ETH Zürich worked through the treaties in force at a given moment and drew the boundaries those treaties imply, so every shape carries valid-from and valid-to dates. I can filter to a span, pull the snapshots, and drop them straight into GeoLayers.
The limitation is important, and it follows directly from the method: if a border change was never finalized by treaty, it isn't in there. Territory that changed hands mid-war and changed back is missing. We ran into that on a video about Finland, where some of the Winter War gains and losses simply aren't captured. For those you go to OpenHistoricalMap, or you draw them yourself.
What I like is that it's an academic dataset with a methodology paper behind it. I'm not asserting a border because I think it's a border. Global coverage runs 1886 to 2019, with a Europe subset going back to 1816.
6. Natural Earth
Natural Earth is the building blocks: borders, hillshades, cities with population attributes, rivers, lakes, all built so they line up. You don't lose an afternoon making some river file agree with a country boundary. It comes at the scales you'd actually map at, and the licensing is permissive enough that any newsroom anywhere can pick it up, which is close to the point of it.
It also ships disputed-territory and point-of-view datasets, so you can load the world as a particular country sees it. That matters more than it sounds like it does. I've leaned on it since about 2016, and it's the dataset GeoLayers is quietly pulling from when you add a country from its interface.
The raster products deserve their own mention. The shaded relief is gorgeous, and Tom Patterson is behind it.
Bonus: Eduard
I should have put Eduard on the list. It's a Mac app that makes Swiss-style hillshades genuinely easy, named for Eduard Imhof. Bring in detail or generalize the terrain with sliders and export. Tom Patterson generated a whole new set of hillshades with it for the preliminary Natural Earth 6.0 rasters. It's a one-time purchase, which I appreciate more every year.
5. MapTiler
Think of MapTiler as what Mapbox used to be before it went all-in on navigation. Lovely basemaps, plus the developer tooling around them.
The piece I actually stumbled onto is MapTiler Engine. Getting a GeoTIFF into a web map used to be a whole ordeal: hit an endpoint for a token, send the file to a bucket, hand-write a JSON recipe describing how you wanted it processed. Engine lets you drag the file in, tiles it, and pushes it wherever you want it. Its georeferencing interface is friendly too, which matters when the people working with old maps aren't spatial people and shouldn't have to learn all of QGIS to scan one.
MapTiler are also behind EPSG.io, and they picked up and maintained the open fork of Mapbox GL JS after the 2020 licence change. Good citizens.
4. Mapshaper
Mapshaper came out of newsroom cartography, and it shows. There's overlap with GDAL, but I use it for one thing: getting SVGs out fast. Load the file, output it to an SVG at a set canvas size, done. Previously that meant opening QGIS, styling, building a print layout at the right dimensions and exporting. Now it's a script where I swap the input and the output size.
One flag I'd point people at is splitting output by a column. We did a short-form piece on submarine cables where the GeoJSON was broken out by year, and one command gave me a separate styled SVG per year. That kind of repetitive production work is exactly what it's for. I've also sent our animators to the web version for quick conversions, which is a nice thing to be able to do.
3. GDAL, with the new pipeline syntax
GDAL is the daily driver, but it has to be a recent version.
The restructured commands and the gdal raster pipeline syntax let you chain the
whole operation into one call: read the GEBCO file, clip to a bounding box,
rescale the values across the full 16-bit range, write out an 8K PNG frame.
The part I didn't expect is how well that suits an LLM. I've found these
Unix-style modular command line tools are a better fit for something like Claude
Code than a wrapper is, because the interface is already half machine-readable. If
it gets stuck it runs --help, and if that isn't enough there's a docs URL right
there at the bottom. It follows the same chain I would, just faster. I'm terrible
at remembering the syntax anyway, which is why most of it lives in preconfigured
scripts.
2. GRASS GIS
GRASS launches with a GUI and a terminal, and once I'd watched an agent drive GDAL the thought was obvious: if it can use GDAL, it can use GRASS.
The test was a hydrology analysis on a stream that runs a couple hundred miles through here, against about 28 GB of one-metre USGS DEMs. It worked. It reasoned through the tools, used the command line help, and figured out headless mode on its own. GRASS has a deep, well-documented, scientifically-grounded tool library, which turns out to be exactly what makes it legible to a machine. I would not be mad if GRASS made a comeback.
1. VS Code and the Geo Data Viewer extension
My favourite is the smallest. Back on the FEMA work, most of my intermediate test files were GeoJSONs, and checking one meant dropping it into a web map or the Kepler demo every single time.
Geo Data Viewer does exactly one thing: click a spatial file in VS Code and it opens a Kepler.gl instance in a window right there. Did the data land where it should? Did the CRS transformation work? Do the attributes look right? I write the GeoJSON to my working directory and click it. That's the whole workflow, and it's the tool I've been most quietly happy about in three years.
The ones that didn't fit
Fused and TiTiler
GeoLayers needs XYZ tiles, and a lot of the rasters we work with are TIFFs. Whether that's an old scanned map or a satellite image, it has to become tiles before an animator can touch it.
Previously that meant running it through tiling software like MapTiler, building a tile directory in QGIS and hosting that somewhere, or paying for a MapTiler subscription to get XYZ tiles out. Now I save the georeferenced map or the satellite image as a cloud-optimized GeoTIFF, hand it to either Fused or a TiTiler instance, and get XYZ tiles back that I can send straight to an editor.
No more file sharing, no more multiple sources of truth. One endpoint every animator can point at to get the map.
Tippecanoe and PMTiles
I've been experimenting with map animation outside of GeoLayers, and leaning on cloud-native tooling to do it: Tippecanoe to build PMTiles, and Protomaps for the basemaps underneath those animations.
WhiteboxTools
Sometimes we make maps that try to show where historical or Indigenous groups of people might have lived, and that turns into a suitability analysis. A lot of suitability analysis comes down to elevation, and WhiteboxTools is very good at processing elevation data.
Remotion
Same thread as Tippecanoe: I've been animating maps and graphs outside of After Effects to see how far I can push it. Remotion is great for getting video out of code.
Eduard
Hillshades don't really get better than what you can generate with Eduard. Tom Patterson has rendered some excellent ones with it for the preliminary Natural Earth 6.0 raster set.
OpenHistoricalMap and CShapes
We do a lot of historical borders work on the channel, and I use OpenHistoricalMap and CShapes as references constantly.
Sentinel-2 on AWS
I've snuck a Sentinel-2 scene into plenty of our videos before, but having them hosted as COGs on AWS has turned that from a one-off into a pipeline. I can pull scenes, stylize them, mosaic them and have them ready for the edit much faster.
You'll also see declassified CORONA spy satellite imagery mixed in occasionally.
Copernicus GLO-30
There are a lot of satellite scenes in our new documentary series, The Human Element, coming this fall. For several of those visualizations I used Copernicus GLO-30 to give the imagery some texture.
GEBCO
Every 3D map scene in The Human Element was built on GEBCO bathymetry.
Overture and Natural Earth
Overture and Natural Earth carry the vector data in an awful lot of our animations. Between them it's an unmatched pair.
How it fits together
I can't share the render yet, because The Human Element isn't out. But here's the shape of it.
There's a scene where we wanted to show a specific stretch of the Nile. I pulled the Sentinel-2 data as COGs from AWS, stitched them together with GDAL, served them out as tiles through TiTiler onto a MapLibre canvas, then drove that canvas inside Remotion to make the animation and stylized the result with ffmpeg.
Sentinel-2 COGs (AWS)
│
▼
GDAL ── mosaic + stitch
│
▼
TiTiler ── COG to XYZ tiles
│
▼
MapLibre ── the canvas
│
▼
Remotion ── camera move, frames out
│
▼
ffmpeg ── grade and finish
│
▼
the shot
Every step there is either open source or something I can run myself, which is the part that matters. Three years ago this scene would have been a MapTiler invoice and a folder of TIFFs on a shared drive.