[Blog] Mitgliederverteilung datenschutzkonform auf Openstreetmap anzeigen
von Dennis am .
Grundsätzliche Überlegung:
Es wäre doch schön, wenn wir mit vorhandenen Daten weiterarbeiten könnten.
Um eine Genossenschaft und ihre Mitglieder zu verwalten, werden einige Daten benötigt. Um Beitrittserklärungen zu bestätigen, Mietvorverträge abzuschließen, Genossenschaftsanteile genau zuzuordnen, uvm.
Anhand dieser Daten lässt sich z.B. erkennen, dass viele, die ins ecovilage ziehen wollen, aktuell noch gar nicht in Hannover wohnen. Tatsächlich ist das Mitglied mit der weitesten Entfernung sage und schreibe 7054km Luftlinie von unserem zukünftigen ecovillage entfernt. Bei inzwischen fast 900 Mitgliedern ist es spannend die Verteilung genauer zu betrachten. So kam z.B. die Idee auf, eine Übersicht zu erstellen, wo in der Welt sich unsere Genossenschaftsmitglieder verteilen.
Doch wenn es um Daten geht, geht es auch immer um Datenschutz.
Um die Privatsphäre zu schützen, gilt es hierbei zu bedenken, dass wir nicht auf den Meter genau darstellen, wo ein Mitglied wohnt.
Geohash?
Für eine nicht zu detailierte Ortung wäre “geohash” genau das richtige Instrument. Hierbei wird keine exakte Koordinate als einzelner Punkt definiert, sondern ein ganzer rechteckiger Bereich. Die Größe bzw. Detailstufe ist hier anpassbar, so, dass der Grad der Anonymisierung sehr flexibel ist.
Beispielsweise würde man hiermit den ganzen Georgengarten anzeigen, statt der Büste in der Mitte des Leibniztempels. Oder eben ein 100m x 100m Feld, statt eine exakte Wohnadresse.
So praktisch die Idee auch ist, dieses Format ist leider nicht weit verbreitet. Dementsprechend gibt es dadraußen auch keine große Auswahl an Optionen für das Einbinden in Webseiten.
GPX
Anders sieht es da aus mit dem “GPS Exchange Format” aka “GPX”: Ein Datenformat zur Speicherung von Geodaten. In diesem Format können sowohl ganze Routen und Tracks, aber auch einzelne Wegpunkte - sogenannte “Waypoints” - abgelegt werden. Diese Information wird mit Längen- und Breitengraden angegeben. Da wir aber keine exakte Wohnadressen veröffentlichen wollen, lassen wir einfach die Hausnummer weg. Nur die Straße und Postleitzahl zu nutzen, erscheint uns auf der einen Seite anonym genug und auf der anderen Seite detailiert genug um einen guten Überblick zu bekommen, wo sich unsere Mitglieder in der Welt verteilen.
Um “Straße, Postleitzahl, Ort” in “Breiten- und Längengrad” umzuwandeln, wird die openstreetmap Suche bemüht. In einem Bash-Script automatisiert, sieht das in etwa so aus:
#! /bin/bash
# Eingabedateiname
infile="adressenliste.csv"
# Ausgabedateiname
outfile="koordinaten.gpx"
# Generiere GPX Header
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>" > "$outfile"
echo "<gpx creator=\"ecovillage hannover eG\">" >> "$outfile"
# Zähle Anzahl der Adresseinträge
countall=`wc -l < "$infile"`
echo ""
echo "------------------------------------"
echo ""
# Schleife über die Adressenliste, dabei die erste Zeile auslassen
tail -n +2 "$infile" | while read j || [[ -n $j ]];
do
# Zähler
count=$((count + 1))
# Straße
addr1=`echo $j | cut -d, -f7`
# PLZ
addr2=`echo $j | cut -d, -f8`
# Wohnort
addr3=`echo $j | cut -d, -f9`
# Filter "OT" aus Wohnort (z.B. Erlangen OT Binsen)
addr3=${addr3// OT / }
# Filter Postfächer und "c/o" Adressen
if [[ $addr1 == *"ostfach"* ]] || [[ $addr1 == *"c/o"* ]] || [[ $addr1 == *"ZBS"* ]]; then
addr1=``
fi
# Generiere kompletten Address-String
addr="${addr1// /%20},${addr2// /}%20${addr3// /%20}"
# Abfrage der Längen- und Breitengrade zur Adresse
latlon=`curl -s -L "https://nominatim.openstreetmap.org/search?format=jsonv2&limit=1&addressdetails=1&q=$addr" | jq -r '"\(.[0].lat),\(.[0].lon)"'`
# Längengrad
coordinatesL=`echo ${latlon// /%20} | cut -d, -f1`
# Breitengrad
coordinatesB=`echo ${latlon// /%20} | cut -d, -f2`
# Breche ab, wenn Adresse nicht gefunden werden kann
if [[ $coordinatesL == *"null"* ]]; then
echo "Error - quit on adress: ${addr//%20/ }"
exit
fi
# Generiere GPX Einträge zu diesen Daten
echo "($count/$countall)" $addr1, $addr2 $addr3 - $coordinatesL $coordinatesB
echo "<wpt lon=\""$coordinatesB"\" lat=\""$coordinatesL"\">" >> "$outfile"
echo "<name>$addr1, $addr2 $addr3</name>" >> "$outfile"
echo "<desc>$addr1, $addr2 $addr3</desc>" >> "$outfile"
echo "<sym></sym>" >> "$outfile"
echo "</wpt>" >> "$outfile"
# Ende der Schleife
done
# GPX Footer
echo "<extensions/>" >> "$outfile"
echo "</gpx>" >> "$outfile"
# Ende
exit
Automagisch [SIC!] werden hier auch gleich Leerzeichen angepasst und Filter gesetzt, etc. Ergebnis ist eine GPX-Datei mit allen Waypoints die nur auf die Straßen, aber nicht auf einzelne Hausnummern verweisen. Dies ist die Basis für das weitere Vorgehen.
Darstellung auf der Webseite
Proxy für Map-Tiles (Kartendaten)
Neben dem “Verschleiern” der exakten Adressen, wollen wir aber auch nicht das Surfverhalten an fremde Server durchreichen, wenn man sich die Karte anschaut. Denn, die Nutzung von extern eingebundenen Kartendiensten führt dazu, dass die Betrachter:innen eine Verbindung zu diesen entfernten Servern aufbauen und somit auch, dass die Nutzung dort “getrackt” werden kann.
Dies kann man vermeiden.
Statt direkt eine Verbindung von deinem PC zum Kartendienst im Internet aufzubauen, nutzen wir einen sogenannten Proxy-Dienst als “Zwischenstation”. Ein Proxy vermittelt Daten bzw. Kommunikation in beide Richtungen, ohne, dass die Beteiligten sich gegenseitig sehen/erkennen können.
Somit ist ein Proxy eine Art “Treuhandservice”.

Hierfür stellen die Macher hinter dem Projekt “openstreetmap” ein PHP-Script zur verfügung, mit dem dies einfach umzusetzen ist: -> link
Nach ein wenig recherche findet man allerdings auch weitere Varianten mit mehr Optionen, wie z.B. referer-Filter, so, dass der Proxy nur von unserem Server aus genutzt werden kann und nicht von anderen Webseiten im Netz.
Wir bedienen uns daher an diesem Projekt: -> Link Backup-Link
Da dort alles gut erklärt ist, verzichten wir hier darauf.
GPX-Viewer
Hierbei bedienen wir uns einem fertigen Projekt von folgender Webseite: -> Link
Rechts im Menü findet man den Download.
Wir benötigen in erster Linie das Unterverzeichnis “GM_Utils”.
Für die Verwendung unseres eigenen Proxys muss die datei “/GM_Utils/osmutils.js” angepasst werden.
Z.B. für die Verwendung von “osm” wäre dies in der Version 6.16 in Zeile 37:
this.baseLayers["OSM"] = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
Mit weiteren Tileservern können Änderungen analog zu dieser Änderung vorgenommen werden.
Da wir nun die Betrachter:innen unserer Karte nicht mehr auf einen anderen Server weiterleiten, kann auch die Datenschutzwarnung deaktiviert werden. Zusammen mit weiteren Optionen passiert dies durch das Setzen passender Variablen direkt im Viewer, der z.B. per HTML eingebunden wird:
<!DOCTYPE html>
<html lang="de">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="utf-8">
<title>GPXViewer Beispiel</title>
<style>
.m {
width: 500px;
height: 300px;
margin:20px;
display:inline-block;
vertical-align:top;
resize: both;
overflow: scroll;
border:1px solid black;
}
</style>
</head>
<body>
<h1>GPXViewer Beispiel - kleine Karte, die vergrößert werden kann</h1>
<div class="m gpxview:koordinaten.gpx:osm">
<noscript>
<p>Zum Anzeigen der Karte wird Javascript benötigt.</p>
</noscript>
</div>
<hr>
<script>
var Legende = false;
var Fullscreenbutton = true;
var Showmaptypecontroll = false;
var Wpcluster = true;
var Bestaetigung = false;
var Mapapi = osm;
</script>
<script src="GM_Utils/GPX2GM.js"></script>
</body>
</html>
GPX-Viewer ist ein mächtiges Tool mit vielen Optionen