OSM in Datenbank kopieren

Hallo zusammen,

Ich muss momentan für ein GPS-Tracking ne’ Menge an GPS-Punkten verarbeiten und die nominateim-Daten sind ja auch nicht immer die neusten und ich mss auch noch ein paar andere Spielereien mit den Daten machen…

Ist es nun also möglich das ich z.B. mir alle Punkte (und evtl. Relations) für bestimmte Bereiche sozusagen in meine DB rüber kopiere? Ich will dies bewust beschränken, da ich z.B. für meine Aufgaben keine Daten aus den USA bräuchte, will dies aber auch wieder automatisieren, sodass bei eintreffen neuer Daten die Punkte in der Umgebung sozusagen aktuallisiert werden und damit dann gearbeitet wird.

Falls das noch zu umgangssprachlich war: Gibt es eine API, wo ich einfach sage ich hätte gerne alle Karten-Daten in dem Rechteck zwischen den Koordinaden (a1|b1) und (a2|b2) in was auch mmer für einem Format sodass ich diese verarbeiten kann? So in etwa wie auf der Karten-Startseite unter “Export”…

Wenn ich allerdings wieder die Export-API nehmen würde entstehen wieder enorme Datenmengen, da ich dann ja jedes mal wieder für diese Area alles abfragen muss, nur um zu schauen ob es updates gab, und das würde ja enorm viel Performance bei OSM rauben, oder nicht? Dagegen sind mir die einzelnen Changesets wiederum zu grpß zum automatischen rüber kopieren, denn wie gesagt: was will ich mit daten aus den USA oder Indien wenn ich doch nur halb Deutschland brauche :wink:

Danke schon mal,

iceWave

Ich hab mir vor ein paar Wochen sowas zugelegt (ein Oberbayern-Extrakt der Geofabrik und dann alle paar Stunden ein Update mit ner grosszügigen bbox um das Gebiet). Diese und diese Beschreibung waren recht hilfreich, soweit ich mich erinner praktisch alles mit copy&paste zu übernehmen.

Für den initialen und evtl. kompletten Neuimpimort gibt es vorgefertigte Extrakte z.B. unter http://download.geofabrik.de/

Ok dafür brauch ich ja immer eigene Software, aber vllt. lässt sich das ja auch irgendwie so umändern dass ich es mit reinem PHP-Skript ansprechen kann… Ich werd mich da mal durchlesen.

Danke!

Was möchtest du denn mit den Daten ungefähr machen?
Zum Rendern mit Mapnik gibt’s z.B. auch eine Anleitung: http://wiki.openstreetmap.org/wiki/DE:Mapnik

Ja also zum einen brauch ich das für eine art nominatim, zum anderen muss ich auch die gefahrene strecke berechnen.

So habe ich dann also z.b. 2 Koordinaten, beide liegen jetzt auf einer Straße die eine Kehrtwende macht (z.b. serpentinen). Sie entfernung zwischen den Beiden Punkten über luftlinie wäre jetzt 10m, aber in wirklichkeit sind es 50m, weil die Kurve nicht berücksichtig worden ist.

Mit der Datenbank könte ich dann einfach diese Linie der Straße “abfahren”. Generell ist das ja nchts großes aber wenn ich das tagtäglich für ne menge an Punten mache freuen sich die OSM-Server doch bstimmt riesig… Und zum anderen braucht das auch länger…

Da ist es in meinen augen einfacher einfach die punkte um die gebenen koordinaten zu holen und dann damit direkt auf meinem server zu rechnen. Deswegen will ich ja auch nicht direkt ganz deutschland holen sondern nur ie sachen die ich gerade auch brauche. So würde ich dann also beim eintreffen der neuen Daten schauen, in welchem Gebiet diese Punkte sind, die entsprechenden Daten vom OSM-Server holen, wenn diese für dieses Gebiet nicht drinnen sind bzw. nach einer gewissen Zeit updaten und dann damit meine berechnungen anstellen.

Wobei so groß sind die einzelnen gebiete ja nicht. Könnte ich da nicht wirklich einfach die Expor-API der startseite nehmen?!?

iceWave

Also willst du Routing wie z.B. http://map.project-osrm.org/ und einen Geocoder haben. Das Problem ist nur eher, das der OS-Geocoder Nominatim (http://wiki.openstreetmap.org/wiki/DE:Nominatim) wohl nicht wirklich so toll läuft auch wenn ich da keine Erfahrung damit habe, aber MapQuest hat ihn brauchbar ans laufen bekommen. http://project-osrm.org/ ist derzeit die schnellte Routing-Engine, die es für OSM gibt, die übrigen findet man auf http://wiki.openstreetmap.org/wiki/Routing/online_routers, wobei aber nicht alle einsatzbereit frei verfügbar sind.

Ehm routing brauch ich ja nicht sooo direkt, er soll ja nicht die route selbst finden, wobei… naja egal… also ich will das ganze aber auf meinem eigenen Server machen. ich versuch das jetzt mal mit dem Export-Tool, denn ich brauch wie gesagt nur die Punkte und die Infos dazu… Und das dann auch nur für die entsprechenden Areas… Die fertigen OSM-Zips sind dafür einfach zu groß. Wie lang soll der denn hier für nen Update brauchen? 10 Std. bei ner 768 Leitung? :wink:

Gute Frage: wie steuert man das Export.-Tool denn an?!?

Entweder bei openstreetmap.org bei “Export” auf einen (kleinen) Bereich zoomen, “XML” auswählen, dann bekommt man ein XML dieses Bereichs.

Oder so wie im Wiki (Xapi) beschrieben, sich eine URL zusammenbasteln mit bbox, filter für bestimmte tags… xapi liefert grössere Bereiche, hat aber auch Beschränkungen nach Gebietsgröße und Anzahl der Elemente.

Moin Moin, IceWave,

ich hab den Eindruck, das du momentan nicht weiterkommst und hab daher einige Fragen:

  • Was meinst du mit “alle Punkte”? Alle Nodes oder auch Ways oder gar Relationen?
  • Von welchem Bereich redest du konkret? “Norddeutschland” ist zu vage. Auch Daten aus Dänemark, Holland oder Polen?
  • was ist deine DB? Postgresql, Mysql, was anderes? Hast du praktische Erfahrung mit Datenbanken? Gibt es die schon?

Wie oft sollen die Daten aktualisiert werden? Monat/Woche/Tag/Stunde/2-3 Minuten?

Ist dir bekannt, dass es auch ganz anders geht?

Redest du wirklich von Changsets (diff-files) von http://planet.openstreetmap.org oder meinst du die nächtlichen Extrakte von http://download.geofabrik.de/osm/europe/ (z.B. germany.osm.pbf)?

Sonstiges: Mit welchen Programmiersprachen arbeitest du auf welcher Plattform?

ach ja: Was willst du eigentlich mit den Daten machen?

  • mit openlayers als Punkte über eine OSM-Karte legen?
  • selber Karten erstellen (Rendern)?
  • die Daten in einer ganz anderen Anwendung verwenden?
    wenn ja, welche?
  • alles hoch geheim? → Ende der Diskussion.

Gruss
Walter

p.s. Hervorhebungen in den Zitaten sind von mir.

weiterhin hab ich nicht den ganzen Thread vollständig analysiert, da ich glaube, dass du dich eventuell in einer Sackgasse befindest und ich in diesem Falle ganz von Vorne anfange. Siehe meine Sig :wink:

Also…

  • mit “alle Punkte” sind hauptsächlich nur Straßen gemeint, ich brauche aber auch die PLZ-Grenzen, etc… also brauche ich wohl wirklich ALLE Punkte und daten der Karte

  • nein ich will mir keine Karte rendern, dafür nehme ich die fretig gerenderte OSM-Karte

  • Der Bereich variiert… Ich will das ganze benutzen um GPS-Tracks zu analysieren. Die Autos schicken uns GPS-Tracks auf den Server und die werden dann mithilfe eines PHP-Scriptes von mir ausgewertet. Dabei will ich dann direkt schauen auf welchen Straßen der gefahren ist, etc… Wenn Also ein Auto mal durch Köln gefahren ist, sollen die Daten rund um die Fahrstrecke abgerufen werden, aber z.B. nicht ganz Köln…
    Natürlich buffer ich die Daten, sonst wär das ja ne enorme Datenmenge jedes mal für den OSM-Server… Die zwischengespeicherten Daten werden aber natürlich in regelmäßigen Abständen (so etwa 1 mal die Woche) aktualisiert. Die “neuen” Daten werden immer dann abgerufen wenn neue GPS-tracks eintreffen, das kann im 50-Sekunden-Abstand sein oder auch mal ne ganze Woche dauern…

  • Ziel des ganzen ist es, das ich wenn ich einen Punkt habe, das ich nur alles in nem kleinen Radius drumherum lade und nicht direkt die ganze Stadt… Ok wenn ich daraus ne Karte rendern würde wäre die ein bissl löchrig aber das will ich ja garnicht… ich brauch halt nur da Daten wo auch nen Auto langefahren ist…

  • Ich arbeite mit PHP5 und MySQL

für weitere Fragen stehe ich gerne offen.

Danke schon mal für die Hilfe,

iceWave

ok, gebont.

ok, kein rendern.

dennoch müsste man mal den Oberbereich kennen (Bundesländer, Kreise, Ausland, …) Daraus leitet sich die absolute Größe der lokalen OSM-Datenbank ab.

meinst du hier den Update der lokalen OSM-Daten?

Bei der Lösung, die mir vorschwebt, wird nicht nach Bedarf vom OSM-Server abgerufen.
Gerade das ist der Knackpunkt: Du hast alle notwendigen OSM-Daten lokal in deiner DB. Nur die Art und Weise, wie die lokalen OSM-Daten aktuell gehalten werden, hängt davon ab, wie aktuell die jeweils sein müssen.
Und das hat auch nichts mit irgend einer API oder XAPI zu tun - das geht anders auf eine Art und Weise, die die OSM-Server nicht im geringsten belastet.

aus meiner Sicht der total falsche Ansatz. Du schlägst dich ständig mit Problemen rum, an die jeweils aktuellen OSM-Daten zu kommen.
Sieh es mal so: Was wäre, wenn deine lokale OSM-DB immer aktuell ist. Das wär doch was - oder?

php null Problemo - mysql Riesenproblem.
OSM-Datenbanken rennen nur vernünftig mit postgresql zusammen mit der postgis-erweiterung.
Da sind aber gleich alle Funktionen drin, die du so brauchen solltest: Abstand, Zentrum, nächstes Objekt, Umgebung eines Punktes …

Es spricht aber technisch nichts dagegen, dass deine Anwendung mit 2 Datenbanken arbeitet.

für weitere Fragen stehe ich gerne offen.

Gruss
Walter

Also… generell verstehe ich ja das Ihr alle wollt das ich die komplette OSM-Datenbank nehme aber das bringt auch riesen Probleme mit sich…

Der Bereich steht vorher nicht fest. Wenn auf einmal eines der Fahrzeuge nach Spanien fährt (z.B. über die Autobahn) dann brauch ich ja nicht ganz Spanien dondern nur das Gebiet um die Autobahn, stimts?

Ich dachte mir jetzt das ich das was ich brauche über die API hole und dann damit in meiner DB das anstelle was ich brauche… Ganz Deutschland wäre schlicht weg eine zu große Datenmenge, sorry^^

Wie aktuell müssen die Daten denn sein? Reicht es tagesaktuell? Reicht es, wenn die Karte von vor drei Wochen ist?
Wenn du einen 3 km breiten Kartenstreifen “Autobahn von Flensburg nach Madrid” über die API abrufen willst, musst du arg viel Geduld mitbringen.

Entweder du zerlegst die Strecke in lauter Rechtecke und fragst die Rechtecke dann (evtl. einzeln) ab, oder du baust dir ein (sehr längliches) Polygon und holst dir die Daten, die innerhalb des Polygons liegen. Mal davon abgesehen, dass ich nicht weiß, ob die API Polgone überhaupt unterstützt, die Abfrage ist mit sehr viel Rechenaufwand verbunden und wird im ungünstigsten Fall nach ein paar Versuchen durch die Saveguards des OSM-SPI-Servers geblockt.

Da ist es unter Umständen schneller, ein europe.osm.pbf bereitzuhalten und auf Anforderung automatisch zu schneiden und in die Datenbank zu schieben.

Wenn du nicht nur geographisch, sondern auch nach bestimmten Tags filterst, schrumpft die Datenmenge deutlich. www.opengastromap.de macht das zum Beispiel auch so, wenn auch die verwendete Software nicht mehr aktuell ist. Aber das Prinzip ist geblieben: http://wiki.openstreetmap.org/wiki/OpenGastroMap/install#Filter_the_Planet_File

was ich brauche:

  • Postleitzahlen, daher wohl die PLZ-Grenzen
  • Ländernamen, daher wohl die Ländergrenzen
  • Straßennamen inkl. der einzelnen Punkte der Straße

Die Punkte der Straßen sind am wichtigsten da ich damit verschiedene Sachen berechnen muss, aber vllt. brauch ich auch mal nen maxspeed oder so…

Ich könnte auch 3 einzelne Files runterladen:

Wöchentlich Stadt- und Landesgrenzen sowie die PLZ-Gebiete und dann je nach bedarf die einzelnen Straßen. Eine Straße die allerdings in der DB wäre würde erst nach einer Woche wieder abgefragt.

Das soll den XAPI-Server dann entlasten und ich könnte auch vor der Abfrage den Filter setzen, dass ich z.B. nur Straßen haben will. Die Grenzen können ja meinetwegen auch gedownloaded werden, hauptsache ich brauch dafür keine Erweiterungen in PHP.

Ich müsste die Route übrigens schon sowieso in Rechtecke zerteilen, da ich ja auf der Stecke Flensburg-Madrin alle 50 sekunden einen GEO-Punkt habe… dann würde ich davon immer ein paar zusammenfassen (je nach größe der fläche), daraus nen Rechteck bilden und dieses noch ein wenig größer machen und davon dann die Daten abrufen…

Vorsehen tue ich dafür eine Datenbank mit einigen Tabellen:

  • Tabelle Punkte mit den einzelnen Punkten und infos zu den Punkten (also hier auch die einzelnen tags)
  • Tabelle Straßen (straßennamen, etc)
  • verknüpfungstabelle für Straße <-> Punkte

verschiedene Tabellen für PLZ- und Ländergrenzen wären dann auch noch möglich…

iceWave

Ok ich gebe zu der Server ist echt nicht gerade oft erreichbar… Aber das kann ich echt nicht mit den Planet-Files machen… 160 GB! das muss man sich mal auf der Zunge zergehen lassen. Wenn ich mit dem Download fertig bin kann ich direkt wieder von vorne anfangen oder was? Ok einmal die Woche reicht aber trotzdem… dafür bräuchte ich 40 (!) Tage!!!

Ach so. Ich ging davon aus, dass dir Europa reicht. Dann wärens nur 5,8 GB:
http://download.geofabrik.de/osm/

Das könntest du dann täglich updaten mit ca. 50 MB/Tag:
http://planet.osm.org/daily/

Also Europa laden (anmachen, schlafen gehen, aufstehen, zur schule gehen, schlafen gehen, aufwachen, entpacken :D) und dann ab dem Zeitpunkt wo das Europa-File erstellt wurde immer die Updates der Planet laden und anwenden?

Ich schau mir mal grad die Updates an. Dieses .osm-Format find ich nämlich garnicht mal so schlecht, dann kann ich mir das daraus picken und in meine Datenbank holen, was ich auch brauche. Haltestellen und so sind ja uninteressant für mich…

EINMAL download und danach nur noch die diffs einspielen lassen. unter 100MB / Tag oder 2-5 mb/stunde oder 100-200 Kb/5 minuten