2011-08-30 10 views
6

Sto usando osmdroid e mappe scaricate da OSM fino al livello 16. Mi chiedevo se ci fosse un modo per far sì che l'osmdroid usasse la tessera da quel livello di zoom ma la disegnasse più grande.osmdroid - display tiles larger

Il fatto è che le tessere di quel livello hanno abbastanza dettagli per me, ma sono disegnate in piccolo. Ho visto alcune altre app utilizzare gli stessi livelli di tile ma in qualche modo riuscire a disegnarle più grandi.

Grazie

risposta

3

Non si può fare questo senza modificare il codice sorgente di osmdroid. In questo momento, le tessere vengono mostrate alla risoluzione effettiva tranne quando la vista viene animata tra i livelli di zoom. Cioè, le tessere vengono cambiate al termine dell'animazione e la scala è nuovamente impostata su 1. Ho provato alcuni trucchi per mantenere il ridimensionamento quando l'utente tenta di eseguire lo zoom oltre il livello più alto di dettaglio. Funziona visivamente, ma tutte le funzioni che vengono mappate dai pixel alle coordinate della mappa, nonché alcune delle interazioni durante il trascinamento della mappa, si interrompono. Richiederebbe quindi una modifica più significativa della fonte. È fattibile, ma penso che non ne valga davvero la pena - a meno che tu non voglia effettivamente contribuire alla modifica del progetto, e farlo in un modo meno logico.

-1

Un rimedio che rimane all'interno del modello operativo corrente di OSMdroid consiste nell'utilizzare un pacchetto di manipolazione di immagini come ImageMagick o Photoshop per creare un nuovo set di tessere bitmap al livello di zoom superiore.

Quello che devi fare è prendere ogni tessera corrente (256x256px), ridimensionarla, raddoppiare sia la dimensione che la larghezza, e quindi tagliare l'immagine in 4 nuove tessere. Salva ciascuna piastrella in base alla convenzione di denominazione per il nuovo livello di zoom. La convocazione di denominazione della mappa delle tessere è described here, as well as an easy way of getting the 4 new names from the original name

+0

Questo si tradurrebbe in replicando sostanzialmente le piastrelle al successivo livello di zoom più elevato. –

+0

In un certo senso, ma raggiunge comunque il risultato desiderato. – CjS

1

Cloudmade ha il supporto per le tessere ad alta risoluzione che sembrano molto meglio sugli attuali telefoni sul mercato ora. Date un'occhiata qui:

http://developers.cloudmade.com/projects/tiles/documents

vorrei utilizzare le piastrelle normali per i dispositivi ldpi e MDPI, e utilizzare quelli ad alta risoluzione per hdpi e xhdpi dispositivi

+0

Sembra che questo progetto non venga più mantenuto per i piccoli sviluppatori: http://notes.ericjiang.com/posts/741 – elcuco

0

È possibile utilizzare una fonte di piastrelle diverso, per esempio M $ Bing. Questo ha anche nomi di strada più grandi.

1

Per risolvere completamente il problema, esistono due approcci. Il primo è che dovresti generare o rendere le tessere delle mappe da solo con il software di tipo mapnik. Il secondo utilizza il rendering in tempo reale basato su vettori sul telefono cellulare come mapsforge. Il file di configurazione o il file di stile è la chiave in entrambi questi approcci.

2

Uso le tessere offline e l'ho fatto solo per visualizzarle a una risoluzione 2x. La parte importante è la dimensione di 512 pixel, anche se le piastrelle sono 256.

myMapView.setTileSource (new XYTileSource ("Mapnik", ResourceProxy.string.offline_mode, 13, 17, 512, ".png", "http://127.0.0.1")); 
+0

Con una dimensione di tile diversa, come fa osmdroid a calcolare la coordinata di tile reale? – hguser

+0

Se le tessere sono 256x256 e si imposta il tilesource come 512, raddoppierà solo la dimensione delle tessere. In realtà preferisco mettere Leaflet in una webview ora su osmdroid. –

3

La soluzione migliore che ho trovato a questo problema (che ho avuto io stesso prima di oggi), è quello di cambiare la scala nella fonte di piastrelle (sto usando la mia versione di OpenStreetMap):

final float scale = getBaseContext().getResources().getDisplayMetrics().density; 
final int newScale = (int) (256 * scale); 
String[] OSMSource = new String[2]; 
OSMSource[0] = "http://a.tile.openstreetmap.org/"; 
OSMSource[1] = "http://b.tile.openstreetmap.org/"; 
XYTileSource MapSource = new XYTileSource(
     "OSM", 
     null, 
     1, 
     18, 
     newScale, 
     ".png", 
     OSMSource 
); 
map.setTileSource(MapSource); 

variando la scala in accordo con la densità dello schermo è una relativamente buona soluzione. Durante il mio test alcune delle immagini sono leggermente sfocate, ma se riduci il ridimensionamento per quella contingenza ottieni un ottimo risultato.

Questa non è la mia soluzione BTW, l'ho trovato tra i problemi OSMDROID su Github. Grazie a stefangab95.

Problemi correlati