All Posts

Stamen x Stadia series: Terrain behind the scenes

When we started thinking about how to recreate Stamen’s iconic Toner and Terrain raster styles with vector data, Toner seemed like it would present the bigger challenge. Achieving the right hierarchy and visual balance of that style felt like a monumental task to me, an ardent admirer of Toner for many years. Terrain was less familiar to me and, at first glance, seemed like the simpler of the two to recreate. Oh, how wrong I was…

If you aren’t familiar with the style, Terrain is a global web map that emphasizes natural features over built ones. For me, its color palette and crisp hillshade are very recognizable, setting it apart from other natural-focused maps I’ve encountered before (more on colors and hillshade later). We at Stamen also love the font used in this style — PT Sans Narrow. It’s not the type of font I’d typically lean towards when designing something from the ground up, but it really works in this case.

The original raster Terrain tiles showing the Bay Area on

As part of redeveloping these styles with vector technology, discussed at length in this blog post, we saw an opportunity to make some small improvements to the style while preserving its core characteristics. The yellowish color of the land in the original felt a bit too inorganic compared to the otherwise very natural color palette, so that seemed like a good place to start. At some views, the landcover’s blur effect was unsettling, to the point that it looked like a rendering issue. Although we won’t discuss it in detail here, we also saw an opportunity to improve some of the label hierarchy and styling in the redesign.

Select views of the original raster Terrain showing yellowish land and blurry landcover layers.

Overwhelmingly, color and visual effects were the biggest challenges in redesigning Terrain. The color palette now has to accommodate an entirely different dataset from the original map (actually, we now use two datasets for landcover; more on that later). Additionally, the new data overlaps in ways that push us to get creative with opacity and zoom transitions to achieve a similar effect to the existing map. Since the original Terrain used raster tiles, visual effects like blur are similar to what you would see with a tool like Photoshop – that is, the blur is customizable and seamless. This type of effect is not exactly replicable with vector map styles but we can do something similar.

(Re)defining the color palette

Since we wanted to mirror the original Terrain look as much as possible, we initially set up the vector version of the style to use exactly the same color values as the original. We spent a few days making some broad changes in Mapbox Studio using Mapbox vector data before transferring the styles to our internal workflows. As we expected, we had a lot further to go:

The original raster Terrain (left) vs. our first draft with the “same” colors (right). Data makes a big difference! In the original, the land is much yellower, the forests much greener, and the hills much hillier.

We then planned to switch to a different tile source (our Stamen x Stadia styles use Stadia’s version of OpenMapTiles) that is similar enough to the Mapbox tiles to at least get started. Up first: we needed to refine how the new data was classified in the stylesheet to reallocate our color palette more appropriately. The classes we started with were wood, grass, scrub, crop, snow, plus a fallback to cover anything we missed: 

Each of the defined landcover classes had its own color originally, except `scrub` and `crop`, which were styled the same way.

Other issues that impacted the landcover/landuse palette at this point were missing urban area data and wetlands. But first: the biggest visual challenge we needed to tackle was not having detailed landcover data at low zooms once we switched data sources. Stadia shared some coarse low-zoom landcover data that allowed us to start solidifying the low zoom look and feel:

Detailed landcover data started at z7 (left) but coarse landcover data spanned all zooms. Here, they are shown individually around z9 before we decided to style them together at midzooms.

We experimented with many options, ultimately deciding to keep both the fine and coarse landcover data from z7-12. This transition allowed us to overzoom the coarse landcover data without it being obvious since the more detailed data would balance out any rough or sharp lines. These adjustments didn’t get us all the way there, but it felt like a huge step in the right direction.

Coarse landcover data (left) compared with combined coarse + fine data (right).

The blur effect

The fine landcover data is excellent, but immediately felt very heavy. As I mentioned earlier, the original Terrain has a very soft, blurred effect that we wanted to draw inspiration from but ultimately improve upon in this new version. Adding a glow layer for each landcover layer allowed us to start softening this look, but we needed to do more.

We did some experimenting and found that multiple glow layers were really needed to achieve our desired effect. In most cases, the glow colors needed to be slightly lighter than the corresponding landcover polygon colors to avoid the splotchy effect seen here:

Splotchy blurred layers (left) vs. smoother blurred edges (middle) vs. the very blurry original (right)

We found that the combination of slightly lighter glow colors with the right balance of line blurriness was the key to achieving the landcover look we sought. In the glow layers, the trick was to use the same expression for the line-width and line-blur properties. This allowed the blur to transition nicely as you zoom in and out of the map:

See how the blur transitioned in the before (left) and after (right) versions

For example, in the second of two landcover glow layers, here are the line-width and line-blur properties:

The same linear interpolation expression for both properties helps achieve a smooth blur effect as you zoom.

The glow layers also feature some opacity expressions to help them layer nicely on top of the polygon landcover layers. We ended up using two glow layers for each landcover layer, so four in total, with some overlap from z7-12.

Now that we solved the blur issue, we needed to overhaul the color palette so the many features we’re layering work better together. There were some big differences between the original Terrain’s data and this updated data that also warranted a new color palette. For example, the original data allowed us to style different types of forests differently (ex. rainforests were lighter yellow-green while alpine forests were dark green), while our new data does not. Accounting for these differences, our updated color palette includes specific colors for new classes wetland, ice, lichen, farmland, barren, urban and removes unused colors for now-defunct classes scrub, crop, snow

Colors used in the final versions of the new Terrain.

Between the layering, opacity, line width/blur effect, lighter glow colors, and tailored overall palette, we finally achieved a landcover look and feel that we are very happy with.

Working version (left) vs. final version (middle) vs. the original raster Terrain (right).

Redesigning or updating an existing map style (especially a well known map, such as Terrain) is a tricky task to tackle. Precise recreation of something great in itself is hard, but it’s even harder to take pieces of it that aren’t perfect and elevate them. The team is pretty pleased with how both the Terrain and Toner redesigns turned out – but please let us know your thoughts, too! You can start using these styles here in either vector or rasterized vector format.

About Stamen

Stamen is a globally recognized strategic design partner and one of the most established cartography and data visualization studios in the industry. For over two decades, Stamen has been helping industry giants, universities, and civic-minded organizations alike bring their ideas to life through designing and storytelling with data. We specialize in translating raw data into interactive visuals that inform, inspire and incite action. At the heart of this is our commitment to research and ensuring we understand the challenges we face. We embrace ambiguity, we thrive in data, and we exist to build tools that educate and inspire our audiences to act.