Forum: PC-Programmierung Bibliothek für OSM-Daten-Zugriff


von Vlad T. (vlad_tepesch)


Lesenswert?

Hi,
kann mir jemand empfehlen, welche Bibliotheken (c oder c++) sich dazu 
eigenen OSM pbf-Files zu lesen und möglichst fix zu einer Koordinate die 
Objekte im Umkreis von x Metern zu bekommen.



Ich hab mir libosmium mal angeschaut, aber es sieht da aus, als wenn man 
nur eine Art Handler/Callbacks definiert, die dann einfach für jedes 
Objekt aufgerufen wird und man dann selbst testen muss.

Je nach größe der Datei dauert das natürlich ewig. Wie machen das andere 
Programme? Gibt es besser geeignete Bibliotheken?

von Peter II (Gast)


Lesenswert?

Vlad T. schrieb:
> Je nach größe der Datei dauert das natürlich ewig. Wie machen das andere
> Programme? Gibt es besser geeignete Bibliotheken?

ich habe mir die Daten einfach in eine SQL-DB geladen. Dann kann ich 
sehr schnell auf Punkte und damit Eigenschaften und Linien/Polygone 
zugreifen.

von Vlad T. (vlad_tepesch)


Lesenswert?

und wieso beschleunigt dies das ganze?
wenn ich jetzt eine GPS-Koordinatenpaar habe und alle elemente in x 
Meter umkreis haben will, muss ich trotzdem für alle Elemente in der 
Datenbank die Entfernung berechnen.

von Peter II (Gast)


Lesenswert?

Vlad T. schrieb:
> und wieso beschleunigt dies das ganze?
> wenn ich jetzt eine GPS-Koordinatenpaar habe und alle elemente in x
> Meter umkreis haben will, muss ich trotzdem für alle Elemente in der
> Datenbank die Entfernung berechnen.

ja und nein. Man kann für jedes Objekt ein Rechteck berechnen was seine 
maximalen Aufmaße ist.

Diese Daten werden indiziert. Wenn man jetzt zu einem Punkt wissen will, 
was in der Umgebung ist, rechnen man er einmal aus wie groß das ganze 
maximal als Rechteck ist. Dann holt man sich aus dem Index alle Objekte 
die möglich sind und nur von diesen berechnet man die genaue Entfernung.

geht ruckzuck.

von Vlad T. (vlad_tepesch)


Lesenswert?

Peter II schrieb:
> ja und nein. Man kann für jedes Objekt ein Rechteck berechnen was seine
> maximalen Aufmaße ist.

das is ja wieder ein anderes Problem.

->
http://osmcode.org/osmium-concepts/

Objekte meine ich jetzt im Sinne von OSM-Objekten/Einträgen, die ich zur 
Vereinfachung als Punktförmig annehmen würde.

Peter II schrieb:
> Wenn man jetzt zu einem Punkt wissen will,
> was in der Umgebung ist, rechnen man er einmal aus wie groß das ganze
> maximal als Rechteck ist.
okay

> Dann holt man sich aus dem Index alle Objekte
> die möglich sind und nur von diesen berechnet man die genaue Entfernung.
Das is ja der Knackpunkt

Die haben in der Datenbank (wenigstens) eine Koordinate. Genauso wie 
meine Abfrage.
Ob ein Objekt zurückgegeben werden soll, ergibt sich also aus der 
Entfernungsberechnung zwischen diesen Punkten.

Da die Koordinaten aber wenigstens 2-Dimensional sind, meine Tabelle 
jedoch eindimensional, gibt es keine eindimensionale Ordnung, in der 
Benachbarte 2-dimensionale Punkte auch da benachbart sind.


Wie lösen das die ganzen Kartentools, die auch mit gigabyte-großen 
Karten effizient arbeiten können, wenn ebenso im OSM-File die Ordnung 
der Objekte (ebenfalls eine eindimensionale Liste) nicht definiert ist.

von Peter II (Gast)


Lesenswert?

Vlad T. schrieb:
> Da die Koordinaten aber wenigstens 2-Dimensional sind, meine Tabelle
> jedoch eindimensional, gibt es keine eindimensionale Ordnung, in der
> Benachbarte 2-dimensionale Punkte auch da benachbart sind.

doch gibt es. Man kann auch 2 oder mehr spalten Indizieren.

Jede Datenbank bietet die Möglichkeit nach Name und Vorname einer Person 
zu suchen. Das sind auch 2 Dimensionen.

von Peter II (Gast)


Lesenswert?

Nachtrag:
einige Datenbanken bietet für GPS-Daten auch geeignete Datentype und 
Funktionen an. (z.b. Mysql). Ich habe es halt von Hand gemacht.

von Peter II (Gast)


Lesenswert?

Nachtrag2:

Du kannst auch alle Punkt in ein Raster von ganzzahligen Koordinaten 
einteilen, diesen Vergibst du eine eindeutige Nummer. (Wie ein 
Schachbrett von 0-63).

Wenn du jetzt zu einem Punkt die Umgebung wissen willst, dann kannst du 
alle eindimensional rechnen. Die Umgebung von ID 10 ist dann ID 9,11,2 
und 18. Von diesen IDs holst du dir alle Objekte und rechnest genau 
nach.

von Tom (Gast)


Lesenswert?

https://www.toadworld.com/platforms/mysql/w/wiki/6090.r-tree-indexes

Man kann natürlich auch selbst mit R-Trees etc. herumfummeln.

von Ralf D. (doeblitz)


Lesenswert?

Vlad T. schrieb:
> Wie lösen das die ganzen Kartentools, die auch mit gigabyte-großen
> Karten effizient arbeiten können, wenn ebenso im OSM-File die Ordnung
> der Objekte (ebenfalls eine eindimensionale Liste) nicht definiert ist.

Ich habe bei uns dafür eine Postgres mit PostGIS genommen. Da hast du 
dann in der Datenbank passende zweidimensionale Indizes implementiert 
und bekommst die Daten schnell raus. Der Rechenaufwand wird eben beim 
Laden der Daten in die DB in die Erzeugung der konkret benutzten Indizes 
gesteckt.

Und für den Loadprozeß von Deutschland mit 50km Umkreis haben wir da 
schon jeweils knapp eineinhalb Tage gebraucht (was einmal monatlich 
durchgeführt wurde).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.