SENTIERI
MAPPE/DOWNLOAD
Progetto Grigne
by alsperGIS
RILEVAMENTO
DATI
METODI


Creare mappe custom .kmz per Garmin con QGIS

Versione QGIS usata: 2.14
Tutorial consigliato a che già conosce le nozioni fondamentali di GIS (differenza tra dati raster e vettoriali e sistemi di riferimento) e l'uso basilare di QGIS.


Alcuni ricevitori GPS Garmin, come il mio GPSMAP 64s, permettono di caricare mappe raster personalizzate in formato .kmz (un formato compresso usato da GoogleEarth). C'è però un limite alla dimensione delle immagini che non deve superare i 1024x1024 pixel) e al loro numero può essere al massimo 100 (fino a 500 o 1000 nei dispositivi più evoluti). Il formato .kmz può contenere più immagini e risultare in un mosaico con dimensioni superiori, ma i singoli tasselli devono rispettare i limiti suddetti (massimo 100 con dimensione 1024x1024 pixel).
Una guida ufficiale di Garmin alla realizzazione di mappa custom é https://static.garmincdn.com/shared/it/landing-pages/mappe-topografiche/guida-custom-maps.pdf.
Limitazioni: https://support.garmin.com/faqSearch/en-US/faq/content/UcO3cFueS12IwCnizrJjeA.
Altre informazioni possiamo trovarle sul pdf "Considerazioni utilizzo 62s" scaricabile da https://onedrive.live.com/?id=E97EF30135544EAF%212445&cid=E97EF30135544EAF.

Qui invece voglio spiegare come creare mappe custom usando QGIS.
Esiste il plugin apposito " GarminCustomMap" (https://plugins.qgis.org/plugins/GarminCustomMap/) che permette di salvare la vista (map canvas) di QGIS direttamente come un mosaico .kmz di tasselli .jpg che rispettano le ristrizioni di Garmin. Dalla finestra di dialogo del plugin è possibile scegliere la dimensione in pixel delle singole immagini, la qualità della compressione jpg, il livello di zoom (che determina quanti tasselli vengono creati) e l'ordine che la mappa avra nel dispositivo GPS.
Personalmente, però, non sono rimasto soddisfatto da tale plugin che mi ha creato immagini molto "sgranate" anche con elevati livelli di zoom. Proverò quindi a spiegare un metodo più laborioso (ma proprio per questo anche più didattico) per creare mappe .kmz raster migliori con QGIS partendo da dati raster o vettoriali.
I passaggi sono i seguenti:
- dopo aver impostato la propria mappa in QGIS generare un'immagine raster con il compositore di stampe che abbia sistema di riferimento "Pseudo Mercator" (EPSG:3857);
- suddividere l'immagine in tasselli con usando il plugin "gridSplitter";
- convertire il "*-tileindex.shp" generato da "gridSplitter" in coordinate geografiche (EPSG:4326) e calcolare le coordinate dei limiti nord, sud, est, ovest di ogni poligono;
- creare un file .kml con i riferimenti alle immagini e le relative coordinate e comprimere il tutto in un file .kmz.

Ecco in dettaglio come procedere:



   Creazione dell'immagine con il compositore di stampe di QGIS


Dopo aver impostato la mappa in QGIS con i nostri dati e la simbologia adeguata settiamo il sistema di riferimento (Progetto > Proprietà progetto... > scheda SR) su "WGS 84 / Pseudo Mercator; EPSG:3857" (proiezione usata da Google e da molte altre mappe on-line), quindi apriamo il compositore di stampe (Progetto > Nuova composizione di stampa).
Nella nuova finestra compare un foglio bianco che in genere ha dimensione preimpostata su A4. Sulla destra, nella scheda "Composizione" > riquadro "Page size", possiamo scegliere la preimpostazione personalizzate per specificare Larghezza e Altezza in millimetri oppure in pollici. Più sotto, nel riquadro "Export setting" possiamo indicare la risoluzione di esportazione in dpi ovvero il numero di punti (o pixel) per ogni pollice, quindi se diamo le dimensioni del foglio in pollici basta moltiplicarle per il valore di risoluzione al fine di conoscere la dimensione in pixel dell'immagine finale.
Prima però, è meglio posizionare la mappa sul foglio: con il comando "Layout > Aggiungi mappa" tracciamo un'area rettangolare dove verrà disegnata la mappa. Nella scheda "Proprietà oggetto" impostiamo la scala desiderata, poi con lo strumento "Layout > Sposta elemento" ridimensioniamo il riquadro sull'area che ci interessa (purtroppo la scala cambia quando si modifica la larghezza del riquadro e va reipostata ogni volta, ma con un po' di tentativi ce la possiamo fare; con lo strumento "Layout > Sposta contenuto" possiamo spostare l'area rappresentata all'interno del riquadro). Una volta trovata la dimensione giusta del riquadro andiamo sulla scheda "Composizione" > riquadro "Resize page to content" e clicchiamo su "Resize page" per far adattare la pagina al riquadro, poi nel riquadro "Export setting" cambiamo la "Risoluzione di esportazione" per ottenere le dimensioni in pixel desidarate.
Nel mio caso (mappa delle Grigne) per poter avere tutta l'area della mappa in scala 1:10'000 ho ottenuto una pagina di dimensioni 67,62x87,58 pollici. Ora vorrei avere un'immagine finale di 6144x8142 pixel in modo da poterla ritagliare in 48 (6x8) tasselli da 1024x1024 pixel ciascuno. Quindi cambio le dimensioni della pagina a 61,44x81,92 pollici e imposto una risoluzione di 100 punti per pollice. Cambiando le dimensioni della pagina devo ovviamente riadattare il riquadro della mappa ma basta trascinare un angolo (con lo strumento "Layout > Sposta elemento") fino ad agganciare quello della pagina; la scala della mappa mi cambia a 1:11'006 ma è un valore che mi va ancora bene (è importante non allontanarsi troppo dalla scala per cui è pensata la mappa altrimenti si rischia di alterare le dimensioni di simboli ed etichette compromettendo la leggibilità).
Quando è tutto ok andiamo ancora su scheda "Composizione" > riquadro "Export setting" e spuntiamo l'opzione "Crea world file" in modo da ottenere l'immagine georeferenziata. Infine creiamo l'immagine con "Compositore > Esporta come immagine...", scegliamo cartella, nome del file, formato e nell'ultima finestra che compare dopo aver cliccato su salva controlliamo che l'immagine abbia le dimensioni volute (ATTENZIONE: sebbene a questo punto sia possibile cambiare le dimensioni dell'immagine, consiglio di non farlo poiché si potrebbe creare un file world errato).



   Suddivisione dell'immagine con gridSplitter


Una volta creata l'immagine chiudiamo il compositore di stampe ed importiamo l'immagine in QGIS (basta trascinarla nella vista di QGIS). Dovrebbe comparire una finestra che chiede il sistema di riferimento: selezioniamo "WGS 84 / Pseudo Mercator; EPSG:3857". (Se non compare tale finestra dobbiamo andare su "Layer > Proprietà..." e nella scheda "Generale" specificare il "Sistema Coordinate Riferimento".)
A questo punto facciamo partire il plugin "gridSplitter". (Se ancora non l'abbiamo possiamo installarlo facilmente con "Plugins > Gestisci e installa plugin...", cercando appunto gridSplitter nell'apposito campo di ricerca. Terminata l'installazione il plugin sarà disponibile in "Plugins > gridSplitter > Cut layer to pieces").
Questo plugin ci permette di suddividere l'immagine in tasselli più piccoli per rispettare le limitazioni alle custom maps di Garmin. Il suo uso è abbastanza intuitivo. Nella scheda "Parameters" della finestra di "Grid Splitter" dobbiamo indicare il layer da dividere (cioè l'immagine appena creata e importata), il numero di tasselli nei sensi orizzontale e verticale in cui suddividere l'immagine (nel mio caso 6 e 8) e la cartella in cui saranno salvati i files risultanti (selezioniamo o creiamo un'apposita cartella vuota).



Nella scheda "additional options" meglio dire al plugin di salvare tutti files "all in one folder"; specifichiamo un prefisso per i nomi dei files (ATTENZIONE: il nome NON deve contenere spazi, al loro posto usare "_") e spuntiamo l'opzione "Create Tile index" (il tileindex ci servirà per trovare le coordinate delle immagini risultanti). Ora possiamo cliccare "OK".



Il plugin crea i vari tasselli in formato .tif non compresso (quindi possono occupare parecchio spazio) e un file vettoriale (tileindex) di poligoni ciascuno dei quali rappresenta un tassello. Il tileindex viene subito caricato in QGIS.
I tasselli vanno convertiti in formato .jpg. Per fare questo possiamo un qualsiasi programma di elaborazione immagine oppure, per rimanere su QGIS, usiamo "Raster > Conversione > Conversione formati...". In tal caso spuntiamo l'opzione "Modalità in serie"; selezioniamo la cartella con i tasselli e usiamo la stessa anche per i risultati; scegliamo JPEG come formato in uscita; eventualmente possiamo selezionare il profilo "Compressione JPEG" nelle opzioni di creazione per cambiare la qualità di compressione (di default è 75); togliamo l'opzione "Carica sulla mappa quando finito" e clicchiamo su "OK" per avviare la conversione.
(ATTENZIONE: nella conversione in .jpg NON va usata l'opzione PROGRESSIVE.)



   Coordinate dei tasselli


Per collocare la nostra mappa nella corretta posizione geografica abbiamo bisogno delle coordinate dei limiti nord, sud, est e ovest di ogni tassello; queste si trovano facilmente grazie al tileindex creato da gridSplitter. Per prima cosa dobbiamo convertire il tileindex coordinate geografiche, quindi selezioniamo il layer e con "tasto destro del mouse > Salva con nome" creiamo un nuovo shapefile cambiando il sistema di riferimento in "EPSG:4326 - WGS 84". Selezioniamo il nuovo layer e apriamo la sua tabella degli attributi (Layer > Apri tabella attributi) a cui vanno aggiunti quattro campi contenenti le coordinate che ci servono. Incominciamo dal primo: apriamo il calcolatore di campi (icona con il pallottoliere o CTRL+i); inseriamo un nome per il nuovo campo in uscita (y_max), impostiamo il tipo di campo su "Numero decimale (real)" con lunghezza 12 e precisione 8; nel campo espressione inseriamo " y_max(  $geometry )" che determina la latitudine massima di ogni poligono (troviamo queste funzioni nel gruppo "Geometria" della colonna centrale); alla voce "Anteprima:" dovrebbe comparire la coordinata in gradi, se va bene possiamo cliccare "OK" per creare il nuovo campi.





Ripetiamo la stessa operazione altre tre volte creando i campi y_min, x_max e x_min rispettivamente con le espressioni "y_min(  $geometry )", "x_max(  $geometry )" e "x_min(  $geometry )". Infine salviamo (CTRL+s) e disattiviamo l'editing (CTRL+E).
Dovremmo ottenere una tabella simile a questa:




   Creazione del file .kml


Un file .kml è un semplice file di testo con struttura xml che, nel nostro caso, deve contenere i riferimenti alle immagini e le loro coordinate geografiche.
Ecco un esempio:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>grigne01</name>
    <GroundOverlay>
        <name>grigne01 Tile 1_2</name>
        <drawOrder>30</drawOrder>
        <Icon>
          <href>grigne01_1_2.jpg</href>
        </Icon>
        <LatLonBox>
          <north>45.9454645344</north>
          <south>45.8905647827</south>
          <east>9.34621224066</east>
          <west>9.3380996112</west>
        </LatLonBox>
    </GroundOverlay>
    <GroundOverlay>
...
    </GroundOverlay>
  </Document>
</kml>

Le informazioni che ci servono sono incluse nella tabella del tileindex e questa è contenuta nel file .dbf che compone lo shapefile. Il .dbf è apribile e modificabile con i programmi dedicati ai fogli di calcolo (tipo Excel); per rimanere in ambito open-source possiamo usare Calc di LibreOffice. (I fogli di calcolo non sarebbero pensati per la manipolazione di tabelle, per le quali esistono applicazioni mirate ai database, ma per quello che andremo a fare sono molto più comodi.)
Aperto il .dbf per prima cosa salviamolo in un altro formato (.osd se stiamo usando Calc) in modo da lavorare sul nuovo file e non alterare l'originale.
Nella colonna "location" sostituiamo con un comando di "Trova e sostituisci" il percorso alla cartella dei files (nel mio caso "D:\...\custommap\grigne-0-1\") con una stringa vuota in modo da lasciare solo i nomi delle immagini più l'estensione. Duplichiamo la colonna "location" in modo da averne due affiancate: nella prima eliminiamo l'estensione .tif; nella seconda sostituiamo .tif con .jpg.
Le colonne "row" e "col" possono essere eliminate. Dovremmo così avere 6 colonne. A sinistra di ciascuna di esse inseriamo una colonna vuota. Ora andiamo a riempire le colonne vuote con le seguenti stringhe:

colonna A:  <GroundOverlay><name>
colonna C: </name><drawOrder>30</drawOrder><Icon><href>
(drawOrder indica l'ordine con cui verrà visualizzata la mappa nel caso ve na fossero altre; se vogliamo vederla al di sopra possiamo aumentare il valore)
colonna E: </href></Icon><LatLonBox><north>
colonna G: </north><south>
colonna I: </south><east>
colonna K: </east><west>
colonna M: </west></LatLonBox></GroundOverlay>

Eliminiamo la prima riga con i nomi dei campi ("location" etc.) e sostituiamola con 4 righe dove dobbiamo scrivere:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>grigne-0-1</name>
(ovviamente sostituimo grigne-0-1 con il nome che vogliamo dare alla mappa)

In fondo, invece, aggiungiamo le seguenti due righe:

</Document>
</kml>

La tabella ora dovrebbe apparire più o meno così:



Infine salviamo in formato Testo CSV (.csv), senza separatori di campo né separatori di testo, chiamando il file "doc.kml"; questo file deve essere messo nella stessa cartella dei tasselli .jpg. Se tutto è corretto possiamo caricare "doc.kml" in GoogleEarth per visualizzare il mosaico.



   Creazione del file .kmz


Un file .kmz è semplicemente un archivio di files compressi tra cui è presente un file "doc.kml" e altri files accessori (nel nostro caso i tasselli .jpg). Quindi ci basta selezionare il file "doc.kml" insieme alle immagini .jpg e comprimere tutto in un file "nome.zip". Rinominiamolo in "nome.kmz" e lo potremo caricare sui dispositivi GPS Garmin che accettano CustomMaps.


Vedi esempio di mappa .kmz per dispositivi Garmin nella pagina di DOWNLOAD







Marzo 2017
Alessandro Perego