Geolocalizzare i tile di OpenStreetMap

coordToXYNella scorsa puntata abbiamo visto come creare una mappa scaricando un tile da openstreetmap. In questa puntata vi mostrerò come creare una mappa geolocalizzata, ovvero una mappa in cui è possibile identificare un legame diretto tra la posizione del pixel (x, y) e una posizione geografica (latitudine – longitudine). In questo modo è possibile riportare coordinate geografiche direttamente sull’immagine.

Il procedimento è abbastanza semplice. Per prima cosa ci si procura la mappa. Supponiamo di scaricarla da OSM col metodo visto in precedenza. Sempre in precedenza abbiamo visto come calcolare gli indici del tile da scaricare a partire dalle coordinate di un punto e dallo zoom. E’ possibile anche l’operazione inversa: a partire dagli indici e dallo zoom è possibile calcolare le coordinate geografiche di un punto (in punto in alto a sinistra, ovvero a nord-ovest) nel tile.

import math
def num2deg(self, xtile, ytile, zoom):
  n = 2.0 ** zoom
  lon_deg = xtile / n * 360.0 - 180.0
  lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
  lat_deg = math.degrees(lat_rad)
  return (lat_deg, lon_deg)

Con questa funzione è semplice calcolare le coordinate di tre estremi della mappa, ad esempio gli angoli in alto. Vogliamo calcolare l’ampiezza della mappa sia in lunghezza che in larghezza espressa in gradi. Per trovare le coordinate dell’angolo in alto a destra si usa la funzione precedente sul tile X+1, per calcolare le coordinate dell’angolo in basso a sinistra il tile Y+1.

# calcolo delle coordinate del tile
# a partire dalle coordinate del punto che voglio disegnare
# (la funzione è quella vista nel post precedente)
x, y = deg2num(lat, lon, zoom)

# limiti mappa
upperLeftLat, upperLeftLon = num2deg(x, y, zoom)
upperRightLat, upperRightLon = num2deg(x+1, y, zoom)
bottomLeftLat, bottomLeftLon = num2deg(x, y+1, zoom)

A questo punto abbiamo le coordinate degli estremi della mappa, non dobbiamo fare altro che calcolare le dimensioni della mappa in pixel e fare le dovute proporzioni.

# coordinate da individuare sulla mappa
lat = XXXXXXX
lon = XXXXXXX

# larghezza e lunghezza della mappa in gradi
deltaLat = upperLeftLat - bottomLeftLat
deltaLon = upperRightLon - upperLeftLon

# larghezza e lunghezza della mappa in pixel
# (supponendo che la mappa sia un oggetto grafico PIL)
imgWidth, imgHeight = oggettoMappa.size

# coordinate calcolate
Y = imgHeight - int(float((lat - bottomLeftLat) * imgHeight) / float(deltaLat))
X = int(float((lon - upperLeftLon) * imgWidth) / float(deltaLon))
Questa voce è stata pubblicata in Uncategorized. Contrassegna il permalink.

Una risposta a Geolocalizzare i tile di OpenStreetMap

  1. Pingback: Geolocalizzare i tile OpenStreetMap 2: meglio… « Appunti, scoperte e invenzioni

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...