
Wie man mit einfachen Regeln Evolution mit dem Computer simulieren kann.
Dynamische Landkarten in Webseiten verwenden
Mit der Datenschutz-Grundverordnung (DSGVO) hat die Europäische Union ein bürokratisches Instrument geschaffen, dem wir unter anderem seitenlange Cookie-Dialoge auf Webseiten und Datenschutzerklärungen in Buchlänge zu verdanken haben. Vereinfacht ausgedrückt verbietet die DSGVO die Übermittlung personenbezogener Daten an Server ohne ausdrückliche Einwilligung des Nutzers. Der Begriff "personenbezogene Daten" wird dabei so eng ausgelegt, dass bereits eine IP-Adresse darunter fällt.
Das ist ein Problem, wenn man eine Karte des Open-Streetmap-Projektes in eine Webseite einbinden möchte. Dabei handelt es sich um eine gemeinnützige Organisation, die Kartenmaterial unter einer freien Lizenz zur Verfügung stellt. Die Karten, die von Freiwilligen erstellt werden, sind sehr gut und gehören zu den besten verfügbaren Landkarten, was Detailgrad und Genauigkeit betrifft.
Das Kartenmaterial wird in Form von Kacheln von einem sogenannten Tileserver bereitgestellt. Dieser liefert auf Anfrage die Kacheln für die darzustellende Region in der gewünschten Zoomstufe. Dabei handelt es sich um Bilddateien, die in der Regel 256x256 Pixel groß sind. Das Problem ist nun, dass nach der DSGVO die Verbindung zum Server nicht automatisch aufgebaut werden darf, weil dabei die IP-Adresse übertragen werden muss.
Um der DSGVO gerecht zu werden müsste man ein Kartenapplet so programmieren, dass es zunächst gar nichts oder eine zuvor lokal erstellte Karte als Bild anzeigt mit einer Bitte der Datenübertragung zuzustimmen. Zusätzlich sollte man als Webseitenbetreiber einen "Auftragsverarbeitungsvertrag" (AVV) mit dem Betreiber des Tileservers abschließen, um die notwendige Datenübertragung juristisch zu legitimieren. Doch niemand, der einen Tileserver kostenfrei betreibt, möchte sich dieser Bürokratie aussetzen und damit auch noch juristisch angreifbar machen.
Alternativ könnte man auf eigene Kosten einen Tileserver betreiben, dessen einzige Aufgabe es dann sein könnte 24 Stunden täglich zu laufen, um den Anfahrtsweg zu einer Bäckerei auf derern Webseite anzuzeigen. In diesem Fall keine Datenübertragung zu Dritten statt, weshalb die Pflichten der DSGVO nicht greifen würden.
Die einzige realistische und benutzerfreundliche Lösung ohne laufende Kosten ist das lokale Vorhalten aller in der Karte verwendeten Tiles auf dem eigenen Webserver. Die hier beschriebene Lösung ist so implementiert, dass keine Cookies gesetzt, keine Einwilligungen eingeholt und keine Hinweise in der Datenschutzerklärung erfolgen müssen. Es handelt sich um eine Lösung ohne Kommunikation mit anderen Servern, die komplett lokal auf dem eigenen Webserver läuft. Ich stelle dafür auf GitHub ein Paket bereit, in dem sich die für die DSGVO konforme Verwendung von OpenStreetMap-Karten notwendigen Javascript Module, sowie Kommandozeilenprogramme zum herunterladen von Tiles von einem lokalen Server befinden.
Vor der Verwendung des Kartenmoduls müssen die notwendigen Kacheln der Karte für alle gewünschten Zoomstufen erstellt und in einer Form abgelegt werden, dass sie von diesem verwendet werden können. Zu diesem Zweck verwenden wir einen lokal installierten Tileserver. Dieser Server wird nur für die Erstellung der Tiles benötigt. Für die Verwendung der Karte auf der Webseite ist er später nicht notwendig.
Am einfachsten wäre es, die Kacheln direkt vom Tileserver des OpenStreetMap-Projekts herunterzuladen. Das verstößt allerdings gegen die Tile Usage Policy des Projektes, weil dabei dessen Server unnötig belastet würden. Ein direkter Download großer Mengen an Kacheln wird aus diesem Grund blockiert und führt zur Sperrung der verwendeten Software. Auf den Seiten des Projektes heißt es zu solchen unerwünschten Massendownloads:
Als Massendownload („Scraping“) bezeichnet man das Herunterladen von Kacheln im Voraus, anstatt sie erst dann herunterzuladen, wenn der Nutzer die Kacheln ansieht. Übliche Beispiele sind das Erstellen eines Kachelarchivs oder das Herunterladen für die Offline-Nutzung. Massendownloads sind verboten. Diese Kacheln werden im Allgemeinen nicht im Voraus auf dem Server zwischengespeichert und müssen speziell für diese Anfragen gerendert werden, was eine ungerechtfertigte Belastung der verfügbaren Ressourcen darstellt.
Aus diesem Grund gibt es auch keine funktionierende Software für den automatisierten Tile-Download von Servern des OpenStreetMap Projektes. Die Kacheln müssen anstelle dessen mit einem eigenen, lokalen Tileserver erzeugt werden.
Die Einrichtung eines solchen Servers ist nicht ganz einfach, aber machbar. Die im Folgenden verlinkten Anleitungen beschreiben, wie dies auf einem Ubuntu 24.04 bzw. 22.04 LTS-System funktioniert. Es ist zu beachten, das es auf einem normalen PC infolge des begrenzten Speicherplatzes nicht möglich sein wird eine komplette Weltkarte zu speichern. Aus diesem Grund muß man sich bei der Installation auf einen kleineren Bereich beschränken. Entsprechende Daten im osm.pbd Format sollte man sich vorher von der Seite https://download.geofabrik.de/ besorgen und die folgenden Anleitungen entsprechend abwandeln:
Wenn man der Anleitung folgt, dann sollte beim Aufruf der URL http://127.0.0.1/sample_leaflet.html eine interaktive Karte im Browser zu sehen sein. Im hier gezeigten Beispiel wurden die Kartendaten für Sachsen installiert.
Der lokale Tileserver kann nun verwendet werden um ohne Einschränkungen Kacheln zu erzeugen. Zu diesem Zweck stelle ich im Archiv
osm-map-bundle auf GitHub
das Python-Skript tile_downloader.py
zur Verfügung. Es ermöglicht das Herunterladen von Kartentiles von einem lokalen Server
für einen definierten geographischen Bereich und mehrere Zoomstufen. Es speichert die Tiles lokal in der
OpenStreetMap typischen Verzeichnisstruktur.
Parameter | Beschreibung |
---|---|
--min-lat | Minimaler Breitengrad des Bereichs. Gibt die südliche Grenze des geografischen Bereichs an, für den die Tiles heruntergeladen werden (Standard: 50.8592). |
--max-lat | Maximaler Breitengrad des Bereichs. Gibt die nördliche Grenze des geografischen Bereichs an, für den die Tiles heruntergeladen werden (Standard: 51.0824). |
--min-lon | Minimaler Längengrad des Bereichs. Gibt die westliche Grenze des geografischen Bereichs an, für den die Tiles heruntergeladen werden (Standard: 13.2701). |
--max-lon | Maximaler Längengrad des Bereichs. Gibt die östliche Grenze des geografischen Bereichs an, für den die Tiles heruntergeladen werden (Standard: 13.4488). |
--zoom | Liste der Zoomstufen, die heruntergeladen werden sollen. Akzeptiert mehrere Werte, z. B. "11 12 13". Standard: 11–17. |
--output | Verzeichnis, in dem die heruntergeladenen Tiles gespeichert werden. Die Verzeichnisstruktur basiert auf Zoomstufe, X- und Y-Koordinaten (Standard: ./dist/osm_tiles ). |
--url-template | URL-Template für den Tile-Server. Platzhalter {z} , {x} und {y} werden durch Zoomstufe und Kachelkoordinaten ersetzt (Standard: http://127.0.0.1/hot/{z}/{x}/{y}.png ). |
python tile_downloader.py \
--min-lat 50.0 \
--max-lat 51.0 \
--min-lon 13.0 \
--max-lon 14.0 \
--zoom 11 12 13 \s
--output ./osm_tiles
Im Ergebnis werden die Kacheln im Verzeichnis ./osm_tiles
abgelegt. Aus Platzgründen werden die Tiles im Webp Format gespeichert.
Dieses Verzeichnis kann dann, von einem auf der Webseite eingebundenen Kartenmodul verwendet werden.
Die Einbindung der Karte erfolgt durch laden der Datei osm-map-bundle.js
und Initialisierung des Kartenmoduls. Dieses Modul kann
neben der Karte noch mehrere GPX-Tracks und eine Liste mit "Points of Interest" anzeigen. Das Modul ist ein Wrapper für die OpenLayers
Bibliothek, das die Kartenerstellung vereinfacht aber bei weitem nicht den Funktionsumfang von OpenLayers hat.
Zum Einblenden der Karte in einer HTML Seite muss zunächst ein Container angelegt werden, die Open layers Stylesheets eingebunden und das paket osm-map-bundle.js geladen werden.
<div id="map" style="height:750px; width:750px;"></div>
<link rel="stylesheet" href="ol.css" />
<script src="osm-map-bundle.js"></script>
Nach dem laden des osm-map-bundle kann die Karte Initialisiert werden:
<script>
const map = new OsmMap.OsmMap('map');
map.setView([50.963785, 13.343821], 10, 16, 15);
map.addTileLayer('./osm_tiles/{z}/{x}/{y}.png');
// Add GPX layers
map.addGpxLayer('rothschönberger-stolln.gpx', '#f00', 4);
map.addGpxLayer('kurprinzkanal.gpx', '#55f', 2);
var jsonStyles = {
'PointMarker': new OsmMap.AnnotatedPointStyle('#ff0')
};
var jsonData = {
"type": "FeatureCollection",
"crs": {
"type": "name",
"properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" }
},
"features": [
{
"type": "Feature",
"properties": {
"name": "7. Lichtloch",
"type": "PointMarker"
},
"geometry": {
"type": "Point",
"coordinates": [13.343821, 50.963785]
}
},
{
"type": "Feature",
"properties": {
"name": "8. Lichtloch",
"type": "PointMarker"
},
"geometry": {
"type": "Point",
"coordinates": [13.348811, 50.958655]
}
}
]
};
map.addJsonLayer(jsonData, jsonStyles);
</script>
Das Kartenmodul würde einem normalen Tileserver verwenden, wenn man in der Konfiguration kein lokales Kachelverzeichnis angibt. In diesem Fall wäre es allerdings nicht mehr DSGVO konform und der Benutzer würde sich in Deutschland dem Risiko von Abmahnungen aussetzen.