Andrew Tyrrell
@southarrowmaps
🗺🇳🇿🇨🇦🏔 NZ-based cartographer, actually now Canada-based. Blender, QGIS, ArcGIS Pro, Illustrator. Partial to a good mountain. southarrowmaps.co.nz
#MapsInTheWild at the Grasshopper Pub, Sunshine Coast, BC. This is my first visit to the Sunshine Coast and it definitely won’t be my last. What a wonderful part of the province/country/world!
Labelling is a system: move one and five others shift too. Claude handles that knock-on tirelessly, but plenty of times I'd be faster by hand. But the main thing I learned from this is that labelling is a part of mapmaking that I love. Doing it through an AI was achievable, but quietly joyless.
Finally, combine them all with the basemap. Most labels are on top of everything, but the National Park labels had to blend into the basemap. Claude occasionally needed prompting to remember to blend, rather than just dump these on top.
As a stress test I had Claude update the spec, then rebuild the labels from scratch: spec and data only, no peeking at the previous version(s). It worked, but exposed the spec's own shortcomings: one rule silently dropped labels for some of the main lakes visitors come to see.
I asked Claude to label the main highways with their official shields, and it told me, confidently, that it could create SVGs "from the official specs". Pushed on the source of those specs, it admitted it was making them up from memory. They were all crap. So I downloaded the real SVGs myself...
Lakes took the most rounds of iteration. They started as big italics sitting on top of the water. I wanted them beside the lakes, not floating on them. Then I had two lake sizes competing, so I dropped to one. Quiet names set off the water. Simple to describe, many iterations to actually produce.
Peaks looked wrong before I could say why. Two different sizes of summit made every cluster read as lumpy and random. Collapsing them to one weight quietly settled the whole sheet. Then the fiddly bit: an even, constant gap from each triangle, and never nearer a neighbour's peak than its own.
Rivers fought me first. They curve along each channel, which is lovely when it works. But early on labels were straight, sometimes upside down. The halo on the smallest creeks was so heavy it swallowed them. Fixes: force the reading direction, thin the halo, bump the tiny rivers up a weight.
What to label? What matters? This is where AI was really useful. The map is for a visitor to the Icefields Parkway, so I just said: "label what a visitor cares about & fill gaps to maintain density". I didn't need to know the data schema & write out definition queries. I asked for what I wanted.
It started, like the basemap, with my own maps. In a separate chat I'd worked out how I want a map labelled (rules I usually keep in my head) and had Claude write it down as a spec. One typeface, one off-white ink, hierarchy by size, weight, style. Sixteen classes, before a word landed on the map.
The basemap is geometry: run the recipe, get an answer. Labelling is judgement: What deserves a name? Where does the label sit? Is it legible? Claude could try to place a label anywhere I asked, but deciding what belonged, and whether it looked right, was up to me. So much iteration. So much.
I will never not be a fan of 3D maps in visitor centres. Here’s the one in the Glacier Public Service Center in Mount Baker-Snoqualmie National Forest
So, can AI be a cartographer? Here, yes, as a partner: It set the pipeline, wrote the code, solved the water, and knew when to defer to me. The turning point was AI admitting it can't fake geography. Honesty plus real data is what made a real map. (Portrait below, by ChatGPT.) /end 🧑🎨🤖🗺️
The payoff: an accepted, print-ready basemap of the Lake Louise to Jasper corridor. Here is the whole thing, ready to be rotated and cropped to the long, thin road corridor. Unlike a flat AI image, every stage of this re-runs.
The coworker reality is the unglamorous bits. A cloud drive that would not mount. A sandbox blocked from the data hosts. 45-second compute limits leaving broken files. A proprietary font missing. Most of these Claude spotted and routed around itself, without me having to ask.
Infrastructure next, from the full 1:50,000 topographic data: every road, track and trail. The job was thinning it to what reads at 1:500k. Why not use 1:250k? I wanted to test AI. Roads become one ink weighted by class, rail a fine dark line, main trails dashed, and only the long tunnels dashed.
The hardest sub-problem, and still open: the region's famous lake colours. We tried proximity to the feeding glacier, distance along the drainage, a glacial index, then sampling real imagery. AI drove every attempt, but I made the call each time: not good enough yet. So it is parked.
The crux was water. The 30 m land cover scattered false blue speckle across the icefields. The fix layered real vector lakes and rivers from CanVec, rebuilt permanent snow and ice as a union of vector and raster, and even used glacier retreat, old ice minus new, to keep genuine meltwater ponds.
Colour comes from land cover: the 2020 Land Cover of Canada, as flat earth-tone fills that the grey relief modulates, plus a whisper of texture. Snow and rock come from the same classes, with no hypsometric tint. Every pixel traces to a data class or a named parameter, never a guess.
Then I briefed it like a colleague: the exact area and extent, the UTM projection, the 40 degree sheet rotation... I also told it how I build relief by hand in QGIS: multidirectional hillshade, sky-view factor, slope, and texture shading, blended to grey. It rebuilt the recipe.
So I took the whole exchange back to Claude, basically telling tales on ChatGPT. Claude turned the lesson into an end-to-end plan: how to go from a real area to a printed sheet, with geometry and text kept deterministic. To manage the data and outputs, I moved to Cowork on desktop.
It went further, doubting it could do a cartographer's job at all: it can't force the image model to ignore its priors, and "doesn't literally trace or preserve the pixels" I fed it. Its own suggestion was a split: it stylises the textures, I bring the real geography.
I handed that style to ChatGPT with a description of the area. It returned a gorgeous image, but invented the geography. Howe Sound had its islands, yet the wrong shape and position, and it dropped in Indian Arm, a real inlet, but nowhere near its true spot up Burrard Inlet.
First I had Claude study five of my own "hand-made" maps and write a full house-style spec: palette, geometric type, shaded relief, flat teal water, the land as the hero. All structured so another AI could build straight to it. It ran to over 200 lines of JSON.
Is it a personal side-project or an ICA Map Design Comm. initiative? If the latter, great! I want to learn about how to better use AI in carto, and see it align with the Comm’s Terms and the projects own aims & questions. If the former, fine, run it how you like, but probably not on the ICA site.
Bonus map from the toilet wall: a framed blueprint Map of Delta Municipality at the lovely scale of 53⅛ chains to 1 inch It’s impossible to take a good photo of a map behind glass
Not quite #MapsOnDrinks, but #MapsOnBreweries, at Barnside Brewing in Ladner, BC #CartoBooze
Not #MapsOnDrinks, but #DrinksOnMaps A large wall map at the Vancouver Sun Run race expo, showing the locations where Granville Island Brewing name their beers after. Conveniently, they’re almost all located along the Vancouver marathon route that I’m running in two weeks…
Final #MapsOnDrinks of 2025 “Shuswap Lake” West Coast IPA by A-Frame Brewing Company, Squamish All their beers are named after BC lakes. So far I’ve visited more than I’ve tasted. In 2026, I’ll visit and taste them all…
Today I finally “met” a distant relative, and several very, very distant relatives… Andrew Tyrrell (1988–) Joseph Burr Tyrrell (1858–1957) Albertosaurus (71–68 Ma)