It may be difficult to explore the maps on a mobile screen.

Holleweg in Rheden, seen from above. Notice how meticulously the cycle paths are cleaned in the Veluwezoom area

If you’re cycling in the Netherlands, especially in hilly areas, you may well find yourself on a road named Holleweg (Holloway). According to Wikipedia, the name refers to a road or track that is significantly lower than the land on either side, not formed by the (recent) engineering of a road cutting but possibly of much greater age.

A nice example is the Holleweg in Rheden, shown above. Then there’s the Oude Holleweg in Berg en Dal near Nijmegen, a short but tough climb. And a route down the Amerongenseberg will also take you along a Holleweg, but this one isn’t actually a holloway (anymore?). The Dutch national archive contains two photos of roads named Holleweg, both being used by cyclists.

I had the idea that if you’d create a map of all the roads named Holleweg, you might end up with a simplified elevation map of the Netherlands. However, things turned out to be a bit more complicated. Wageningen University & Research (WUR) have created a geomorphological map of the Netherlands (data, description). This map considers holloways a subcategory of dalvormige laagten (valley-shaped hollows), which suggests pretty much the opposite of elevation.

Below is a map showing roads named Holleweg (derived from Open Street Map), in red, and areas classified as holloway by WUR, in blue.

Larger version here.

The roads classified by WUR as holloways are concentrated in a number of areas, most notably Zuid-Limburg. There is very little overlap with roads that are named Holleweg. I suspect this is because the WUR definition refers to a specific type of holloway only.

Update 13 September 2019 - WUR explains: «The development of the geomorphological map spans a long period, and over time, many different people have worked on it. The holloway phenomenon has not been systematically mapped and has been charted mainly where it ‘competes’ with natural valley forms, for example in Zuid Limburg and Rijk van Nijmegen, as you suggest. In most cases, old cart tracks and hessenwegen cutting through sand ridges have not been identified as holloways, unfortunately. […] As we’re updating the map, we try to interpret those roads as holloways as well.

So how does the WUR classify the roads named Holleweg? Where possible, I’ve linked the street segments named Holleweg to a land form group on the WUR map. The result is shown below (I stick to the Dutch descriptions because I’m not sure of the correct English translations of the terms). The last column shows the total surface area of each land form group, as a percentage of the total area mapped by the WUR.

landvormgroep holleweg holleweg % area %
Geïsoleerde heuvels, heuvelruggen en dijken 58 32 14
Wanden 31 17 0
Heuvels en heuvelruggen met bijbehorende vlakten en laagten 27 15 17
Terrasvormen 18 10 1
Dalen 16 9 7
Vlakten 13 7 51
Waaiervormige glooiingen 8 4 0
Niet-waaiervormige glooiingen 5 2 2

Over half the area covered by the WUR map is classified as vlakte (plain). On the other hand, street segments named Holleweg are predominantly in land form groups that suggest relief, like heuvels (hills) and heuvelruggen (ridges).

In addition to land form groups, WUR identifies subgroups. For example, of the 58 street segments in the first table row, 40 are in the subgroup stuwwal (hills created by a glacier pushing up soft material). If I’m not mistaken, the examples in Rheden, Berg en Dal and Amerongen cited above are all on a stuwwal.

The Holleweg in Rheden again, about halfway up.

I thought it might be interesting to extend my analysis to foreign-language equivalents of Holleweg. This wasn’t easy. For example, Google Translate fails to offer reliable translations of holloway, which suggests the term isn’t used often enough to train the translation machine.

But I came across this tweet about Corredoira, the Galician translation of the book Holloway, by Robert Macfarlane, Stanley Donwood and Dan Richards. In the endless responses to the tweet, various other translations of the term are offered. Some of these served as clues to find yet other translations.

I exported roads from Open Street Map (OSM) with names containing one of the following terms: Holleweg (nl), Holloway (en), Chemin Creux (fr), Hohlweg (de), Corredoira (gl), Hulvejen (da), Hulvei (no) or Hålväg (sv). I ended up with over three thousand segments. In OSM, roads typically consist of multiple segments (ways).

I used the Google Elevation Api to look up elevation for the start and end points of all segments. As all data in this article, this comes with some caveats, discussed in the Method section below.

Based on the highest value for the start and end points, the median elevation of all segments is a little over 154m, with three-quarters below 290m and the highest at 2.149m. This suggests that streets named holloway may be found in hilly areas, but not very often in high mountains. As one would expect, median elevation varies across countries: for example, 22m in the Netherlands; 44 in Belgium; 63 in the UK; 136 in France; 152 in the US; 254 in Germany and 357 in Austria.

The median gradient of all segments is about 2% and three-quarters are below 5.3%.

Below is a map showing the segments, with different colours for the language versions.

Larger version here.

Unsurprisingly, language doesn’t always reflect (current) boundaries. There are streets named Holleweg in Germany, for example near Solingen. And in France, near the German border, there are a couple of streets named Rue Hohlweg.

One thing is clear: the Holleweg map isn’t a simplified elevation map. While the name may be used for roads in hilly areas, it appears to be rare in mountainous areas such as the Pyrenees or the Alps.

The same applies to Northern America: there are few Holloways in the Rocky Mountains.

And in Australia, Holloways seem to be located mainly on the margins of the Great Dividing Range.

Of course, all kinds of factors may influence the prevalence roads named Holloway. At a very basic level, you wouldn’t expect too many of them in areas with low population density. I imagine cultural factors could play a role as well. But geology also seems relevant. In their book Holloway, MacFarlane a.o. observe:

Holloways do not exist on the unyielding rock regions of the archipelago, where the paths stay high, riding the hard surface of the land. But where the stone is soft - malmstone, greensand, sandstone, chalk - there are many to be found, some more ravines than roads.

That makes sense. Perhaps the prevalence of streets named Holloway isn’t determined as much by height as by characteristics of the soil.

Oude Holleweg in Berg en Dal, view from above. As the road is steep and narrow, downhill traffic is not allowed (in fact they should ban cars altogether).

I’ll conclude with some other characteristics of the segments from OSM. According to Wikipedia, holloways are typically too narrow to allow vehicles to pass each other. Some of the OSM segments have a tag indicating whether it’s a one-way street, but there are too few of them to draw any conclusions. Seven hundred segments have a maximum speed tag; the median value is 32 km per hour.


I used Python to download OSM data (using the Overpass API), to retrieve elevation data from the Google Elevation API, and for processing the data.

Some caveats:

  • While OSM data is pretty good, it depends on efforts of volunteers and coverage may vary across regions.
  • In OSM, streets typically consist of multiple segments (ways). I used segments as the unit of analysis.
  • The WUR map doesn’t seem to cover the entire area of the Netherlands (urban areas tend to be missing). As a result, not all street segments named Holleweg could be linked to an area in the WUR map. On the other hand, areas in the WUR map sometimes overlap. For each (Dutch) street segment named Holleweg, I checked for both the start and end points which WUR map areas they’re in. Due to overlap in the WUR map areas, a street segment can be associated with multiple areas and therefore with multiple classifications.
  • Translations of Holleweg may not have the exact same meaning as the Dutch term. And of course, Holloway can be a name. Before including foreign terms in my analysis, I tried to look up a few examples of roads with that name to see if they appear to refer to broadly the same phenomenon. I excluded a few translations, either because they are seldom used as a street name (ceu-ffordd), or because they often appear to refer to other phenomena (pugdandee). Of course, spelling variations may have messed things up.
  • There’s a lot of debate about the accuracy of Google Elevation data. Especially with short road segments, the grade calculated may be inaccurate. With the Google Elevation API, it’s possible to retrieve data for a few hundred locations per request, but this resulted in very low resolution data. I decided to retrieve data in batches of 10 locations, which seemed to solve the issue.

Python code used for querying Overpass and processing data here

Translating polls into policy outcomes

In a report on last May’s Australian election, Nick Evershed of the Guardian translated live election results into support for specific policy outcomes.

We wanted to make an alternate view of election results that moves the results away from the ‘horse race’ and instead emphasises the policy outcomes of the election – that is, what the outcome will actually mean for people in the real world.

I reckoned you could do the same with polls instead of election results. I selected a number of proposals that have been put to a vote in the Dutch Lower House. Using Tom Louwerse’s Peilingwijzer ‘poll of polls’, I tracked developments in the combined virtual vote share of the parties that have voted in favour of those proposals.

The support for individual parties may show considerable fluctuations, but the combined support for policy proposals is relatively stable. This shouldn’t really come as a surprise. Voters may switch quite easily from one party to the other, but not randomly: they tend to stick to a set of parties with broadly similar values. This suggests that voters will often switch between parties that tend to support the same proposals.

Still, some proposals do show growth or decline in their combined virtual vote share. This includes proposals that were supported by either FvD or PVV but not both: FvD has seen considerable growth in the polls, partly at the expense of PVV. Proposals supported by left-wing parties also saw their support grow somewhat, but not if D66 was among the supporting parties.

So what does this all mean? The chart above doesn’t predict which policies will be implemented after the next election (just like the underlying polls aren’t simply a prediction of the next election result). However, it does appear to be a useful tool to make sense of fluctuations in polls.

Key to parties.

UPDATE 21 July 2019 - New Peilingwijzer data has been published since; the chart has been updated to include the fresh data. For the conclusions this doesn’t really make much of a difference.


One could argue that how parties vote doesn’t always reflect their position, especially when coalition parties have to stick to concessions they have made in the coalition agreement. I dealt with this by using only proposals (with one exception) on which the coalition parties VVD, CDA, D66 and ChristenUnie did not vote unanimously. Apparently, there was no pressure to vote along coalition lines in these cases.

Voters (and respondents in polls) aren’t always aware of the positions of the parties they support. For example, many voters want the government to reduce income differences. They may (wrongly) assume that the party they support also wants to reduce income differences.

As for the chart: an area chart is always a bit problematic, but it would appear to be a defensible choice when you want to show developments in the combined vote share of a number of parties. I guess it could be improved by putting parties that show large variations in the polls on top and the more stable ones to the bottom.


Traffic flow maps

Traffic Diagram of London, by Ludwig Karl Hilberseimer, 1944. Ludwig Karl Hilberseimer Archive, Ryerson and Burnham Archives, The Art Institute of Chicago.

A tweet by artist, designer and developer Jill Hubley drew my attention to a traffic flow map of London, created by Bauhaus architect Ludwig Karl Hilberseimer. The map shows the number of buses passing through London’s central arteries in one hour. «The traffic diagram of London shows both the typical congestion in the center and the lack of transportation facilities at outlying points,» he commented. Hilberseimer thought the solution to this transportation problem was to decentralise the city, by creating satellite cities with a population of at most 100,000.

Hubley has been tweeting numerous historical traffic flow maps, including a beautiful 1944 map showing transport along the waterways of Belgium and the Netherlands. What struck me about the Hilberseimer map is its similarity to a series of maps in a traffic study published by the city of Amsterdam in 1976. These maps were discovered by Marjolein de Lange of cyclists’ organisation Fietsersbond, and have been reproduced in the book Bike City Amsterdam she wrote with Fred Feddes.

From: Voorontwerp verkeerscirculatieplan Amsterdam, 1976. Photo Marjolein de Lange

The Amsterdam maps illustrate how cycling had declined in Amsterdam between 1961 and 1971, and how rising car use had created a congestion problem. It wasn’t until later that the city developed measures to promote cycling, as analysed in Bike City Amsterdam. I tried to create a 2016 version of the cycling map using Fietstelweek data, but it should be noted that the cycling routes of Fietstelweek participants may not be representative of overall bicycle traffic in Amsterdam.

Compared to Hilberseimer’s map, the maps created by the city of Amsterdam have a very clean design: all cartographic details that do not represent traffic data have been omitted. And then there’s the elegant legend. Hubley has tweeted a Swedish traffic flow map from 1977 with a similar type of legend, as well as a map of Florida from 1952, a map of St. Paul - Minneapolis from 1949, and a 1945 map of eastern Germany with a horizontal version of the legend. (Update - interesting variant on this 1963 Lincolnton map; plus see this 1921 map of Seattle.) I wonder whether earlier examples exist.

Were the flow maps in Amsterdam’s traffic circulation plan inspired by Hilberseimer’s Traffic Diagram of London? Possibly, but Hilberseimer wasn’t the first to create a traffic flow map. In fact, both Amsterdam’s map makers and Hilberseimer are indebted to a map created a century before Hilberseimer’s map, by the French civil engineer Charles-Joseph Minard.

Carte de la circulation des voyageurs par voitures publiques sur les routes de la contrée où sera placé le chemin de fer de Dijon à Mulhouse (source), by Charles-Joseph Minard, 1845. Reproduced with the kind permission of the Ecole nationale des ponts et chaussées.

In her book The Minard System, visualisation strategist Sandra Rendgen comments:

In this revolutionary map, created in the middle of a debate about where to project the railroads between Dijon and Mulhouse in eastern France, Minard analyzed the street traffic on preexisting roads in the region.

Apparently, the map was so influential in shaping the debate that a fake copy was made ‘in an attempt to prove another route to be more promising’.

Rendgen describes how Minard initially created bar charts to represent traffic along segments of a route. At some point, he decided to project these graphs onto a map, which resulted in the creation of the flow map. Over time, Minard’s flow maps gained in complexity, as he used colour to represent different types of data. Minard is sometimes credited with inventing the flow map, but Rendgen points out that the design was possibly invented more or less simultaneously in Ireland, France and Belgium.

Minard’s charts and maps often contain detailed descriptions of the data and methods he used. He collected data from a range of sources, and emphasised that graphs should accurately represent the data. On the other hand, he was willing to sacrifice geographic detail or accuracy for clarity. Rendgen points to the ‘clean and minimalist aesthetics’ of his work, devoid of decorations or other clutter. It is no wonder that Edward Tufte, the renowned proponent of clutter-free data visualisation, described Minard’s work as an example of ‘graphical excellence’ (in The Visual Display of Quantitative Information).

A recurrent theme in Minard’s explanatory notes is that he aimed to make relationships quickly apparent to the eye. One of these notes has an almost futurist sense of modernity to it: «The figurative maps are thoroughly in the spirit of the century in which one seeks to save time in all ways possible.»

One could argue that the 1976 Amsterdam traffic flow maps are true heirs to Minard’s approach, and especially to his first, monochrome flow map reproduced above. As Rendgen notes, Minard’s map is «extremely stripped down; it features barely any landscape details other than a network of local place names and rivers». Even those subtle geographical hints have been omitted from the Amsterdam traffic flow maps. Of course, this only works because of the very recognisable pattern of Amsterdam’s streets.

Scraping Airbnb

Airbnb is not exactly keen to share data that might help analyse its impact on local housing markets. In 2016, the Amsterdam Municipality decided to collect Airbnb data using a scraper - a computer programme that automates the job of retrieving information from web pages.

Amsterdam is not the only government to use web scraping. Increasingly, this technique is used to obtain data about topics ranging from consumer prices to jobs vacancy statistics and business data. Collecting data from the internet has advantages, but it also poses some challenges. It may be difficult to aggregate data coming from different websites, and data found online may not cover all aspects of a phenomenon you’re trying to understand (for example, not all job vacancies are published online). On a more practical level, your web scraper code may break when websites change.

In March 2017, Amsterdam reported that its weekly scrapes of major platforms like Airbnb required little maintenance. But last week, it sent a report to the city council describing how Airbnb has been making changes to its website - perhaps in an attempt to frustrate efforts to collect information about its business practices. Initially, Amsterdam’s digital surveillance department succesfully updated its scraper, but following new changes to the Airbnb website since May 2018, Amsterdam now appears to have given up on scraping Airbnb.

This made me curious about the technical characteristics of the Airbnb website. Here are some observations, based on an (admittedly superficial) examination:

  • The initial download of a web page isn’t the final version: after downloading, the contents of the page are dynamically altered using Javascript. For some purposes like navigating search results, you may prefer the final version of the page, which you can get using Selenium. Selenium would especially come in handy for interacting with the calendar to get availability and price information, which seems to be rather tricky.
  • Some details on listings only appear to be available in the Javascript code. You can find them using patterns like '\"lat\"\:(.*?),\"lng\"\:(.*?),'
  • Airbnb uses NGINX to control access to its website. If you request too many pages too fast, you’ll hit a rate limit and get an error page. I guess it should be possible to avoid the rate limit by adding pauses to your programme, but it may take quite some time to figure out how often and how long they should be.

While it appears that barriers to scraping the Airbnb website may be surmountable, it’s quite possible that I underestimate what this would take. If you’d actually build a scraper and would use it to frequently collect information about all local listings, all kinds of new problems might arise.

Meanwhile, other sources of Airbnb data are available. In a previous post, I used data made available by Tom Slee and by Murray Cox’ Inside Airbnb. Slee has since stopped updating his data, but Inside Airbnb is still active. As the Amsterdam Municipality notes in its report, Inside Airbnb has succesfully adapted its scraping technique each time Airbnb changed its website.

UPDATE 13 May - See comments on Twitter: Jens von Bergmann from Vancouver also has a scraper that is working. Following some requests, Tom Slee recently updated his scraper; his code is available on Github.

Visualising Amsterdam’s cyclists

Bike City Amsterdam, a new book by Fred Feddes and Marjolein de Lange, recounts how Amsterdam developed a cycling policy (more on the book below). An important source for the book is the archive of the Amsterdam branch of cyclists’ organisation Fietsersbond. In addition, traffic data was used to analyse trends.

An interesting dataset consists of counts of the number of cyclists, cars and other road users moving into and out of Amsterdam’s city centre, over the years 1980–2009. Most of the locations where traffic was counted are on the Singelgracht, which encircles Amsterdam’s city centre.

The data represents manual counts on a single day, between 7am and 7pm, of traffic in both directions.

I was asked to think about a way to visualise this dataset, which posed an interesting challenge (and was a lot of fun to do). Below, I’ll discuss a few of the options we considered.

Radar chart

Given the geographical distribution of counting locations, it seemed to make sense to try a circular chart design. In fact, that idea had also occurred to the city’s infrastructure department. In a 2007 fact sheet, they used a radar chart (or cobweb chart) to visualise the Singelgracht bicycle counts.

Incidentally, they didn’t use the term radar chart, but called it a fan (waaier). They used a bicycle metaphor to describe how it works: «from the middle, the counting locations around the city centre are connected like spokes in a bicycle wheel».

The chart looks really nice, but this chart type also has a drawback: there’s an implicit suggestion that the area within the purple line represents the number of crossings, which is in fact misleading (see this article for a discussion of a similar problem). Another limitation is that the chart doesn’t show how bicycle traffic changed - although it would be possible to make a version with separate lines representing 1980 and 2009.

Radial lollipop chart

As an alternative, I created what I’ll call a radial lollipop chart (to my knowledge, this chart type didn’t exist yet). The chart library that I use, D3.js, doesn’t seem to have a method to draw the ‘spokes’, or at least I couldn’t find it. Therefore, I wrote a function that calculates the start and end points of the lines. I had long forgotten how to use sine and cosine, so I had to look that up. I’ve published the code here.

Here’s a radial lollipop chart showing how cycling has increased at virtually all the Singelgracht crossings.

And here’s one showing the opposite effect for cars:

I love it when a chart has data points that break out of the chart area - although this is perhaps a bit extreme. The outliers are due to the fact that a large share of car traffic uses the Wibautstraat - IJtunnel route. I could have changed the scale to include those outliers, but then changes on other routes as well as changes in bicycle use would have become much more difficult to discern.

Area chart

I rather like the radial lollipop chart, but it has a limitation: it shows changes between 1980 and 2009, but not when those changes happened. Car use started to go down before cycling really started to increase, but from the radial lollipop chart you couldn’t tell.

This is why the chart used in the book is an area chart, with colours corresponding to the broad geographical orientation of the crossings. Simple, but effective. And if you want to explore the details, click here for a draft version of the charts: bicycle, car.

About the book and exhibition

On 4 April, the Amsterdam branch of cyclists’ organisation Fietsersbond has handed over its archive to the Municipal Archive. Marjolein de Lange, who coordinated a volunteer project to prepare the archive, came up with the idea to use the material as input for a book - a project she carried out with author Fred Feddes.

This resulted in a very interesting book about activism versus cooperation; the place of cycling in urban planning; and how the magic power of Amsterdam’s cycling culture decided the epic fight for the right to cycle through the passage under the Rijksmuseum. The book, which contains a wealth of great photos; maps and posters, is a must-read for anyone interested in cycling, Amsterdam, or activist poster design. It’s been published both in Dutch and in English. There’s also an exhibition at the Municipal Archive (until 30 June, Vijzelstraat 32, access is free).