Come posso archiviare in modo efficiente tutti i dati di OpenStreetMap in modo indicizzato?

8

Ho un file PBF che contiene le seguenti informazioni su un Paese:

  • Nodi, ciascuno con la propria longitudine, latitudine e proprietà; utilizzato per memorizzare punti in uno spazio 2D.

  • I modi, ciascuno con le loro proprietà, sono connessi attraverso i nodi; usato per memorizzare strade, confini.

Sebbene questo file sia solo 80 MB nella sua forma compressa, è 592 MB quando non è compresso e memorizzato in un DB.

Sì, e questo è solo per un paese, il Belgio. Immagina di mettere insieme Francia, Germania e Italia.

Prendiamo ad esempio una singola autostrada, da Anversa a Bruxelles fino a Charleroi. Ciò consisterebbe in una tonnellata di nodi per memorizzare tutti i turni in autostrada, ma ho bisogno di tutti questi turni? Ne dubito.

Lascia che ti dica cosa voglio essere in grado di fare:

  • Voglio visualizzare la mappa a diversi livelli di zoom; principali città, città minori e livello stradale almeno.

  • Voglio poter ottenere informazioni sul routing tra due punti.

  • Voglio essere in grado di calcolare la strada più vicina alla mia posizione GPS.

  • Cerca una posizione, tramite un indice nel database.

Ma, soprattutto, il database non dovrebbe essere troppo grande come verrà memorizzato su un dispositivo mobile .

Quindi, ho pensato a una combinazione di due tecniche:

  • Piastrelle di immagini a scopo di visualizzazione, per aggirare la memorizzazione / elaborazione di tutti i singoli nodi.

  • Archiviazione degli endpoint delle strade per informazioni sull'instradamento, insieme a informazioni sulla strada.

Il problema con questo è che non posso calcolare la strada più vicina alla mia posizione GPS con solo queste informazioni; immagina che una curva in una strada, non posso determinare che sono sull'autostrada con solo i due endpoint. Stavo pensando di memorizzare nodi intermedi tra gli endpoint ma sarebbe molto costoso generare, credo. Inoltre, determinare i punti finali delle strade (che sono come un T-split) non è probabilmente nemmeno così facile, in quanto ho bisogno di capire se ho bisogno di memorizzare il punto medio in cima a quel T-split o no.

Quindi, la visualizzazione è facile usando le tessere dell'immagine; ma non riesco a trovare un modo semplice per fare routing e localizzazione GPS, che tipo di tecnica di archiviazione dovrei esaminare? Trovo un po 'scomodo che un file 80 MB si trasformi in un database di 592 MB , voglio ridurre quella dimensione il più possibile ...

Cosa posso fare per farlo nel modo più efficiente possibile? In termini di disco e CPU. Sto prendendo di mira un WP7 ...

    
posta Tom Wijsman 06.02.2012 - 13:15
fonte

1 risposta

4

Mi sembra che il problema principale riguardi solo i nodi che aggiungono informazioni significative su una strada.

vale a dire. senza il tuo requisito GPS, potresti semplicemente archiviare i nodi alle giunzioni e alle terminazioni (che penso tu chiami nodi di inizio / fine). Ovviamente includendo peso / costi ecc.

Un modo in cui posso pensare di affrontare questo è, in primo luogo, aggiungere tutti i nodi di inizio / fine. Questo è il minimo necessario. Ovviamente questo non tiene conto delle strade tortuose.

Quindi, per ogni strada (definita come che termina alla giunzione o alla giunzione alla giunzione) procedi come segue:

  1. Passa attraverso tutti i nodi intermedi e calcola la distanza minima da ciascun nodo verso la strada, come definito dai nodi finora inclusi (per iniziare solo con l'inizio e la fine).
  2. Se la somma di quanto sopra è maggiore di (some constant threshold * number of intermediate nodes) , è necessario aggiungere nodi intermedi. Altrimenti, esci dal ciclo.
    • Per aggiungere nodi intermedi trova il nodo che ha la maggiore distanza dalla rappresentazione corrente della strada e aggiungilo.
risposta data 06.02.2012 - 14:36
fonte

Leggi altre domande sui tag