Skip to main content

distance calculation based on ZIP codes and map generation

Project description

PyGeoDb is an Python Interface to OpenGeoDb. It is all about Austrian, German and Swiss Postcodes and City location. It requires Python 2.6. 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 moeglichst vollstaendigen Datenbank mit Geokoordinaten zu allen Orten und Postleitzahlen (bisher: A,B,CH,D und FL).” (OpenGeoDB Wiki) Die Datenbank wird ueberwiegend zur Umkreissuche oder zur (groben) Geocodierung verwendet. In der PHP-Welt wird es fast ausschliesslich mit GeoClassPHP verwendet. Fuer Python gibt es bisher keine weit verbreitete Loesung.

Zusaetzlich hilft PyGeoDb bei der Erstellung zon Postleitzahlen Karten. Dazu werden neben den OpenGeoDb Daten auch Informationen aus Openstreetmap herangezogen.

Entfernungen

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, uebergeben 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 koennen, 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 zurueck 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 ausgeloesst:

>>> 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 natuerlich vorher installiert sein muss. Karten koennen im PDF, PNG, EPS und SVG Format erstellt werden.

http://static.23.nu/md/Pictures/beispiel_leitbereiche.png http://static.23.nu/md/Pictures/plz_einfaerben.png http://static.23.nu/md/Pictures/plz_flaechen.png http://static.23.nu/md/Pictures/plz_deutschland_gebiete.png

Es gibt keine freie Datenquelle zu Groesse und Form der einzelnen Postleitzahlenbereiche. Jedoch kann man sich der Form der Postleitzahlenbereiche annaehern, indem man ein Voronoi-Diagramm erzeugt. Dies weicht im Detail zwar deutlich von den realen Postleitzahlenbereichen ab, reicht aber fuer 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.

Eine Deutsche Postleitzahlenkarte erstellt man beispielsweise mit dem Kommando:

$ python ./plz_draw --borders --frontier \
--acol=4:#f00 --acol=3:#0f0 --acol=2:#00f \
--acol=1:#ff0 --acol=0:#f0f --acol=5:#0ff \
--acol=6:#07f --acol=7:#f70 --acol=8:#7f7 \
--acol=9:#70f test.pdf

$ python ./plz_draw --frontier --borders \
--acol=42859:#f00 --acol=428:#0f0 --acol=42:#00f \
test.pdf

Autoren

Der urspruengliche 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 fuer die Polstleitzahlenbereiche 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 & Vermischtes

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.

Wenn Sie einen Fehler bemerken, melden Sie Ihn bitte unter http://github.com/mdornseif/pyGeoDb/issues

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyGeoDb-1.1.tar.gz (1.4 MB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page