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:
- Shape-Files (Polygone) der Postleitzahlen: https://www.cadastre.ch/de/services/service/registry/plz.html
- Die Daten vom BfS: STATPOP2013
- (edit 2019: bzw. STATPOP2018)
- Für eine angereicherte Kartendarstellung kann man noch OSM-Daten dazunehmen im GIS, z.B. von geofabrik.de: http://download.geofabrik.de/europe/switzerland.html
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).
Hier die beiden R-Skripte:
Your Mileage May Vary 🙂