Distanzen zwischen PLZ

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…

Polygon von Wil SG / 9500

Skript-Ausgabe, wenn man 1004 Lausanne und 8050 Zürich nimmt:

plz1: 1004
plz2: 8050
dist_mitte_bbox_meter: 176511.8
dist_centroid_meter: 176860.8
dist_polygone_minimal_meter: 174368.2

Hektarrasterzellen zu Postleitzahlen

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.

Erstmal brauchen wir wieder Daten:

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.

polygone-plz-plus-layers

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:

PLZ-Polygone und Hektarrasterzellen als Punkte.
PLZ-Polygone und Hektarrasterzellen als Punkte.

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:

PLZ-Polygone und Hektarrasterzellen als Polygone.
PLZ-Polygone und Hektarrasterzellen als Polygone. Grossraum Zürich.

Ein Kartenausschnitt zeigt es noch deutlicher, dass die Punkte jetzt Polygone mit scharfen Grenzen sind:

Kartenausschnitt Zürich Hardbrücke, PLZ und Hektarrasterpolygone.
Kartenausschnitt Zürich Hardbrücke, PLZ und Hektarrasterpolygone.

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.

Selektion von Hektarrasterzellen nach Postleitzahl jetzt möglich.
Selektion von Hektarrasterzellen nach Postleitzahl jetzt möglich.

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).

Hier die beiden R-Skripte:

Your Mileage May Vary 🙂

Grenznäheberechnung (mit R-Skript)

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):

Luftlinien-Entfernung zur Grenze in Metern
Luftlinien-Entfernung zur Grenze in Metern

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 Daten kommen vom Bundesamt für Statistik: STATPOP2013 und von Swisstopo: SwissBoundaries3D.

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:

Bevölkerung in Grenznähe (absolute Zahlen)
Bevölkerung in Grenznähe (absolute Zahlen)

Mehr als 1.5 Mio Menschen leben in weniger als 5km Entfernung (Luftlinie) zur Grenze.

Bevölkerung in Grenznähe, relativ und kumuliert
Bevölkerung in Grenznähe, relativ und kumuliert

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.