Skip to content

Regions compared

The Kiel study, run unchanged for seven more cities (state of 1 November 2026). Every region gets the same five layers from layers/_study.py: boundary, drinking water, pedestrian attractors, pedestrian potential (100 m grid) and hydrants. Only the population grid and the timetable differ by country. Each region is one project (kiel, hamburg, …); switch between them on the map with the Project list.

Why these regions

Region Role Why
Kiel Pilot Baltic port city, few mapped drinking-water points
Flensburg Neighbour Smaller port city next to Kiel; no drinking water mapped in OSM at all
Lübeck Neighbour Kiel's size, tourist old town
Karlsruhe Heat One of the hottest German cities (Upper Rhine); almost all hydrants tagged with position
Hamburg Large city Largest city in northern Germany, 16,400 hydrants in OSM; publishes a Bedeutungskarte Fußverkehr to check the pedestrian model against later
München Large city Established fountain network, 12,000 hydrants in OSM
Wien Benchmark More than 1,000 public fountains, and mobile fountains on hydrants in summer: the Offene Quelle idea in practice
Zürich Benchmark One of the densest fountain networks in Europe; shows what "fully covered" looks like

A scan of other cities (OSM counts, 1 Nov 2026) for later: Berlin (14,100 hydrants / 336 drinking-water points), Frankfurt (3,300 / 77), Köln (1,900 / 26), Leipzig (900 / 27, has a Bedeutungskarte Fußverkehr to check the pedestrian model against), Paris (9,450 / 1,100). Rome has 2,160 nasoni but only 218 hydrants mapped, so it doesn't work for the hydrant side; Copenhagen has no hydrants in OSM at all.

Results

All distances are straight lines; "covered" means a public drinking-water point within 300 m.

Region Residents Hydrants Excluded Candidates, gap Candidates, covered Public drinking water per 100,000 residents Residents covered Priority candidates
Kiel 248,700 2,207 231 1,959 17 2 0.8 1 % 606
Flensburg 94,700 845 172 673 0 0 0 0 % 67
Lübeck 215,700 1,600 425 1,115 60 5 2.3 3 % 582
Karlsruhe 305,300 2,507 996 1,203 308 90 29 23 % 528
Hamburg 1,805,900 16,442 1,744 13,968 730 67 3.7 4 % 4,318
München 1,477,700 12,243 397 9,773 2,073 143 9.7 17 % 3,468
Wien 2,039,200 5,987 12 1,572 4,403 1,732 85 78 % 291
Zürich 425,800 4,783 8 192 4,583 1,014 238 97 % 2

Residents: sum over the grid cells kept in the pedestrian-potential layer (potential ≥ 1). Priority candidates: hydrants in the gap that lie in a cell with high or very high pedestrian potential.

Does the pedestrian potential point to the right places? Where cities already have many fountains, they put them where the model expects pedestrians:

Region Cells with high or very high potential Public fountains in such cells Ratio Coverage of high-potential cells Coverage of low-potential cells
München 24 % 63 % 2.6× 27 % 4 %
Hamburg 18 % 45 % 2.5× 8 % 1 %
Karlsruhe 19 % 41 % 2.2× 28 % 7 %
Wien 25 % 55 % 2.2× 86 % 39 %
Zürich 26 % 52 % 2.0× 100 % 75 %

Drinking water is not one of the attractors, so this is not circular. It is not proof either: fountains and attractors both cluster in centres and parks. A check against real pedestrian counts is still needed.

Findings

  1. Hydrant type differs by country, and that decides the device design. In the German cities 85–99 % of mapped hydrants are underground (Unterflurhydrant): Kiel 2,171 of 2,207, Hamburg 16,322 of 16,442. In Zürich (4,713 of 4,783) and Wien (5,882 of 5,987) almost all are pillar hydrants. Vienna's mobile fountains on hydrants work on pillars. An Offene Quelle device for Germany needs a standpipe on an underground hydrant, which is a bigger step for safety and permission than clamping onto a pillar.
  2. The exclusion rule "underground hydrant in the carriageway" hits very unevenly: 39 % of hydrants in Karlsruhe, 26 % in Lübeck, 11 % in Hamburg, 10 % in Kiel, 3 % in München. That depends on local street layout and on how mappers tagged fire_hydrant:position, so check it before comparing candidate numbers between cities.
  3. The northern cities have almost no public drinking water. Kiel, Lübeck, Flensburg and Hamburg cover 0–4 % of residents. Karlsruhe and München reach about 20 %, Wien 78 %, Zürich 97 %. Zürich and Wien show that near-complete coverage is realistic for a city that wants it.
  4. Zürich is the saturation test. Only 192 hydrants are outside a fountain catchment and two of them are in busy cells. The model correctly finds almost nothing to add.
  5. Germany's gap is large in absolute terms. Hamburg has about 4,300 priority candidates and München about 3,500, each about twice as many as Kiel, Flensburg, Lübeck and Karlsruhe together (1,783). Hamburg has fewer public fountains per resident than München (3.7 against 9.7 per 100,000).

Caveats

  • OSM only. Missing fountains inflate the gap. Flensburg probably has drinking-water points that are not mapped. Official registers exist for Zürich (CC0) and Wien (CC BY 4.0), see Data sources, and could be used to measure how complete OSM is.
  • The potential is relative within each city (scaled by the city's 95th percentile). "High" in Flensburg is not as busy as "high" in München; compare shares, not absolute values.
  • Different inputs by country. Zürich: STATPOP hectares on the Swiss grid, assigned approximately to the EU grid. Wien: the Wiener Linien timetable has no S-Bahn. The assumptions are listed on each layer's page.
  • Region boundaries. Kiel and Flensburg have two OSM relations with the same municipality key. The pipeline uses one; an earlier quick count over both gave 984 hydrants for Flensburg against 845 here.
  • Hamburg's area includes the island of Neuwerk and the Wadden Sea; cells there have no potential and drop out (98,100 cells in the area, 50,700 kept).
  • Straight-line distance. Rivers, railways, the Elbe and the Danube are ignored (see the hydrant layer's assumptions).

Adding a region

Write a script like layers/luebeck.py (Germany) or layers/zuerich.py (other countries), see Writing layers; it defines the region's project. Run it with make layers SCRIPTS=layers/<region>.py. If the public Overpass server is busy (502/504), add ARGS="--overpass-url https://overpass.private.coffee/api/interpreter".