Eigener Geocoding-Server

Hallo liebe Community,

ich bin neu hier und auch ganz neu beim Thema OpenStreetMap.

Undzwar würde ich gern ein autarkes System aufsetzen. In diesem System läuft ein Javaprogramm mit welchem man Adressen oder Geokoordianten eingeben kann. Diese sollen dann im Kartenfenster angezeigt werden. Hierzu soll zusätzlich eine Geokodierung stattfinden, d.h. bei Eingabe einer Adresse die Geokooridanten und bei eingabe der Koordinaten die Adresse angezeigt werden.

Ich habe bisher ein Javabeispiel gefunden womit man ein Kartenfenster erzeugen kann. Dieses greift allerdings auf den Onlinedienst zu.
Kann mir jemand dabei helfen wie ich die heruntergeladenen osm-Karten dafür verwenden kann?
Des Weiteren habe ich eine Anleitung gefunden womit ich einen eigenen Geocoding-Server aufsetze, komme aber damit nicht so ganz klar. Könnte mir auch hierbei jemand helfen :frowning:

VIelen Dank schon mal und viele Grüße erazor

Also die Frage ist wie du dir die Sache vorstellst. Welche Vorraussetzung dein Autarkes System mitbringt und ähnliches. Mit einer heruntergeladenen Karte wird Geocoding schonmal nicht funktionieren. Dafür brauchst du wenigstens eine Datenbank. Wenn du eine Datenbank hast, kannst du eigentlich auch gleich die Karte selbst rendern und brauchst sie nicht runterladen.
Die Karte könnte man mit openlayers oder html einbinden. Openlayersbeispiele gibt es auf openlayers.org für html gibts bei netzwolf.info unter Kartografie ein Beispiel mit Dokumentation.
Wo hast du denn die Anleitung für Geocoding gefunden? Wäre es nicht auch eine alternative wenn du in deinem Javaprogramm eine Datenbankverbindung aufbaust und diese dann mit SQL beschickst und sie dir die Angaben liefert.
Wie groß wird deine Gebiet eigentlich? Reden wir über die Welt oder Kontinente?

Vielen Dank für die schnelle Antwort.

Also ich möchte mich erstmal auf Deutschland beschränken. Sind dies dann die richtigen Karten: http://download.geofabrik.de/osm/europe/germany/

Auf dem System habe ich eine SQL Datenbank laufen, das stellt als kein Problem dar. Auch eine Kommunikation im Javaprogramm zu der Datenbank ist gewährleistet. Rechenpower ist auch genügend da.

Javabeispielprogramme habe ich hier gefunden:
http://frickelblog.wordpress.com/tag/jxmapkit/
http://swingdepot.blogspot.com/2009/08/openstreet-maps-example-java-swings.html

Die Anleitung für den Server gibts hier:
http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/gazetteer/README.txt

Das sind keine Karten! Das sind lediglich Geodaten. So wie sie auch in der Datenbank bei osm liegen. Daraus wollen allenfalls mal Karten werden.

Eine SQL Datenbank ist ein bisschen zu allgemein. Wenn du wirklich ein großes Projekt, und Deutschland ist nicht klein, planst sollte es schon eine mit geodatenunterstüzung sein. Bei OSM ist das Postgresql mit der Erweiterung Postgis. Damit hast schon sehr viel von deiner Goecodierung erledigt, da diese Datenbank dann zu den angegeben Koordinaten oder Adressen dann eine Umkreis suche machen kann und dir dann entweder Koordinaten für Adressen oder Adressen für Koordinaten liefern kann.
Die Frage wird nur sein wie du die Datenbank aufbaust. Zum rendern der Karte verwendet der OSM Server Mapnik und ein spezielles Datenbankschema, welches von osm2pgsql befüllt wird.
Dieses Schema erweist sich aber mitunter als hinderlich, wenn man bestimmte Dinge in den Rohdaten finden möchte. Daher gibt es auch ein Snapshotshema welches durch Ossmosis bedient wird. Damit hast du dann quasie eine Datenbank an der Hand welche API konform aufgebau ist und dann solche Suchanfragen bewältigen kann.
In der Vergangenheit habe ich hier leider immer nur gelesen, dass besonders ambitionierte Nutzer beide Datenbanktypen parallel einsetzen um alle Aufgaben zu erfüllen. Alternativ kannst du natürlich auch am Style deiner Datenbank rumschrauben um so das optimum zu erreichen.

Außerdem solltest du dir immer dessen bewust sein, dass OSM keine amtlichen vollständigen Daten hat und somit bestimmte Dinge vielleicht auch nicht findet.

Also der Anfang wäre erstmal die Datenbank dazuzubringen dir die Ergebnisse zu liefern welche du willst.

Unter Linux gibt es bereits eine recht einfache Möglichkeit alle pakete für ein Mapnik rendering zu installieren:
http://wiki.openstreetmap.org/wiki/DE:Ubuntu_tile_server

Um einen eigenen Geocoder einzurichten ist Nominatim (das wird auch auf osm.org als Suche verwendet) wahrscheinlich die beste, moeglicerweise sogar die einzige funktionierende Loesung. Vermutlich findet man die beste Hilfe wie man das einrichtet auf der osm-geocoding mailingliste und in deren Archiv ( http://lists.openstreetmap.org/pipermail/geocoding/ ). Insgesamt duerften bislang nicht all zu viele Nominatim installiert haben, so dass die Anleitung leider nicht immer ganz Aktuell oder Benutzerfreundlich ist.

wenn ich das noch richtig weiß, kann man mit den bestehenden Lösungen entweder rendern oder geocoden. Beides zusammen geht wohl aufgrund der Datenstruktur nicht.

Das kommt immer darauf an, was erazor2106 genau will.

Nomination macht ja auch eine Zuordnung, wozu ein Objekt (Ortsteil, Stadt, …) gehört. Wenn erazor2106 das braucht/will, dann geht für ihn/sie wahrscheinlich kein Weg an Nominatim vorbei. Und da Nominatim die Informationen anders aufbereitet braucht als Mapnik, dürften auch zwei unterschiedliche Ausprägungen der Datenbank sinnvoll/notwendig sein.

Wenn erazor2106 jedoch zu einem Objekt nur die Geokoordinaten braucht ohne z.B. die Verwaltungsstruktur, dann geht es vielleicht auch mit einer Datenbank. Eigene Tabellen für die Schlüssel name und addr:* (und ggfs. weitere Schlüssel) wären aber auch in diesem Fall nützlich. Allerdings ist das Problem der Mehrfach-Treffer (z.B. Schillerstraße) natürlich bei jeder Lösung zu beachten.

Edbert (EvanE)

Hey erazor2106,

Willkommen im Forum! Bei mir läuft ein ähnliches Offline-Kodierungssystem, das Deinen Anforderungen vermutlich ziemlich nahe kommt.
Um völlig autark zu sein, bräuchtest Du zwei Teile:

  1. Ein Nominatim-Server, um zu einer Adresse die Geokoordinaten zu liefern.
    Um die Qualität der Geokodierung abzuschätzen, spiel einfach ein bisschen mit http://nominatim.openstreetmap.org/ herum.
  2. Ein Rendering-Server, für die Kartenerstellung und Bereitstellung.

Leider gibt’s das ganze nicht ohne ein gehöriges Maß an Linux-Bastelarbeit.
Falls Dir das nichts ausmacht, schau Dir die folgenden Artikel an

Rendering-Server http://wiki.openstreetmap.org/wiki/DE:HowTo_Mapnik_%26_Tirex
Eine ausführliche Erklärung zur Nominatim-Installation habe ich bisher noch nirgends gesehen. Gute Ansatzpunkte liefern http://open.mapquestapi.com/npi/ und der leider etwas unübersichtliche Wiki-Artikel http://wiki.openstreetmap.org/wiki/Nominatim/Installation

Bei Fragen meld Dich einfach

VIelen Dank für eure Antworten.

Das hört sich ja noch nach einer ganzen Menge Arbeit an. Linux ist nicht so wirklich meine Stärke, in Linux dann basteln erst recht nicht :wink:

Ich dachte halt, dass es für diese Aufgabenstellung schon ein paar Werkzeuge oder zum Teil fertige Komponenten gibt. Oder ist es heutzutage zu realitätsfern einen Service ohne Internet nutzen zu wollen :slight_smile:

Ich bin mir halt nicht sicher ob ich das alles so hinbekomme. An Hardware, Software, Datenbanken, etc. soll es nicht mangeln. Probleme gibt es dann wohl eher bei meinen Linux- und Geocoding Vorwissen. Meine Stärken sind an anderer Stelle angesiedelt. Diese Geoverwaltung ist nur ein Bestandteil eines größeren Verwaltungssystem in welchem auch Adressen und Geodaten abgelegt sind. Aus diesem Programm heraus soll dann mein Javaprogramm aufgerufen werden, welches entweder NUR Adressen in Geodaten bzw. Geodaten in Adressen umwandelt ODER eine bestehende Adresse auf einer Karte anzeigt.

Wichtig ist dabei, dass es ohne Internet funktionieren muss.

Also ohne es probiert zu haben, würde ich dir empfehlen in einer virtualbox zu erst den Tileserver zu installieren. Damit hast du dann schon mal die Karte am Start. Offline ohne Probleme.
Ob du darauf mit einem beliebigen Browser oder mit deinem Javaprogramm zu greifst ist dann deine Entscheidung.
Als zweiten Schritt würde ich versuchen an Hand von Beispieladressen SQL Statments zu erschaffen, welche dann deine Anforderung erfüllen.
Das Problem ist, dass der Datenbestand nicht vollständig und nicht einheitlich ist. Also es gibt sowohl Punkte als auch Wege(buldings) welche die Adresse beinhalten können.
Manche Adressen sind vollständig (also PLZ Straße Ort Land) andere enthalten nur Teilinformationen, da sich zum Beispiel die Plz ja aus der Lage innerhalb einer Plzgrenze ergeben sollte. Dafür musst du natürlich zunächst mal die plz Grenze ausfindig machen und dann schauen ob die gesuchte Straße / Hausnummer dort zu finden ist.
Nominatim ist denke ich für diese Aufgabe zu überdimensioniert, da er ja für die Suche nach allem möglichen erstellt wurde. Dir geht es aber nur um Adressen.
Ganz schwierig wird die Sache übrigens bei falscher Schreibweise. Aber das ist schon wieder eine andere Baustelle.

Und natürlich Multipolygone (Haus mit Innenhof). Da können die Addressdaten sowohl am Gebäude (way) als auch in der Relatione enthalten sein (und auch an beiden gleichzeitig - also Duplikate beachten)

mdk

um noch was “draufzulegen”:
es gibt auch buildings, wo ein Teil der Adresse am building hängt und ein Teil am entrance, weil das z.b. ein Ladeneingang ist. Oder an der site-relation für ein Firmengelände.

Gruss
walter