distance calculation based on ZIP codes and map generation
Project description
PyGoeDb is an Python Interface to OpenGeoDb. It is all about Austrian, German and Swiss Postcodes and City location. The rest of this documentation is in german Language.
Die ist ein Python Interface zu OpenGeoDb. “Im Mittelpunkt des Projektes OpenGeoDB steht der Aufbau einer möglichst vollständigen Datenbank mit Geokoordinaten zu allen Orten und Postleitzahlen (bisher: A,B,CH,D und FL).” (OpenGeoDB Wiki) Die Datenbank wird überwiegend zur Umkreissuche oder zur (groben) Geocodierung verwendet. In der PHP-Welt wird es fast ausschliesslich mit GeoClassPHP verwendet. Für Python gibt es bisher keine weit verbreitete Lösung.
Zusätzlich hilft PyGeoDb bei der Erstellung zon Postleitzahlen Karten. Dazu werden neben den OpenGeoDb Daten auch Informationen aus Openstreetmap herangezogen.
Nutzung
Entfernungsberechnung
PyGeoDb kann die Entfernung in Metern zwischen zwei Postleitzahlenbereichen berechnen. Dazu kann direkt eine Postleitzahl als String, ein dict, oder ein Objekt, dass dem AddressProtocol entspricht, übergeben werden:
>>> import pygeodb >>> pygeodb.distance("42897", "50933") # Strings 38131 >>> pygeodb.distance({'plz': "42897"}, {'plz': "48143"}) # dicts 90478 >>> class LocationObject(object): pass >>> loc = LocationObject() >>> loc.plz = "50933" >>> pygeodb.distance(loc, "48143") # Objekte 124737
Sortieren nach Entfernung
pyGeoDb kann eine Liste von Postleitzahlen nach der Entfernung zu einer bestimmten Postleitzahl sortieren. Dabei können, Strings sowie Dicts und Objekte nach dem AddressProtocol gemischt werden:
>>> pygeodb.nearest("42897", ["42477", "48143", {'plz': "45149"}, loc]) #doctest: +ELLIPSIS ['42477', {'plz': '45149'}, <__main__.LocationObject object ...>, '48143']
Wenn es relevant ist, wie weit die verschiedenen Postleitzahlen entfernt sind, kann auch dies mit zurück gegeben werden:
>>> pygeodb.distances("42897", ["50933", "42477", "48143", "45149", "42897"]) [(0, '42897'), (7200, '42477'), (34466, '45149'), (38131, '50933'), (90478, '48143')]
Fehlerbehandlung
Wenn eine Postleitzahl unbekannt ist, wird eine ValueError() Exception ausgelößt:
>>> pygeodb.distance("42897", "99999") # Strings Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: Unknown PLZ: DE-99999
Kartengeneriertung
pyGeoDb kann Postleitzhalenkarten generieren. Dazu kommt die Graphikbibliothek Pycairo zum Einsatz, die natürlich vorher installiert sein muss. Karten können im PDF, PNG, EPS und SVG Format erstellt werden.
Es gibt keine freie Datenquelle zu Grösse und Form der einzelnen Postleitzahlenbereiche. Jedoch kann man sich der Form der Postleitzahlenbereiche annähern, indem man ein Voronoi-Diagramm erzeugt. Dies weicht im Detail zwar deutlich von den realen Postleitzahlenbereichen ab, reicht aber für Visualisierungsaufgaben aus. Zur Erzeugung des Graphen, der die Postleitzahlenbereiche unterteilt, wird der “Fortune Algorithmus” werwendet.
Rufen Sie ./plz_draw –help auf, um die Aufrufparameter angezeigt zu bekommen. Beispieldateien kann man durch das Kommando make maps erstellen - die entsprechenden kommandos finden sich in der Datei Makefile unten.
Autoren
Der ursprüngliche Entfernungsberechnungscode wurde in 2007 von Christian N Klein entwickelt. Die Voronoi Berechnung basiert auf Code von Steve Fortune, der von Shane O’Sullivan in C++ und dann von Bill Simons in Python konvertiert wurde.
Die Datengrundlage für die Polstleitzahlebereiche stammt vom OpenGeoDb Projekt. Die Deutschen grenzen stammen aus Openstreetmap Project Germany.
Die Kartengenerierung stammt von Maximillian Dornseif und basiert auf seinem Projekt zipdecode.de, dass auf Code aus Ben Frys Buch Visualizing Data beruht.
Alternativen & Quellen
d9t.gis ist ein sehr Zope-Lastiges Python Projekt zur Entfernugnsberechnung mit OpenGeoDb Daten.
Es gibt jede Menge Online-Distanzberechnungsdienste, z.B:
Umfangreiche Informationen zum deutschen Postleitzahlensystem inklusive freier Rasterkarten gibt es bei Wikipedia.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.