Wie speichere ich alle OpenStreetMap-Daten effizient indiziert?

8

Ich habe eine PBF-Datei , die die folgenden Informationen zu einem Land enthält:

  • Knoten, jeder mit seiner eigenen Länge, Breite und Eigenschaften; wird zum Speichern von Punkten in einem 2D-Raum verwendet.

  • Wege, jeder mit seinen Eigenschaften, sind durch Knoten verbunden; verwendet, um Straßen, Grenzen zu speichern.

Während diese Datei in ihrer komprimierten Form nur 80 MB groß ist, sind es 592 MB, wenn sie nicht komprimiert und in einer Datenbank gespeichert sind.

Ja, und das gilt nur für ein Land, Belgien. Stellen Sie sich vor, Sie lagern neben Frankreich, Deutschland und Italien.


Nehmen wir zum Beispiel eine einzige Autobahn von Antwerpen über Brüssel nach Charleroi. Dies würde aus einer Tonne Knoten bestehen, um alle Kurven auf der Autobahn zu speichern, aber brauche ich alle diese Kurven? Ich bezweifle das.

Lassen Sie mich Ihnen sagen, was ich tun möchte:

  • Ich möchte die Karte mit verschiedenen Zoomstufen anzeigen. Großstädte, Kleinstädte und zumindest Straßenebene.

  • Ich möchte Routing-Informationen zwischen zwei Punkten erhalten können.

  • Ich möchte in der Lage sein, die Straße zu berechnen, die meinem GPS-Standort am nächsten liegt.

  • Suchen Sie mithilfe eines Index in der Datenbank nach einem Speicherort.

Vor allem aber sollte die Datenbank nicht zu groß sein, da sie auf einem mobilen Gerät gespeichert wird .


Also dachte ich über eine Kombination von zwei Techniken nach:

  • Bildkacheln zum Anzeigen, um das Speichern / Verarbeiten aller einzelnen Knoten zu umgehen.

  • Speichern der Endpunkte von Straßen für Routeninformationen sowie Informationen zur Straße.

Das Problem dabei ist, dass ich die nächstgelegene Straße zu meinem GPS-Standort nur mit diesen Informationen nicht berechnen kann. Stellen Sie sich vor, dass ich in einer Kurve auf einer Autobahn nicht feststellen kann, dass ich nur mit den beiden Endpunkten auf der Autobahn bin. Ich habe darüber nachgedacht, Zwischenknoten zwischen Endpunkten zu speichern, aber die Generierung wäre meiner Meinung nach sehr kostspielig. Außerdem ist das Bestimmen der Endpunkte von Straßen (die wie ein T-Split aussehen) höchstwahrscheinlich nicht einmal so einfach, da ich herausfinden muss, ob ich den Mittelpunkt oben auf diesem T-Split speichern muss oder nicht.

Das Anzeigen mit Bildkacheln ist also einfach. Aber ich kann keinen einfachen Weg finden, um Routing und GPS-Positionsbestimmung durchzuführen. Welche Art von Speichertechnik sollte ich untersuchen? Ich finde es etwas unpraktisch, dass aus einer 80 MBDatei eine Datenbank wird, von der 592 MBich diese Größe so weit wie möglich reduzieren möchte ...

Was kann ich tun, um dies so effizient wie möglich zu tun? In Bezug auf Festplatte und CPU. Ich ziele auf ein WP7 ...

Tamara Wijsman
quelle
Wie viel von den 580 MB sind Knoten- / Wegdaten und wie viel ist Index, um schnellen Zugriff auf die Daten zu haben
k3b

Antworten:

4

Es scheint mir, dass das Hauptproblem nur Knoten umfasst, die wichtige Informationen über eine Straße hinzufügen.

Das heißt, ohne Ihre GPS-Anforderung könnten Sie Knoten einfach an Kreuzungen und Endungen speichern (was ich glaube, Sie nennen Start- / Endknoten). Offensichtlich einschließlich Gewicht / Kosten usw.

Eine Möglichkeit, dies zu erreichen, besteht darin, zunächst alle Start- / Endknoten hinzuzufügen. Dies ist das erforderliche Minimum. Offensichtlich sind kurvenreiche Straßen nicht berücksichtigt.

Führen Sie dann für jede Straße (definiert als Ende bis zur Kreuzung oder Kreuzung bis zur Kreuzung) die folgenden Schritte aus:

  1. Durchlaufen Sie alle Zwischenknoten und berechnen Sie den Mindestabstand von jedem Knoten zur Straße, wie er durch die bisher enthaltenen Knoten definiert ist (zunächst nur mit Anfang und Ende).
  2. Wenn die Summe der oben genannten Werte größer ist als (some constant threshold * number of intermediate nodes)erforderlich, müssen Zwischenknoten hinzugefügt werden. Wenn nicht, verlassen Sie die Schleife.
    • Um Zwischenknoten hinzuzufügen, suchen Sie den Knoten, der den größten Abstand zur aktuellen Darstellung der Straße hatte, und fügen Sie ihn hinzu.
George Duckett
quelle
Das macht mehr Sinn, jetzt frage ich mich nur, was eine gute Schwelle wäre. Es scheint schwierig zu sein, all das zu implementieren, obwohl ich von der 582-MB-Datenbank ausgehen kann, die ich bereits habe, anstatt von der 80-MB-komprimierten Datei zu beginnen. Lässt die Frage offen, um zu sehen, welche anderen Ideen auftauchen ... :)
Tamara Wijsman
Sie müssten den Schwellenwert zwischen mehr Knoten (größere Größe) und weniger Knoten (weniger genau) ausgleichen, denke ich. Angenommen, der erste Schritt besteht darin, eine kleinere Datenbank zu generieren, die nur Junctions und Endpunkte enthält.
George Duckett
Sie müssen die Daten zwischen den Knoten haben, einschließlich des tatsächlichen Pfads. Es gibt Kosten zwischen Knoten, aber sie können sich zwischen Kreuzungen ändern. Geschwindigkeitsbegrenzungen und die Anzahl der Fahrspuren ändern sich nicht nur an den Kreuzungen. Um den nächsten Weg zu berechnen, muss der genaue Weg bekannt sein. Die Verbindungslinien zwischen den Knoten zusätzlich zum tatsächlichen Pfad benötigen alle Metadaten für dieses Segment. Diese Metadaten werden für das Routing und die Anweisungen benötigt.
mhoran_psprep
Bei der Wegfindung können Sie wahrscheinlich die Anzahl der Knoten reduzieren, z. B. wenn eine Straße (zwischen Kreuzungen) mehrere Knoten hat, bei denen sich das Tempolimit ändert, das keine Rolle spielt, wenn Sie sich darauf befinden Straße müssen Sie bis zur nächsten Kreuzung weiterfahren. Seien Sie beim Reduzieren von Knoten vorsichtig, um unterschiedliche Geschwindigkeitsbegrenzungen und Längen dieser Geschwindigkeitsbegrenzungen zu berücksichtigen. Das gleiche gilt für die Anzahl der Fahrspuren. Sie müssen sie nur auf ein angemessenes Kantengewicht reduzieren.
George Duckett
Es hängt auch von der Definition von "Kreuzung" ab, welche Bedeutung sich am meisten verringern würde, aber am wenigsten genau wäre, wenn sich zwei oder mehr Straßen treffen. Eine Alternative könnte sein, wenn sich eine Eigenschaft der Straße geändert hat (z. B. Minor-> Major, 30 km-> 40 km usw.).
George Duckett