Dieses Kapitel beschreibt Funktionen, die sich in dem Verzeichnis "extras" des PostGIS Quellcodes (Tarball oder Repository) befinden. Diese sind nicht immer mit der binären PostGIS Release paketiert, es handelt sich dabei aber üblicherweise um Pl/Pgsql- oder Shell-Skripts, die direkt aufgerufen werden können.
Dies ist ein Entwicklungszweig des PAGC Adressennormierers (der Code für diesen Teilbereich beruht auf dem PAGC Adressennormierer für PostgreSQL).
Der Adressennormierer ist ein Parser für einzeilige Adressen. Eine gegebene Adresse wird anhand von in einer Tabelle abgelegten Regeln und den Hilfstabellen "lex" und "gaz" normiert.
Der Code befindet sich in einer einzelnen PostgreSQL Erweiterungsbibliothek mit der Bezeichnung address_standardizer
und kann mittels CREATE EXTENSION address_standardizer;
installiert werden. Zusätzlich zu der Erweiterung "address_standardizer" gibt es auch die Erweiterung address_standardizer_data_us
, welche die Tabellen "gaz", "lex" und "rules" für Daten der USA enthält. Diese Erweiterung kann mittels CREATE EXTENSION address_standardizer_data_us;
installiert werden.
Der Code für diese Erweiterung befindet sich unter PostGIS in extensions/address_standardizer
und ist zurzeit self-contained ("unabhängig").
Für eine Installationsanleitung siehe: Section 2.3, “Installation und Verwendung des Adressennormierers”.
Der Parser arbeitet von rechts nach links und betrachtet zunächst die Makroelemente Postleitzahl, Staat/Provinz, Stadt. Anschließend werden die Mikroelemente untersucht, um festzustellen ob es sich um eine Husnummer, eine Kreuzung oder eine Wegmarkierung handelt. Zur Zeit schaut der Parser nicht auf die Landeskennzahl oder -namen, dies kann aber möglicherweise noch implementiert werden.
Wird als US oder CA basiert angenommen: Postleitzahl als US oder Kanada, state/province als US oder Kanada, sonst US
Diese werden über Perl-kompatible reguläre Ausdrücke erkannt. Die Regexs befinden sich in "parseaddress-api.c" und können bei Bedarf relativ leicht angepasst werden.
Diese werden über Perl-kompatible reguläre Ausdrücke erkannt. Die Regexs befinden sich zurzeit in "parseaddress-api.c", könnten zukünftig aber zwecks leichterer Wartbarkeit in die "includes" verschoben werden.
Dieser Abschnitt listet die von der Erweiterung "Address Standardizer" installierten PostgreSQL-Datentypen auf. Beachten Sie bitte die hier beschriebene Verhaltensweise bei der Typumwandlung. Diese ist insbesondere dann sehr wesentlich, wenn Sie Ihre eigenen Funktionen entwerfen.
standardize_address
Funktion.Dieser Abschnitt beschreibt den Aufbau der PostgreSQL Tabellen, die von dem "address_standardizer" bei der Normalisierung von Adressen verwendet werden. Diese Tabellen können auch anders als hier bezeichnet werden. Sie können eigene "lex", "gaz" und "rules" Tabellen für jedes Land oder für einen benutzerdefinierten Geokodierer verwenden. Diese Tabellennamen werden an die Funktionen des Adressennormierers übergeben.
Das Erweiterungspaket address_standardizer_data_us
enthält Daten zum Normieren von US Adressen.
Ein auf PL/pgSQL basierender Geokodierer, der für das vom United States Census Bureau herausgegebene TIGER (Topologically Integrated Geographic Encoding and Referencing system ) / Line and Master Address database export geschrieben wurde.
Der Geokodierer besteht aus vier Komponenten: Funktionen zum Laden von Daten, der Adressennormierer, der Adressengeokodierer und der inverse Geokodierer.
Obwohl speziell für die US entworfen, können viele Konzepte und Funktionen übernommen und an die Adressen und Straßennetze anderer Länder angepasst werden.
Das Skript erstellt ein Schema mit der Bezeichnung tiger
, in dem sich alle auf TIGER bezogenen Funktionen befinden, sowie wiederverwendbare Daten, wie Präfixe für Straßentypen, Suffixe, Länder, verschiedene Kontrolltabellen zum Bewerkstelligen des Ladens von Daten, und Schablonen für die Basistabellen von denen alle geladenen TIGER-Tabellen erben.
Eine weiteres Schema mit der Bezeichnung tiger_data
enthält die Volkszählungsdaten aller Länder, die der Loader von der Census Seite in die Datenbank lädt. Im aktuellen Datenmodell erhalten die Tabellen eines Landes den Ländercode als Präfix - z.B. ma_addr
, ma_edges
etc. - und werden mit Constraints versehen, welche die Daten auf das jeweilige Land beschränken. Diese Tabellen erben alle von den Tabellen addr
, faces
, edges, etc., die sich in dem Schema tiger
befinden.
Da die Funktionen zur Geokodierung nur auf die Basistabellen verweisen, muss das Datenschema nicht notwendigerweise tiger_data
heissen. Solange alle Tabellen von den Tabellen im Schema tiger
erben, können die Daten auch auf andere Schemata weiter aufgeteilt werden -- z.B. ein anderes Schema für jedes Land.
Anweisungen wie Sie die EXTENSION in Ihrer Datenbank aktivieren und mit ihr Daten laden können, finden Sie unter Section 2.4.1, “Tiger Geocoder Enabling your PostGIS database”.
Wenn Sie den Tiger Geokodierer (tiger_2010) verwenden, können Sie die Skripts mit den beigefügten Shell-Skripts "upgrade_geocoder.bat" unter "extras/tiger" aktualisieren. Eine wesentliche Änderung zwischen |
Neu in der PostGIS 2.2.0 Release ist die Unterstützung von Tiger 2015 Daten und die Einbindung des Adressennormierers als Teil von PostGIS. Falls Sie mit PostgreSQL 9.1+ arbeiten, haben Sie mit der PostGIS 2.1.0 Release die neue Möglichkeit, den Tiger Geokodierer mittels dem PostgreSQL Extension Modell zu installieren. Siehe Section 2.4.1, “Tiger Geocoder Enabling your PostGIS database” für Details. |
Die Funktion Pagc_Normalize_Address kann direkt gegen die eingebaute Funktion Normalize_Address ausgetauscht werden. Siehe Section 2.3, “Installation und Verwendung des Adressennormierers” für Anweisungen zur Kompilation und Installation.
Entwurf:
Das Ziel des Projektes ist einen voll funktionsfähigen Geokodierer zu erstellen, der eine beliebige Adresszeile der USA verarbeiten kann. Mittels normalisierter TIGER Census Daten wird eine Punktgeomtrie und eine Wertung erstellt, welche die Lage einer gegebenen Adresse mit einer bestimmten Wahrscheinlichkeit darstellen. Umso höher die Wertung ist, umso schlechter ist das Ergebnis.
Mit der Funktion reverse_geocode
, die in PostGIS 2.0.0 eingeführt wurde, können mittels Geokoordinaten textuelle Lokationsangaben, wie Adressen und Straßenkreuzungen bestimmt werden.
Der Geokodierer sollte von jedem, der mit PostGIS vertraut ist, leicht zu installieren und zu benutzen sein. Er sollte auch auf allen von PostGIS unterstützten Plattformen installierbar und benutzbar sein.
Abgesehen von Formatierungs- und Rechtschreibfehlern, sollte der Geokodierer stabil genug sein um einwandfrei zu funktionieren.
Er sollte auch ausreichend erweiterbar sein, um zukünftige Datenaktualisierungen durchzuführen und alternativen Datenquellen mit geringen Änderungen des Codes zu nutzen.
Damit die Funktionen ordnugsgemäß arbeiten, muss das |
tiger_data
Schema zugegriffen.county_all
, state_all
oder dem Ländercode gefolgt von county
oder state
beginnen.tiger_data
Schema zugegriffen.normalized_address
(addy) für jede Punktage, sowie die Rangfolge. Umso niedriger die Rangfolge ist, um so wahrscheinlicher ist die Übereinstimmung. Die Ergebnisse werden mit aufsteigender Rangfolge sortiert - dar niedrigste Rang zuerst. Optional kann die maximale Anzahl der Ergebnisse angegeben werden (Standardeinstellung ist 10). Verwendet TIGER Daten (Kanten, Maschen, Adressen) und Fuzzy String Matching (soundex, levenshtein) von PostgreSQL.tiger_data
importiert. Jedes Bundesstaat-Skript wird in einem eigenen Datensatz ausgegeben.tiger_data
importiert. Jedes Bundesstaat-Skript wird in einem eigenen Datensatz ausgegeben. Die neueste Version unterstützt die geänderte Struktur von Tiger 2010 und lädt ebenfalls die Census Tract, Block Groups und Blocks Tabellen.norm_addy
zurückgeben, der ein Suffix und ein Präfix für die Straße, einen normierten Datentyp, die Straße, den Straßennamen etc. enthält und diese einzelnen Attributen zuweist. Diese Funktion benötigt lediglich die "lookup data", die mit dem Tiger Geokodierer paketiert sind (Tiger Census Daten werden nicht benötigt).norm_addy
zurückgeben, der ein Suffix und ein Präfix für die Straße, einen normierten Datentyp, die Straße, den Straßennamen etc. enthält und diese einzelnen Attributen zuweist. Diese Funktion benötigt lediglich die "lookup data", die mit dem Tiger Geokodierer paketiert sind (Tiger Census Daten werden nicht benötigt). Benötigt die Erweiterung "address_standardizer".norm_addy
wird eine formatierte Darstellung zurückgegeben. Wird üblicherweise in Verbindung mit normalize_address verwendet.Es existieren eine Reihe weiterer Open Source Geokodierer füf PostGIS, welche im Gegensatz zu dem Tiger Geokodierer den Vorteil haben, dass sie mehrere Länder unterstützen
Nominatim verwendet Daten von OpenStreetMap, die mittels Gazetteer formatiert werden. Es benötigt osm2pgsql zum Laden der Daten, PostgreSQL 8.4+ und PostGIS 1.5+ um zu funktionieren. Es ist als Webinterface paketiert und wird vermutlich als Webservice aufgerufen. So wie der Tiger Geokodierer besteht es aus einem Geokodierer und einer inversen Komponente des Geokodierers. Aus der Dokumentation ist nicht ersichtlich, ob es wie der Tiger Geokodierer auch eine reine SQL Schnittstelle aufweist, oder ob ein größerer Anteil der Logik in das Webinterface implementiert wurde.
GIS Graphy nützt ebenfalls PostGIS und arbeitet so wie Nominatim ebenfalls mit Daten von OpenStreetMap (OSM). Es beinhaltet einen Loader, um OSM-Daten zu importieren. Ähnlich wie Nominatim kann es auch für die Geokodierung außerhalb der USA verwendet werden. So wie Nominatim läuft es als Webservice und benötigt Java 1.5, Servlet Apps und Solr. GisGraphy kann plattformübergreifend genutzt werden und hat ebenfalls einen invertierten Geokodierer zusammen mit anderen geschickten Funktionen.