Place Autocomplete auf eigenem Server

Hallo Forum,

bitte um ratschläge und Tipps.

ich will sowas auf meinem Server haben:
https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform?hl=de

im Prinzip will ich die Daten als XML haben, z.B. wie hier:
http://maps.google.com/maps/api/geocode/xml?address=Berlin,%20Deutschland,%20Kruppstr&sensor=false

Land, Adresse, Region, Ort, PLZ, lng, lat, das sind die Daten die ich Brauche.

habe im Netz mal Infos gesehen, dass man die Openstreetmap-Daten in MySQL-Datenbank einlesen kann.
habe auch gelesen, dass es MySQL dafür nicht so optimal eigent. Bin aber leider auf MySQL angewiesen.

Frage 1: ist das überhaupt möglich?
Frage 2: wenn ja, wie groß wird die DB?
Frage 3: gibts es irgendwo schon Howto’s?

bin für jeden Tipp und Link sehr dankbar.

Gruß

Antwort 1:

Ja, selbstverständlich ist so etwas möglich. Normalerweise ist MySQL äußerst ungeeignet, weil es nicht für Geodaten optimiert ist. Da es dir aber nur um eine Adressvervollständigung ohne Koordinaten und spatiale Relationen geht, ist das völlig egal. Du müsstest also nur die Adressdaten aus OSM importieren und dann ganz normale Datenbankabfragen realisieren.

Das Problem: Adressen sind in OSM noch äußerst lückenhaft erfasst. Einige Gebiete sind vollständig erfasst, andere nur teilweise oder gar nicht. Das Ergebnis wird in seiner Qualität also von Ort zu Ort schwanken.

Antwort 2:

Je nach Region ein paar GB. Du hast ja nur die Adressen ohne sonstige Attribute.

Antwort 3:

Hast du schon im Internet gesucht?

Doch die Koordinaten lng und lat brauche ich :frowning:

Im Internet, wird meistens für PostgreSQL was gepostet.

Für MySQL habe ich nur solche Antworten gefunden:

has no geospatial extension
custom DB schema

Frage mich jetzt ob ich PostgreSQL nachinstallieren soll…
habe aber keine Erfahrung mit PostgreSQL genau so wenig mit OSM :-(((

Aber willst du nach Koordinaten suchen oder nur Koordinaten ausgeben?

nur ausgeben, suchen will ich nur Stadt und Land, evtl. noch Strasse (Strasse ist aber zweitrangig)

Dann kannst du ja auch lat und lon als reine Strings/Zahlen speichern. Da brauchst du keine räumliche Erweiterung für.

Grobes Howto (bitte die einzelnen Komponenten selbst googeln):

Einen Geofabrik-Extrakt der betreffenden Region als .pbf runterladen.
mit osmfilter alles außer die addr:*-Tags wegwerfen
mit osmconvert daraus ein XML machen
mit den Tools deiner Wahl dieses XML in deine mySQL-Datenbank einlesen.

Einfach, Mega, Genial!

Vielen Dank Gormo!

Habe noch eine kurze Frage.

Ich habe jetzt die Datei mit OSMconvert von Authordaten bereinigt und in 05m umgewandelt.

Anschliessend mit osmfilter alles außer die addr:*-Tags verworfen. Die Datei ist aber immernoch für Europa gigantisch.

Da ich nur die Straße, PLZ, Ort, Land, lat und lng brauche, kann ich irgendwie die Hausnummern auch aussortieren?

Damit (Straße, PLZ, Ort, Land) als Uniq in der DB bleiben? Klar kann ich auch in MySQL DB die Felder (Straße, PLZ, Ort, Land) als unique setzen.

Aber dann dauert halt import eine Ewigkeit

Vielen Dank

Ganz so einfach ist es dann doch nicht.

Punkt 1: Viele Objekte dürften als Weg bzw. Fläche vorliegen. Dort müsstest du die Koordinaten erst bestimmen! Ein eleganter Weg fällt mir momentan aber auch nicht ein, wie man das komplett auf Punkte vereinheitlichen könnte.

Punkt 2: Du möchtest also keine Hausnummern, sondern nur Straßennamen. Die werden aber nicht über addr:-Tags angegeben, sondern über name= an den entsprechenden highway=*. Dort fehlen dir dann aber die restlichen Adressdaten. Du müsstest also erst alle Adressen bestimmen, die Hausnummern entfernen, dann ein unique drauf ausführen, damit du jede Straße/PLZ/Ort-Kombination nur ein Mal hast (aber Achtung, die Daten sind nicht immer vollständig, du müsstest ggf. also noch Grenzen und place-Nodes berücksichtigen und darüber die Adresse vervollständigen). Anschließend müsstest du die nächstliegende Straße mit diesem Namen extrahieren und auf einen Punkt reduzieren.

Fazit: Es wäre vielleicht gar nicht schlecht, solch einen Adress-Extrakt anzubieten. Wäre das nicht was für die Geofabrik? :wink:

osmconvert kennt --all-to-nodes

http://wiki.openstreetmap.org/wiki/DE:Osmconvert#Wege_und_Relationen_entfernen_und_in_Knoten_umwandeln

Straßennamen stehen doch (meist?) in addr:street drinnen. Es müsste also eigentlich klappen. Außer für Straßen, an denen keine Adressen erfasst sind…

Alternativ kann man selbst einen nominatim aufsetzen, ist aber sehr viel Aufwand und nur mit postgres zu bewerkstelligen. Und Overkill, wenn man nur Autocomplete haben will.

zur PLZ: gehe bitte nicht davon aus, dass die PLZ überall in Europa so gut wie in DEU erfasst sind. (*)

siehe alle addr:postcode bei den Nodes und den als Way erfassten Buildings.

Im Zentrum sieht es ganz gut als, am Rand wird es dünn.

Gruss
walter

*) In NL, DK, PL und CZ ist die Dichte am höchsten - wesentlich höher als bei uns. Daher gehe ich dort von Importen aus

Es geht ja wohl darum, die Position der Straßen – und nicht die der Häuser – zu bekommen. Und dafür helfen einem die Positionen der Adressen nicht allzu viel.

Du hast also einen highway=residential mit name=Hauptstraße und hundert Nodes mit addr:street=Hauptstraße und den anderen addr:-Tags. Du möchtest aber nur den highway=residential mit den gemeinsamen addr:-Tags.