Package: pyGeoDb
PyGeoDb is an Python interface toOpenGeoDb. It is all about Austrian, German
and Swiss postcodes (ZIPs) and city locations. It requires Python 2.6.
The rest of this documentation is in German language. Probably you can extend
the system to US data by integrating US data as used in Ben Fry’szipdecode.You can download the latest release athttp://pypi.python.org/pypi/pyGeoDb/#, development releases are available athttp://github.com/mdornseif/pyGeoDb#.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 zurUmkreissucheoder zur
(groben) Geocodierung verwendet. In der PHP-Welt wird es fast ausschliesslich
mitGeoClassPHPverwendet. 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.EntfernungenEntfernungsberechnungPyGeoDb kann die Entfernung in Metern zwischen zwei Postleitzahlenbereichen
berechnen. Dazu kann direkt eine Postleitzahl als String, ein dict, oder ein
Objekt, dass demAddressProtocolentspricht, 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
124737Sortieren nach EntfernungpyGeoDb 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')]FehlerbehandlungWenn 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-99999KartengeneriertungpyGeoDb kann Postleitzalenkarten generieren. Dazu kommt die GraphikbibliothekPycairozum Einsatz, die natuerlich vorher installiert sein muss. Karten
koennen imPDF,PNG, EPS und SVG Format erstellt werden.Es gibt keine freie Datenquelle zu Groesse und Form der einzelnen
Postleitzahlenbereiche. Jedoch kann man sich der Form der
Postleitzahlenbereiche annaehern, indem man einVoronoi-Diagrammerzeugt.
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--helpauf, um die Aufrufparameter angezeigt zu
bekommen. Beispieldateien kann man durch das Kommandomake mapserstellen -
die entsprechenden Kommandos finden sich in der Datei Makefile, unten.Eine deutsche Postleitzahlenkarte erstellt man beispielsweise mit folgenden
Kommandos:# Deutschlandkarte mit Postleitzahlenbereichen
$ python ./plz_draw --borders --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.pdfOder:# 42859 und darueberliegende Bereiche markieren
$ python ./plz_draw --borders --acol=42859:#f00 --acol=428:#0f0 \
--acol=42:#00f test.pdfMan kann stattdessen auch die Mittelpunkte der Postleitzahlengebiete markieren.
Dabei gibt man mit-c 250die grösse der Punkte an:python ./plz_draw --borders --cencol=52:#f00 --cencol=50:#00f --cencol=10:#0f0 -c 250 maps/centercolors.pngNatürlich kann man das auch alles mischen:python ./plz_draw --borders --acol=40:#ff0 --acol=42:#0ff --acol=45:#0f0 --cencol=52:#f00 --cencol=50:#00f --cencol=10:#0f0 -c 300 -mBielefeld maps/manycolors.pngMan kann auf der Karte Ortsnamen anzeigen lassen. Wenn ein Ort mehrere
Postleitzahlen hat, wird der Ortsname am gemittelten Zentrum der verschiedenen
Postleitzahlenbereiche gezeichnet. Eine Karte mit dem meissten deutschen
Grossstaedten erhaelt man mit folgendem Kommando:python ./plz_draw -mBerlin -mHamburg -mStuttgart -mDortmund -mBremen
-mHannover -mLeipzig -mDresden -mBielefeld -mMannheim -mKarlsruhe
-mAugsburg -mChemnitz -mKiel -mHalle -mMagdeburg -mErfurt -mRostock
-mKassel -mPaderborn -mRegensburg -mWolfsburg -mBremerhaven -mIngolstadt
-mUlm -mKoblenz -mTrier -mSiegen -mJena -mCottbus '-mFreiburg im Breisgau'
'-mFrankfurt am Main' test.pdfDie Eigabe der Staedtenamen mit Umlauten ist je nach Konfiguration des
Betriebssystems problematisch. Auch lassen sich diese in dieser Hilfedatei
nicht problemlos darstellen. Sie koennen die Parameter-mDuesseldorf-mMuenchen-mKoeln-mNuernberg-mLuebeck-mSaarbruecken-mWuerzburg-mGoettingenwenn Sie jeweils die korrekten Umlaute einsetzen.Paramerisierte KartenfaerbungDas Programm kann auch Postleitzahlenbereiche je nach Haeufigkeit des
Aufkommens von Postleitzahlen in einer Datei einfaerben. Das ist z.B. Karten,
die die Kundenverteilung ider dergleichen visualisieren, geeignet.Erzeugen Sie datzu eineTatei mit Test-Postleitzahlen. Schreiben Sie z.B
folgendes in eine Datei test.txt:42477
42477
42477
42477
42897
42897
42897
42499
42859
42899
42929Nun kann man diese Daten nutzen, um eine Entsprechend eingefaerbte Karte zu
erstellen:# eingefaerbte Gebiete
python ./plz_draw --read=test.txt --areas test.pdf42477 wird am dunkelsten eingefaerbt (kommt 4 x vor), 42897 dunkel (kommt 3 x
vor) die restlichen Felder werden nur leicht eingefaerbt. Fuer Tests sind
Beispieldaten in data/beispielverteilung.txt beigelegt.Solange Sie nicht sehr grosse Datenbestaende, von mehr als einer halben
Million Datensaetze haben, werden die Eingefaerbten Karten recht
unregelmaessig aussehen. Dem kann man entgegenwirken, indem man die Daten von
Postleitzahlenbereichen mit gleichem Prefix zusammenfasst, um ein
gleichmaessigeres Ergebnis zu erzielen. Dies geht mit dem Parameter--digits. Wenn Sie--digits=3uebergeben, werden nur die ersten drei
Ziffern der Postleitzahl zur Zusammenfassung verwendet. Geben siemake mapsein, und schauen Sie die fuenf Dateienmaps/beispiel?.pdfan, um
die Auswirkung des--digits-Parameters zu sehen.AutorenDer 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 vomOpenGeoDb
Projekt. Die deutschen Grenzen stammen ausOpenstreetmap Project Germany.Die Kartengenerierung stammt von Maximillian Dornseif und basiert auf seinem
Projektzipdecodede, dass auf Code aus Ben Frys BuchVisualizing Databeruht.Alternativen, Quellen & Vermischtesd9t.gisist ein sehr Zope-Lastiges Python Projekt zur Entfernugnsberechnung
mit OpenGeoDb Daten.ruby-opengeodberlaubt Zugriff auf die OpenGeoDB Daten
aus Ruby heraus.Es gibt jede Menge Online-Distanzberechnungsdienste, z.B:http://www.edith-distance.de/pdf/doku.pdfhttp://www.ebaas.de/ebaas-distance-faq/http://www.internet-marketing-service.eu/?id=20http://www.mprobst.de/OpenGeoNearestNeighbours/website/index.htmlUmfangreiche Informationen zum deutschen Postleitzahlensystem inklusive freier
Rasterkarten gibt es beiWikipedia.Als Alternative Quelle fuer die Deutschen Grenzen kaeme anstatt von
OpenStreetmap auchNaturalEarthin Frage.Geonameskoennte als Alternative
Quelle fuer Postleitzahlen dienen.Wenn Sie einen Fehler bemerken, melden Sie Ihn bitte unterhttp://github.com/mdornseif/pyGeoDb/issues