Skip to main content
Vintage Maps with MapLibre and Open Historical Maps

Vintage Maps with MapLibre and Open Historical Maps

·1170 words·6 mins
Mark Watkins
Author
Mark Watkins
Entrepreneur & author

I wanted to make maps that look like the maps you see in history or historical fiction books. Here’s a few examples of the kinds of maps I’m talking about. The maps are from Dan Jones’ The Crusaders and the recent Lionessheart by Catherine Hanley.

The Crusaders
From Dan Jones’ The Crusaders
Lionessheart
From Catherine Hanley’s Lionessheart

So, I went on map safari to learn about map display. In particular, I explored using MapLibre to display maps in a style similar to those seen in books. ChatGPT summarizes the technology more quickly than I can:

OpenStreetMap (OSM) is a global, community-maintained open dataset of geographic features—roads, buildings, boundaries, places, and more—that serves as a foundational source for many modern maps. Tools like OpenMapTiles transform raw OSM data into performant vector tiles, which can then be styled and rendered in the browser or native apps using MapLibre GL, an open-source map rendering engine derived from Mapbox GL. MapTiler builds on this ecosystem by providing hosted vector and raster tiles, terrain, hillshade, and style tools that are compatible with MapLibre, making it easier to deploy production maps without running your own tile infrastructure. Together with related standards and technologies—such as vector tiles (MVT), GeoJSON, sprites, glyphs, and style specifications—this stack enables highly customizable, scalable, and license-friendly web mapping, giving developers full control over cartography while avoiding proprietary lock-in.

Some nomenclature: tiles are small, fixed-size chunks of geographic data—raster images or vector features—served at multiple zoom levels to make maps fast and scalable, while sprites are compact image sheets that bundle many small icons and patterns into a single file to reduce network requests. Vector tiles carry geometry and attributes that are styled client-side, enabling dynamic cartography, whereas sprites provide the visual symbols referenced by a map style for consistent rendering.

I succeeded in getting something I was reasonably happy with. It looks like this:

Crusader Castles
A map of the locations of Crusader castles

TLDR: If you want to play with a live, interactive map, click this link. It which shows the base style of ocean gradient, terrain, and paper texture background.

Simple map

If you are interested in technical details, my Github repository has all the code, as well as an interactive map you can play with.

The key elements are:

  • A map style, which loads tiles and decides how to display them
  • Map sprites, the image resources used by the style (in my case, just a paper texture)
  • An html file that loads a map using the defined style file, and then renders points on the map using MapLibre GL javascript code.

There are three tile sets used:

  • maptiler-hillshade: used to show terrain (ala Google Terrain view)
  • land: a maptiler set used to draw lines around coastlines
  • land-gradient: a maptiler tile set used to create a dark gradient around coastlines, extending out into oceans

You can see what the file looks like here: bookmap.json. The sprite file is here.

Along the way, I discovered Open Historical Maps, a super cool project that links historical geographical data to the maps (i.e. the geographic boundaries of the Holy Roman Empire in 1187AD.) I created another style that shows major kingdoms and their boundaries; my example map is set during the year 1187 AD as I have been studying the Third Crusade, which began around then. So this second style adds a 4th tile, an Open Historical Map tileset containing the historical data.

compass rose

What vintage map would be complete without a compass rose? So I included one. You can move it around the map by click & drag if it obscures something.

Live example maps
#

If you want to play with live maps:

  • Simple map - shows the base style of ocean gradient, terrain, and paper texture background.
  • Historical map - the base map, plus inclusion of Open Historical Map kingdom and kingdom boundary data. Year set to 1187 AD.

The map pages allow you to

  1. Export Map to save the map image to a file (in case you want to include in a blog post!)
  2. Set POI to change the POI data to your own locations.

The format for POI entry is an array of lat/lon/name/description entries:

[
  [51.5074, -0.1278, "London", "London, England"],
  [48.8566, 2.3522, "Paris", "Paris, France"],
]

Export Map uses some custom code to export the canvas to an image file. I have also included the WaterGIS MapLibre Export plugin for more export options, which you can invoke using the printer icon at bottom left of the map.

Much of this code was created with Claude.AI. Caveat emptor.

Inspirations
#

I looked at a number of interesting articles about map styles, vintage map styles in particular. I found these articles particularly interesting and helpful.

How to Make a Historic Style
Welcome back! If you haven’t already, make sure to read Part 1: How to Recreate a Map Style before diving in here. This post will focus on…
Designing the Vintage style in Mapbox Studio
Medium
Designing the Vintage style in Mapbox Studio By Amy Lee Walton What makes a vintage map look “vintage”? Printing imperfections, discolored paper, and antiquated label names all play a part …

Tutorial: Creating 18th Century Coastlines for Fantasy Maps
K. M. Alexander
Lately, after releasing my last few map sets, I’ve had people ask me how I achieve the coastal hatching in my sample maps. It’s been a process. Since the release of Widman in February, …

Hand-Drawn and Antique Styles with QGIS - Andy Woodruff, cartographer
andywoodruff.com
Tips and tricks for designing hand drawn and antique map styles in QGIS.
Enhance coastlines with Land Gradient | Guides | Map design | MapTiler
docs.maptiler.com
How to enhance coastlines with the Land Gradient tileset to visually define landmasses and make features stand out in the ocean.
Easy Way to Add Ocean Hatching to Your Fantasy Maps — Map Effects
Map Effects
If you really want a classic hand-inked look for your fantasy map, then adding hatching lines along the coastlines is a great way to do it. Unfortunately, it is very time-consuming to draw each individual line, and keeping them equally spaced can cause no shortage of frustration.

Process notes
#

If you want to edit your own styles, use Maputnik. Go to Maputnik, then click Open, which will let you pick some default styles. Or, hit Code Editor and paste in the contents of my bookmap.json file to see (and edit) my book map style.

You can learn more about how to code with Open Historical Maps here.

The code for this repo (including the map pages, the styles, and the sprites) are hosted on github pages.

As a courtesy you should get your own MapTiler API key and replace the key used in bookmap.json.

Related