Geolocalizzare i tile OpenStreetMap 2: meglio…

Eccomi di nuovo

un piccolo post di correzione/ampliamento di quanto detto qui in precedenza. Si stava parlando di come identificare, all’interno di un file grafico contenente un tile di una mappa openstreetmap, le coordinate XY corrispondenti a una posizione geografica (latitudine/longitudine). Il metodo che avevo suggerito sostanzialmente consisteva in una interpolazione: conosco le coordinate gps degli estremi dell’immagine, interpolo linearmente e ricavo le coordinate di ciascun pixel. Questo metodo, ahimè, non funziona. O meglio, funziona per mappe in scala ridotta, mentre è assolutamente pessimo per mappe ampie, in cui, per via del tipo di proiezione utilizzato, i gradi di latitudine e longitudine non sono equispaziati.

Dopo aver provato di tutto, compreso studiare un libro di geografia, la soluzione mi è apparsa in sogno ed è di una banalità sconvolgente: basta usare la funzione di conversione coordinate/tile, facendosi ritornare anche i decimali!

Mi spiego meglio: la funzione di cui sopra e già vista in passato, dopo aver modificato il cast per passare da int a float, è:

def deg2num(self, lat_deg, lon_deg, zoom):
   lat_rad = math.radians(lat_deg)
   n = 2.0 ** zoom
   xtile = float((lon_deg + 180.0) / 360.0 * n)
   ytile = float((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
   return (xtile, ytile)

A questo punto supponiamo di avere tra le mani il tile 100,200 con un certo zoom, e di voler trovare la posizione XY di una coppia di coordinate (lat,lon) che sappiamo a priori essere contenuti nel nostro tile. Se passiamo questi parametri alla funzione di cui sopra (lat, lon e zoom), dovremmo ottenere un risultato del tipo:

(100,12345 200,65432)

Ovvero le coordinate intere del nostro tile più una parte decimale. Dobbiamo prendere questi valori e togliere la parte intera, e moltiplicare i decimali rimanenti per la dimensione (rispettivamente larghezza e altezza) del nostro tile in pixel; nel caso dei tile openstreetmap entrambe le dimensioni sono 256.

Voilà!

Questa voce è stata pubblicata in Uncategorized e contrassegnata con , , . Contrassegna il permalink.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...