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?
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.
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.
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.
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.
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.
Nachtrag: einige Datenbanken bietet für GPS-Daten auch geeignete Datentype und Funktionen an. (z.b. Mysql). Ich habe es halt von Hand gemacht.
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.
https://www.toadworld.com/platforms/mysql/w/wiki/6090.r-tree-indexes Man kann natürlich auch selbst mit R-Trees etc. herumfummeln.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.