Generate a map for from Wikidata and the Semantic MediaWiki data.
Go to file
s3lph fc17f0cf9b
All checks were successful
/ test (push) Successful in 2m20s
feat: migrate from woodpecker to forgejo actions
2023-11-28 23:35:23 +01:00
.forgejo/workflows feat: migrate from woodpecker to forgejo actions 2023-11-28 23:35:23 +01:00
cache.example Update cache.example 2022-12-18 22:39:37 +01:00
style Generate standalone SVG 2022-10-14 20:32:58 +02:00
.gitignore Create imagemap, download ALL chaostreffs, variate distance in label placement 2022-10-12 02:43:47 +02:00 fix(sparql): consider P706 "located in" in addition to P361 "part of" 2023-06-01 04:23:45 +02:00
LICENSE License 2022-10-09 02:26:47 +02:00
map.readme.png Update cache.example 2022-12-18 22:39:37 +01:00 Implement rate limiting according to Nominatim Usage Policy 2022-10-27 01:21:38 +02:00
requirements.txt Cleanup 2022-10-08 21:17:31 +02:00


Generate a map for from Wikidata, Nominatim and the Semantic MediaWiki data.


pip3 install -r requirements.txt
export DOKU_CCC_DE_BASICAUTH=username:password
./ --rename 'Frankfurt am Main' 'Frankfurt' --update-erfalist
ls -al out/

Map as generated by this tool


  1. Create a Python virtualenv: python3 -m virtualenv venv
  2. Enable the virtualenv: . venv/bin/activate
  3. Install the dependencies: pip install -r requirements.txt

Instead of following these steps, you could also install the dependencies from your OS' package manager.


For a quick test run, point the script at the cache.example directory:

./ --cache-directory cache.example

This creates the following files in out/:

  • map.svg is the map as a SVG image, with clickable links.
  • map.png is the map as a PNG image.
  • imagemap.html includes map.png, along with a HTML image map that makes the dots and labels clickable.
  • erfamap.html includes map.svg, with map.png and an imagemap as fallback.
  • style/ contains the stylesheet and font.

If the wrong font is used in the PNG, make sure the chosen font is installed on your system. (CairoSVG does not support the use of @font-face in style sheets.)

Usually you'll want to keep the border cache, but renew the Erfa & Chaostreff list from time to time:

./ --update-erfalist

For this, you need to provide the HTTP Basic Auth credentials to via an environment variable:

export DOKU_CCC_DE_BASICAUTH=username:password

A run without cache takes some time as it fetches all data from their sources:

  1. Get a list of countries in Europe and federal states in Germany from Wikidata.
  2. Download all these countries' and states' border shapes from Wikimedia Commons.
  3. Get a list of Erfas & Chaostreffs from the Semantic Mediawiki API.
  4. Resolve all POIs' (Erfas & Chaostreffs) street addresses' to geocoordinates using Nominatim, rate limited to 1 request per second as per Nominatims usage policy.

Use the cache whenevery you don't need to update country borders or hackerspace locations. Otherwise, both Wikidata and Nominatim will start rate limiting pretty quickly. (And caching is actually required by Nominatim's acceptable use policy).


Unless otherwise noted, the contents of this repository are licensed under the MIT License (See LICENSE).


The font contained in style/concertone-regular.ttf was created by Johan Kallas ( and is licensed unter the terms of the SIL Open Font License v1.10.

Geoshape Data

The geoshape data contained in cache.example is in the public domain.