11 min read

Color Palette Selection from Historic Maps


Cassini map of Besancon France 1780
A rendering of Besancon-Planoise, France 1780

View raw source for this post

Summary

Historic maps can provide examples of coloring that can inspire contemporary work. Here, the colors from a 1780 map of Besancon France are indexed using GIMP and then used to color map tiles from Open Streeet Maps.

Table of Contents

Overview

Many, many tools are available online to generate color palettes for maps and charts. The science of color is better understood today as a result of photography and digital display than at any other time. Yet, history is replete with beautiful art and maps. Monarchs and nations devoted extreme resources for exploration and conquest. Maps were crucial in the effort. The resulting maps were both a symbol of national power and advertisements of scientific ingenuity. Many of these historic maps contain beautiful color schemes. Can these maps be used to color a contemporary map of today? The answer is a resounding “yes” and the inspiration for this effort was taken from the post “Cartographic palettes and colour harmonies.”

In the rest of the post, I’ll give some background on Besancon and the famous Cassini family, download the map tiles that cover the Besacon-Planois area of France, discuss how to extract the colors from the old map, and recolor the map with the new palette. Our tools will be GIMP, the open-source digital image manipulation tool, and QGIS, the open-source GIS mapping tool. Both QGIS and GIMP are amazing tools, but have a steep learning curve.

Background

Besancon

Besancon is long-established city in France close to Switzerland. The site was seen as an ideal place for military fortification because it sits within an oxbow of the river Doubs, meaning it is surrounded by water on three sides. The Alps also provide a natural barrier to its immediate south. The city is the capital of the French region Bourgogne-Franch-Comte. According to wikipedia, the city population was 283,127 in 2021. In 1793, the number of inhabitants of Besancon was 25,328 according to the Cassini map online on EHESS site.

The Cassini Family

Four successive generations of the Cassini family labored to produce the first national map of France:

  • Giovanni Domenico Cassini (1625 - 1712)

  • Jacques Cassini (1677 - 1756)

  • Cesar-Francois Cassini de Thury (1714 - 1784)

  • Jean-Dominique Cassini (1748 - 1845)

Giovanni moved to France from Italy. With the patronage of Louis XIV, Giovanni was the founder, architect, and director of the Paris Observatory which opened in 1671. He discovered a more accurate way to determine longitude which allowed for France to be more accurately surveyed for the first time. He was the first of his family to begin working on a topographic map of France. The map was constructed by triangulation. Finally published in 1789, it was known as the Carte de Cassini or the “Cassini Map”.

Cesar-Francois began the construction of a topographical map of France, one of the landmarks in the history of cartography. Finished by his son and published by the Academy of Sciences from 1744 to 1793, its 180 plates are known as the Cassini map.

Jean-Dominique published his father’s map of France which was published by the Academy of sciences in 1793. It was the first topographic map of an entire country. The map consists of 182 sheets at the same scale, allowing the sheets to be joined together to form a physical map of about 39 feet high by 38 feet wide. The map was overlayed on Google earth and reveals an accurate geographic depiction of France, particularly its roads and boundaries. David Rumsey Map Collection

In spite of an immense amount of searching, I was unable to resolve whether the Besancon-Planoise map pictured above was part of the original Cassini map. Rather, the gist of material suggest the Besancon-Planoise was a separate publication and survey. Looking at the whole French map, the styling is different.

As a side note, a multinational sponsored satellite was named “Cassini-Huygens” in rememberance of Giovanni Cassini’s contributions to astronomy, mathmatics and cartography. The satellite, launched in 1997, orbited Saturn until 2017 when it was steered into Saturn’s atmosphere as part of its planned demise. The satellite’s name was a fitting tribute since Giovanni was the first astronomer to observe Saturn’s separate rings.

Open Street Maps

My first effort at downloading the Open Street Maps was using the QGIS plugin “OSMDownloader”. The download via the plugin was a large file size and created layers by geometry type. Rather than hack a column for conditional coloring, I chose to download the tiles via bbbike. The change in source had the benefit of having 8 layers of data: places, points, railroads, roads, waterways, building, landuse and natural. Below is a copy of the “bbbike” tiles download window.

While difficult to see, the bounding box includes Besancon, France.  The tool notifies you by email when the tiles have been downloaded.  2 to 7 minutes is a common preparation time.

Figure 1: While difficult to see, the bounding box includes Besancon, France. The tool notifies you by email when the tiles have been downloaded. 2 to 7 minutes is a common preparation time.

Cassini Palette

There are at least two ways to generate a color palette from the Cassini map of Besacon: Image Color Summarizer and GIMP.

Image Color Summarizer

The first way is to use an online tool called “Image Color Summarizer.” The Image Color Summarizer only analyzes a 200 x 200 pixel image; however, it can be downloaded and used from the command line too. The results will sample the pixels and provide the user an average color for the number of samples chosen. The results also include a percentage of the pixels from within the image. The tool will provide the representative colours of the image. You can then paste the hex code into QGIS.

The image color summarizer displays the frequency of color in descending order. This can be useful in color selection later.

Figure 2: The image color summarizer displays the frequency of color in descending order. This can be useful in color selection later.

GIMP

GIMP (GNU Image Manipulation Program) is a free, open-source image editing program that can be used for a variety of tasks like image editing. GIMP was downloaded and the Cassini map was loaded into GIMP as a layer. The steps to generate a color palette are described below.

  • First, go to Image > Mode > Indexed and then hit “Convert”.

  • Second, go to Windows > Dockable Dialogs > Colormap. You’ll see the palette generated from the image.

  • Third, take a screenshot of the colors. There’s some different ways to import the palette into QGIS, but the simplest way is the way I’ve included here. (You can also save it as a palette and then import it into QGIS.)

QGIS

First, load the OSM tiles.

Second, load the Cassini color palette. You’ll have to set a projection and then hit pan so that you can see the palette on the map. We’re going to include the palette as project colors in the “Properties” menu.

Note that the file extension is a 'png' and it was rotated 90 degrees to make it easier to work with.

Figure 3: Note that the file extension is a ‘png’ and it was rotated 90 degrees to make it easier to work with.

Third, add the colors to the project properties colors. You need to understand that the colors are not added by mouse click, but by the pressing of the space bar. This was repeated 16 times. One nice feature is that the label allows you to specify what the color will be used for.

It may take you a while to add the first couple of colors and become familiar with the workflow. The overall time took about 5 minutes.

Figure 4: It may take you a while to add the first couple of colors and become familiar with the workflow. The overall time took about 5 minutes.

Fourth, beginning with only one layer, in the “Properties” menu, switch the symbol from “Single Symbol” to “Categorized”, set the value box to “type”, hit the “Classify” button and click “OK”.

Change the layer features to be colored by the value in the type column.

Figure 5: Change the layer features to be colored by the value in the type column.

After inspection of the layer, double click on the layer and reopen the “Properties” menu to switch out the randomly selected colors for the Cassini palette. Double-click on the feature, doublic click on the color, select the project colors drop-down menu and choose the color that Cassini might have used. I chose a blue, but experimented quite a bit.

Substitute colors for Cassini Palette in the project palette.

Figure 6: Substitute colors for Cassini Palette in the project palette.

Results

Before

After

Conclusion

There were lots of styling choices that were made in coloring the open street map tiles. I come away from the project with a great respect for the French surveyors and the Cassini family because the maps of the 1700s have stood the test of time. The accuracy is amazing. My second impression is how much development has ocurred in the Besancon area since 1780. Whereas the city of Besancon had some crimsom within the oxbow of the Doubs, now the entire area is populated with buildings. The population of just Besancon has increased 10 fold from 1793 to 2021. Third, I loved the palette of colors, its much better than anything I could’ve generated and it’s more creative than what might have come from an online tool. Overall, I’ll continue to explore the use of historic color palettes for the creation of contemporary maps.

Acknowledgements

This blog post was made possible thanks to:

Morgan Hite and his blog: The Wandering Cartographer.

References

[1]
R Core Team, R: A language and environment for statistical computing. Vienna, Austria: R Foundation for Statistical Computing, 2024 [Online]. Available: https://www.R-project.org/
[2]
Y. Xie, C. Dervieux, and A. Presmanes Hill, Blogdown: Create blogs and websites with r markdown. 2024 [Online]. Available: https://github.com/rstudio/blogdown

Disclaimer

The views, analysis and conclusions presented within this paper represent the author’s alone and not of any other person, organization or government entity. While I have made every reasonable effort to ensure that the information in this article was correct, it will nonetheless contain errors, inaccuracies and inconsistencies. It is a working paper subject to revision without notice as additional information becomes available. Any liability is disclaimed as to any party for any loss, damage, or disruption caused by errors or omissions, whether such errors or omissions result from negligence, accident, or any other cause. The author(s) received no financial support for the research, authorship, and/or publication of this article.

Reproducibility

─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.4.1 (2024-06-14)
 os       macOS Sonoma 14.4
 system   aarch64, darwin20
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/New_York
 date     2024-09-17
 pandoc   3.1.11 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
 package     * version date (UTC) lib source
 blogdown    * 1.19    2024-02-01 [1] CRAN (R 4.4.0)
 bookdown      0.40    2024-07-02 [1] CRAN (R 4.4.0)
 bslib         0.8.0   2024-07-29 [1] CRAN (R 4.4.0)
 cachem        1.1.0   2024-05-16 [1] CRAN (R 4.4.0)
 cli           3.6.3   2024-06-21 [1] CRAN (R 4.4.0)
 codetools     0.2-20  2024-03-31 [1] CRAN (R 4.4.1)
 colorspace    2.1-1   2024-07-26 [1] CRAN (R 4.4.0)
 devtools    * 2.4.5   2022-10-11 [1] CRAN (R 4.4.0)
 digest        0.6.37  2024-08-19 [1] CRAN (R 4.4.1)
 dplyr         1.1.4   2023-11-17 [1] CRAN (R 4.4.0)
 ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.4.0)
 evaluate      0.24.0  2024-06-10 [1] CRAN (R 4.4.0)
 fansi         1.0.6   2023-12-08 [1] CRAN (R 4.4.0)
 fastmap       1.2.0   2024-05-15 [1] CRAN (R 4.4.0)
 fs            1.6.4   2024-04-25 [1] CRAN (R 4.4.0)
 generics      0.1.3   2022-07-05 [1] CRAN (R 4.4.0)
 ggplot2     * 3.5.1   2024-04-23 [1] CRAN (R 4.4.0)
 ggthemes    * 5.1.0   2024-02-10 [1] CRAN (R 4.4.0)
 glue          1.7.0   2024-01-09 [1] CRAN (R 4.4.0)
 gtable        0.3.5   2024-04-22 [1] CRAN (R 4.4.0)
 highr         0.11    2024-05-26 [1] CRAN (R 4.4.0)
 htmltools     0.5.8.1 2024-04-04 [1] CRAN (R 4.4.0)
 htmlwidgets   1.6.4   2023-12-06 [1] CRAN (R 4.4.0)
 httpuv        1.6.15  2024-03-26 [1] CRAN (R 4.4.0)
 jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.4.0)
 jsonlite      1.8.8   2023-12-04 [1] CRAN (R 4.4.0)
 knitr         1.48    2024-07-07 [1] CRAN (R 4.4.0)
 later         1.3.2   2023-12-06 [1] CRAN (R 4.4.0)
 lifecycle     1.0.4   2023-11-07 [1] CRAN (R 4.4.0)
 magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.4.0)
 memoise       2.0.1   2021-11-26 [1] CRAN (R 4.4.0)
 mime          0.12    2021-09-28 [1] CRAN (R 4.4.0)
 miniUI        0.1.1.1 2018-05-18 [1] CRAN (R 4.4.0)
 munsell       0.5.1   2024-04-01 [1] CRAN (R 4.4.0)
 pillar        1.9.0   2023-03-22 [1] CRAN (R 4.4.0)
 pkgbuild      1.4.4   2024-03-17 [1] CRAN (R 4.4.0)
 pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.4.0)
 pkgload       1.4.0   2024-06-28 [1] CRAN (R 4.4.0)
 profvis       0.3.8   2023-05-02 [1] CRAN (R 4.4.0)
 promises      1.3.0   2024-04-05 [1] CRAN (R 4.4.0)
 purrr         1.0.2   2023-08-10 [1] CRAN (R 4.4.0)
 R6            2.5.1   2021-08-19 [1] CRAN (R 4.4.0)
 Rcpp          1.0.13  2024-07-17 [1] CRAN (R 4.4.0)
 remotes       2.5.0   2024-03-17 [1] CRAN (R 4.4.0)
 rlang         1.1.4   2024-06-04 [1] CRAN (R 4.4.0)
 rmarkdown     2.28    2024-08-17 [1] CRAN (R 4.4.0)
 rstudioapi    0.16.0  2024-03-24 [1] CRAN (R 4.4.0)
 sass          0.4.9   2024-03-15 [1] CRAN (R 4.4.0)
 scales        1.3.0   2023-11-28 [1] CRAN (R 4.4.0)
 sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.4.0)
 shiny         1.9.1   2024-08-01 [1] CRAN (R 4.4.0)
 stringi       1.8.4   2024-05-06 [1] CRAN (R 4.4.0)
 stringr       1.5.1   2023-11-14 [1] CRAN (R 4.4.0)
 tibble        3.2.1   2023-03-20 [1] CRAN (R 4.4.0)
 tidyselect    1.2.1   2024-03-11 [1] CRAN (R 4.4.0)
 urlchecker    1.0.1   2021-11-30 [1] CRAN (R 4.4.0)
 usethis     * 3.0.0   2024-07-29 [1] CRAN (R 4.4.0)
 utf8          1.2.4   2023-10-22 [1] CRAN (R 4.4.0)
 vctrs         0.6.5   2023-12-01 [1] CRAN (R 4.4.0)
 withr         3.0.1   2024-07-31 [1] CRAN (R 4.4.0)
 xfun          0.47    2024-08-17 [1] CRAN (R 4.4.0)
 xtable        1.8-4   2019-04-21 [1] CRAN (R 4.4.0)
 yaml          2.3.10  2024-07-26 [1] CRAN (R 4.4.0)

 [1] /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────