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

Uploaded Source

File details

Details for the file pyGeoDb-1.1.tar.gz.

File metadata

  • Download URL: pyGeoDb-1.1.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pyGeoDb-1.1.tar.gz
Algorithm Hash digest
SHA256 020b8b7ea91b56a1b1c71cf3bb45f2c5763e12e59a1be4dab530275a6acfd03d
MD5 b5b1087f8b4c8d56ef4f5d0bb85d09f3
BLAKE2b-256 d7f746ef4db894e970c0d9fdf320720b4f9efc34e6c5faa39a5d8a7b427ecebf

See more details on using hashes here.

Supported by

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