OSM zu CSV - Hilfe

Hallo,

ich beschäftige mich jetzt seit 48 Stunden intensiv mit OSM und finde die Informationsdichte bei Google schauerhaft. Ich komme einfach nicht zum Ziel und hoffe das es hier 1-2 Personen gibt die mir entweder nützliches Material zum lesen oder direkt eine Lösung anbieten können…

Grundsatz:
Wenn ich richtig verstanden habe ist OSM eine Datenbank mit nahezu allen relevanten Karteninformationen. Also auch Straßen, event. Hausnummern usw…

Was ich Suche:
Ich möchte in einem PHP Script eine Routenplanung optimieren. Dazu benötige ich alle Straßen Deutschlands in Koordinaten.

Frage:
Gibt es einen Weg aus dieser “verdammten” OSM Datei einen CSV Export mit folgenden Daten zu machen - OHNE das ich dafür studiert haben muss :smiley: ?

ID (fortlaufend)
Latitude
Longitude
Straßenname
event. Hausnummer
Postleitzahl

Info:
Offenbar kann ich das mit dem Tool Osmosis realisieren. Leider gibt es nirgendwo ein anständiges Tutorial dafür. Wenn jemand für meine Anforderungen gleich den Befehl weiß wäre ich sehr dankbar.

Vielen Dank für die Hilfe!

Hast Du mal xml zu csv ausprobiert. OSM ist eigentlich xml

Ich kann es sowohl zu CSV als auch zu XML wandeln… Die CSV enthält aber leidur nur eine Spalte mit wirren Infos… Vermutlich weil ich die Parameter für den Export nicht richtig eingestellt habe.
Die Anforderungen stehen ja bereits oben.

Ich werde anschließend auch ein Tutorial dazu machen wenn ich alle Puzzelteile zusammen habe. Es gibt Firmen die diese Datensätze zwischen 500 und 10.000 Euro verkaufen und in dieser OSM stecken die “irgendwie” gratis drin…

Koordinaten? Wege haben mehrere Punkte. Außerdem ist nicht jeder Weg begeh-/fahrbar. Würde die Idee nochmal grundlegend überdenken.

PLZ ist nicht ganz einfach, da in Relationen kodiert.

Der Rest ist machbar, weiß aber momentan nicht ob es fertige OSM2CSV Tools gibt.

Das Format ist hier beschrieben:
http://wiki.openstreetmap.org/wiki/OSM_XML

Nahmd,

Es gibt bei OSM keine garantierte Qualität. Hausnummern können drin sein, müssen aber nicht.

Zu den Straßen:

– was meinst Du mit Lat/Lon? Eine einzelne Koordinate (Mittelpunkt des Segments), oder ein Array / eine Liste mit den Koordinaten der Punkte (Plural!), die den Verlauf der Straße beschreiben?

– der Straßenverlauf ist bei uns in Segmente aufgeteilt, wobei die Aufteilung nicht deterministisch ist: es kann sein, dass zwei Segmente sich an einer Straßenkreuzung kreuzen, die Kreuzung besteht dann nur aus zwei “Straßen”. Es kann auch sein, dass die Segmente an einer Kreuzung enden, dann sind an der Kreuzung vier Segmente beteiligt. Es kann auch ein Segment auf freier Strecke enden und da ein neues beginnen. Du musst also sehr wahrscheinlich einige Segmente für Deinen Bedarf noch einmal splitten und/oder zusammenfassen.

– die Straßen/Wege sind bei uns in Klassen aufgeteilt, die im Attribut “highway=” erfasst wird. Such nach “openstreetmap wiki key highway” für weitere Infos dazu. Du musst wählen, welche Klassen Du in Deinem Bestand haben willst.

  • an Straßen und Wegen können noch Dutzend weitere Attribute kleben.

Zu den Hausnummern:

– Hausnummern kleben bei uns an Gebäuden, aber erst einmal nicht an den Straßen[segmenten]. Die Hausnummern an die Straßensegmente zu überführen, die Segmente also mit Hausnummernbereichen auszustatten ist eine nicht ganz triviale Aufgabe.

Damit Du Dir eine Vorstellung von der Größenordnung machen kannst, habe ich mal was vorbereitet™, und zwar ein CSV mit nur den nötigsten Angaben zu den Wegsegmenten in DE: Koordinaten (Mittelpunkt, kein Verlauf), Länge, Klasse, Name sowie Plz. und Ort. Gepackt 86Mb, ungepackt 466Mb. Wohlgemerkt OHNE Verlauf und OHNE die Attribute, die man zu einer sinnvollen Nutzung braucht.


id	lon	lat	~size	highway	name	plz	city
w150792360	13.737968	51.051823	l61	living_street	Sporergasse	01067	Dresden
w163208264	13.726507	51.054363	l110	living_street	Schützengasse	01067	Dresden
w163468488	13.743211	51.052291	l59	living_street	Georg-Treu-Platz	01067	Dresden
[7052563 Zeilen entfernt]

Meine Kristallkugel sagt mir, dass Du für den Start mit einem kleineren Auszug (zB. Regierungsbezirk) der OSM-Daten glücklicher wirst. Und Dich zuerst ein wenig in das bei OSM verwendete Datenmodell und die die Attribute einarbeiten solltest.

Gruß Wolf

Ich danke deiner Kristallkugel und werde deinen Post einmal studieren. Vielen Dank!
Wenn du mir jetzt noch verrätst wie der Befehl für den Export dieser CSV lautet… Hast du Osmosis verwendet?

Edit: Ok hab es mir angeschaut. Im Grunde brauch ich nur den Mittelpunkt der jeweiligen Straße (also jede Straße nur 1x / 1x name pro plz) ohne size, highway und city

Woher kommst du ? Ich würde mich mit einer Einladung zum Essen erkenntlich zeigen um weitere Informationen zu erhaschen :wink:

Nahmd,

Nein, Osmosis kann weder die Länge noch Postleitzahl oder Stadt dazuschreiben.

Nach meinen rudimentären Kenntnissen brauchst Du in Osmosis nur wenige Parameter:

— mach alles zu Pois
— behalte alles mit “highway=” (wirf den Rest weg)
— schreib ein CSV raus
— schreib die und die Felder (highway, name) in das CSV

Wie die Parameter genau heißen → Doku.

Wenn Du die Postleitzahlen oder Orte dazupacken willst oder sogar die Hausnummern zuordnen, kommst Du kaum daran vorbei, die OSM-Rohdaten in eine Datenbank (i.a. Postgres+Postgis) einzuspielen und dann die DB geschickt zu befragen.

Nachtrag:

Sollst Du haben. Die Länge ist aus technischen Gründen dabei (wird zur Berechnung des “Mittelpunktes” benutzt), und die highway am Ende, damit Du siehst, aus welchen Straßenklassen sich die jeweilige Straße zusammensetzt.

Für die eingesparte Zeit kannst Du Dich hier erkenntlich zeigen. Server können nie groß und schnell genug sein. :stuck_out_tongue:

Gruß Wolf

Da sind dann aber auch eventuell Fehler drinnen, wenn eine Straße über mehrere PLZ-Bereiche geht.

Ich kristallkugele mal weiter: wolf hat seine eigene Version der OSM-Datenbank bei sich laufen, und hat sich mit schlauen SQL-Abfragen dagegen diese Datei geholt.

Es geht aber auch anders: für die Ausgabe als CSV aus den OSM-Export-Dateien gibt es die beiden Tools osmfilter ( http://wiki.openstreetmap.org/wiki/DE:Osmfilter ) und osmconvert ( http://wiki.openstreetmap.org/wiki/DE:Osmconvert ) , zu denen es auch auf der Hilfeplattform ( https://help.openstreetmap.org/tags/osmconvert/ , https://help.openstreetmap.org/tags/osmfilter/ ) jede Menge Fragen und Antworten gibt.

Da wir von Deinem Problem nur einen Ausschnitt der Lösung kennen, können wir natürlich auch nur diesen versuchen zu optimieren.

Da Dir das Mapping auf einfache Lat Lon Koordinaten mit PLZ wichtig ist (ich das Thema Offline / Online nicht bewerten kann), könnte ich mir vorstellen, das dir ganz einfach auch Nominatim weiterhelfen kann. Macht was Du suchst, und ist online bereits fertig.

Kann man sich auf offline installieren, wenn Online ein No Go ist.

Christoph

Dann vllt zum Projekt ein paar Infos:

Ich habe eine KundenDB mit fast 120.000 Datensätzen und erstelle ein Script welches die Routenplanung für Außendienstmitarbeiter übernimmt. Derzeit arbeite ich mit den Koordinaten von Postleitzahlen.
Mein Ziel ist es mit verschiedenen Suchtechniken für die Adresse des KD die Koordinaten aus einer OSM DB zu suchen um die Planung zu verfeinern. Ideal wäre hier eigentlich die Google API - leider belaufen sich meine Suchanfragen täglich auf bis zu 60.000 Querrys womit ich Google jährlich einen Porsche finanzieren würde.

Plan ist also alle deutschen Straßen mit jeweiliger Postleitzahl und Koordinaten (egal welcher Punkt auf der Straße / es wäre genauer als nur die Koordianten der PLZ) in eine MySQL DB zu stecken.

Problem ist nur das ich an OSM vollständig scheitere da das Thema mit PHP und SQL mal gar nix zu tun hat. Ich habe noch nie mit PostgreSQL gearbeitet und will es offen gesagt auch nicht.

Im Grunde such ich nur den schellsten Weg für:

"Mach aus einer deutschlandweiten OSM-DATEI eine CSV mit ID, Lat, Lon, Straßenname und Postleitzahl wobei der Straßenname nur 1x pro PLZ auftauchen soll)

Nahmd,

Der schnellste Weg ist der Download: PLZ und Straße (1.1 Mio Records, gepackt 18Mb, ausgepackt 76Mb) und PLZ, Straße und Hausnummer (7.9 Mio Records, gepackt 95Mb, ausgepackt 430Mb).

Die zweite Liste ist wegen der Unvollständigkeit der Hausnummern kein Ersatz für die erste Liste, sondern (nur) eine Ergänzung: man suche zuerst in Liste 2, und wenn kein Treffer, dann in Liste 1.

Gruß Wolf

Edit: überholten Hinweis entfernt

Magst du (@Netzwolf) grad noch deinen Algorithmus erklären (bzw. das SQL posten), wie du an die Datei gekommen bist?

War es in etwa (hab meine DB grade nicht zugreifbar, daher pseudocode):

select
  plz->tags('postal_code') as PLZ,
  obj.name
from planet_osm_lines as obj, planet_osm_polygons as plz
where
  plz.tags->'boundary' = 'postal_code'
  and obj->tags('highway') is not null
  and obj->tags('name') is not null
  and ST_Within(plz.way, obj.way)
group by PLZ, obj.name

…oder kriegt man dann die PLZ-Grenzen, die nicht als closed way, sondern als Relation erfasst sind, nicht mit?

Die Plz-Grenzen stehen mit ihrer negativen osm_id in planet_osm_polygon.

z.B. #3320567 von 65388 Schangenbad:

select osm_id,name,tags from planet_osm_polygon where osm_id=-3320567;

gruss
walter

Nahmd,

Ich hab keine SQL-Datenbank, sondern nur eine binäre Kopie des Planet und eine handvoll Tools, um die Daten zu plündern. Die Kopie ist immer 'nen Tag hinterher, und die Tools sind strunzdumm und können nur einen winzigen Bruchteil von dem, was OP oder SQL können. Das aber können sie schnell.

So ähnlich würd ich es machen. Fehlt noch die Begrenzung auf DE und die Bestimmung von Koordinaten für jede PLZ/Namen-Kombination.

Mich interessiert aber viel mehr die Lösung mit osmconvert und osmfilter, denn nur für eine dämliche Straßenliste ein Postgres+Postgis mit Feed aufsetzen und betreuen zu müssen halte ich für Overkill.

Gruß Wolf

Härteres Stück Arbeit als ich dachte, und ganz ohne ogr2ogr wirds auch nicht gehen. Momentan kämpfe ich mit dem OSM-Treiber für OGR…