Ich wurde letzte Woche von einer HSG-Doktorandin angefragt, ob ich denn ein Skript wüsste, was zwischen PLZ-Gebieten in CH die Distanz berechnet. Sie hatte meinen Eintrag zu Hektarrasterzellen zu Postleitzahlen gefunden. Weil ich grad Lust hatte, mal zu schauen, was inzwischen für offizielle Daten so frei verfügbar sind oder ob die alle noch da sind, hab ich’s mal eben programmiert: https://github.com/datacyclist/CH-plz-distance Es ist tatsächlich nicht viel Code geworden und da sind sogar schon drei Distanzen drin:
Abstand der Mittelpunkte der Bounding Boxes der PLZ
Abstand der Zentroide der PLZ-Polygone und
minimaler Abstand der Polygone (d.h. bei räumlich benachbarten PLZ =null)
Fun fact 1: Da könnte man sogar ein Rätsel draus machen, wer die meisten PLZ-Polygone erkennt (es sind über 4000), also die Gemeinde dazusagen kann 🙂
Fun fact 2: die x000-PLZ haben keine Polygone und mein Skript hat eh keine Fehlerbehandlung drin.
Fun fact 3: man schaut sich natürlich naheliegende PLZ zuerst an und stellt fest, dass nicht mal einzelne PLZ räumlich zusammenhängend sein müssen. Aber hey… AI, FR, OW, SO…
Skript-Ausgabe, wenn man 1004 Lausanne und 8050 Zürich nimmt:
Der Titel klingt ähnlich wie Schwerter zu Pflugscharen, aber technisch geht’s nur darum, die knapp 340’000 Hektarrasterzellen vom BfS (mit Bevölkerung/Haushalten) bestimmten Postleitzahlen zuzuordnen. Sicher gibt’s die Zuordnung schon irgendwo, aber man kann sie ja auch berechnen. Ein Anwendungsfall wäre, dass man pro Postleitzahl die Bevölkerung ausrechnen möchte, aber nur die Zählung pro Hektarrasterzelle hat. Ein weiterer Anwendungsfall, etwas allgemeiner: ich möchte für einen beliebigen Flächenumriss wissen, wieviele Leute dort wohnen, das könnten also auch Gemeindegrenzen, Kantonsgrenzen, Verkaufsgebiete o.ä. sein.
Damit lässt sich schon mal eine Karte der PLZ erstellen. Im QGIS sind das drei Layer: PLZ-Polygone, Wasserwege und Bahnlinien, bisschen Transparenz, passende Farben, fertig.
Dazu kommen dann die BfS-Hektarrasterzellendaten z.B. aus STATPOP, wie bereits hier schon verlinkt: Grenznäheberechnung mit R. Erstmal gucken wir uns die Hektarrasterzellendaten im GIS an und stellen ein Problem fest:
Die Hektarrasterzellen sind aber Zellen von 100x100m, also geometrische Flächen, keine Punkte. Dementsprechend ungeeignet sind sie für die Berechnung eines Verschnitts von HR-Zellen und Postleitzahl-Polygonen. Eine Umwandlung der Hektarraster-Punkte in Hektarraster-Polygone ist notwendig. “Klingt komisch, is aber so”, um es mal mit der Sendung mit der Maus zu sagen.
Nach ein bisschen Berechnung und Umwandlung (auch in R, kombiniertes Skript s.u.) sieht die Karte schon viel schöner aus:
Ein Kartenausschnitt zeigt es noch deutlicher, dass die Punkte jetzt Polygone mit scharfen Grenzen sind:
Jetzt sind die PLZ-Polygone und die Hektarrasterzellen-Polygone in der Form, die es braucht, um eine Überschneidung zu berechnen. Da treten wieder zwei Fälle auf: einerseits kann eine HR-Zelle vollständig in einer Postleitzahl liegen; andererseits kann sie zu mehreren PLZ gehören. Der Einfachheit halber wird am Ende also eine Tabelle ausgegeben, die zu jeder HR-Zelle eine Postleitzahl aufführt und den Zugehörigkeitsgrad zu dieser PLZ. Den flächenmässigen Verschnitt habe ich nicht weiter berücksichtigt. D.h. wenn eine HR-Zelle sich mit drei PLZ überschneidet, dann bekommt sie einen Zugehörigkeitsgrad von jeweils 1/3 zu jeder der PLZ.
Für die Berechnung des Verschnitts gibt es die R-Funktion “over” aus dem allseits bekannten sp-package. Die scheint nicht besonders effizient zu sein oder es dauert einfach ziemlich lange. Aber mit Parallelisierung geht’s wiederum in akzeptabler Zeit und auch hier muss man das ja nicht permanent neu berechnen, sondern macht es nur einmal.
Eine Beispielausgabe des Skripts kann jetzt so aussehen: CSV-File (Sample). RELI der HR-Zelle, PLZ, Zugehörigkeitsgrad und als Zahlenbeispiel die Totalbevölkerung der Zelle (gewichtet und ungewichtet).
Alle reden immer vom Einkaufstourismus und dass ja viele Schweizer grenznah wohnen. Das kommt natürlich drauf an, wie man Grenznähe definiert. Wenn man die Luftlinie verwendet, kann man das relativ einfach in R berechnen, mit frei verfügbaren Daten. Das Ergebnis sieht dann beispielsweise so aus (Darstellung in QGIS):
Jetzt könnte man das Gleiche noch mit Fahrzeiten entlang der Strassen oder Bahnlinien machen, nur dafür ist es nicht so ganz trivial zu berechnen, weil man dann statt einfacher Luftlinien-Entfernungen zwischen Koordinaten ein echtes Routing machen muss.
Die Berechnungsroutine kommt von mir: https://github.com/datacyclist/CH-plz-distance/blob/main/04-hektarraster-distanz-grenze-parallelisiert.R. Hoffe, das ist halbwegs gut kommentiert. Einfach in ein Verzeichnis, dann noch die entsprechenden Dateien vom BfS dazu und die Grenze (shape-File), fertig. Es rechnet eine Weile. Auf einem halbwegs aktuellen PC mit entsprechender Parallelisierung (4 Cores z.B., im Skript anpassbar) etwa eine Stunde. Genug Zeit, um zwischendurch mal die Limmat rauf und runter zu schwimmen 🙂
Mit ein paar Auswertungen kann ich auch dienen:
Mehr als 1.5 Mio Menschen leben in weniger als 5km Entfernung (Luftlinie) zur Grenze.
Anteilig: 20% in weniger als 5km Grenzentfernung. Etwa die Hälfte hat weniger als 20km Entfernung. Da sind sicher noch etliche Sachen, die man bereinigen könnte, beispielsweise den Bodensee oder den Genfersee oder halt auch Täler im Wallis. Die sind zwar schnell an der Grenze, aber auf der anderen Seite sind auch nur Berge. Wenn man jetzt was mit Einkaufstourismus rechnen wollte, käme man da in die Bredouille.