Ottimizzazione

Concetti generali

La velocità di rendering è cruciale per un’applicazione WebGIS, più che in un’applicazione desktop:

  • gli utenti del web si aspettano di avere tutto disponibile quasi immediatamente
  • ogni utente può inviare richieste alla stessa applicazione; se avete decine o centinaia di utenti, potete facilmente capire che ottimizzare la vostra applicazione web è un compito importante.

Dovete pensare a una pubblicazione web per molti utenti piuttosto che alla visualizzazione di una mappa per un singolo utente.

In modo predefinito, per ogni livello QGIS che aggiungete al vostro progetto Lizmap, potete scegliere dal plugin Lizmap se attivare la visibilità del livello (checkbox Toggled) all’avvio dell’applicazione. Bisogna fare attenzione a non abusare di questa caratteristica, perché se il progetto contiene ad esempio 30 livelli, Lizmap all’avvio invierà una richiesta al server QGIS per ognuno di essi.

Se la casella di controllo Tile singola è spuntata, questo richiederà 30 immagini della dimensione della finestra del tuo browser. Altrimenti, Lizmap, attraverso OpenLayers, richiederà 30 serie di tile (circa 250 per 250 pixel). Ogni tile è un’immagine, e viene creata in funzione della dimensione totale della finestra e del livello di zoom. Pertanto, gli utenti successivi zoomeranno nella stessa area, le piastrelle già generate saranno riutilizzate.

Le tile possono essere messe in cache con due sistemi non esclusivi:

  • Lato server, sulla macchina dove sono installati QGIS server e Lizmap. Se il tile è stato richiesto e generato in precedenza, e non è scaduto, Lizmap lo riutilizza e lo invia al client, evitando una nuova richiesta al server QGIS.
  • Lato client: le tile saranno salvate nella cache del browser e riutilizzate fino alla loro scadenza. Questo evita sia la richiesta al server QGIS che il traffico internet.

La cache del server deve essere generata. Leggi Gestione della cache come amministratore per sapere come generare la cache.

Per ottimizzare le prestazioni, è quindi importante capire come Lizmap utilizza le tile da visualizzare.

Diciamo che avete uno schermo di 1280 per 768 pixel. Se hai tutti i tuoi livelli in tile, Lizmap deve quindi mostrare circa 5 per 3 = 15 tile (256 per 256 pixel ciascuno) per livello, e anche di più per uno schermo più grande. Se i tiles circostanti sono mostrati solo parzialmente, il numero totale sarà ancora maggiore. Una media di 20 tile per strato è una stima ragionevole. Con 30 strati, come nel nostro esempio, questo significherà un totale di circa 20 per 30 = 600 tile (quindi, 600 richieste al server Lizmap) per utente, ad ogni avvio di Lizmap e per ogni zoom & pan. Se avete 10 utenti concorrenti, questo diventa abbastanza pesante per il server, se la cache non è stata generata in precedenza, e il server QGIS deve quindi crearla. Il tempo richiesto per ogni tile dipenderà molto dalle prestazioni del server e dalla complessità del progetto.

La dimensione di ogni tile dipenderà da:

  • il tipo di dati (raster singolo o vettoriale, o combinazione di più strati)
  • il formato immagine scelto (PNG, JPEG)

Un tipico tile potrebbe essere di circa 30 Kb. Nel nostro esempio, il client scaricherà quindi circa 20 per 30 = 600 Kb per strato, il che, per 30 strati, darà un totale di circa 18 Mb, che è pesante sia per il server (molta banda di connessione consumata) che per gli utenti (lungo ritardo, anche con una connessione ragionevolmente veloce).

Questi calcoli mostrano chiaramente che per ottenere buone prestazioni nel webmapping bisogna fare delle scelte, e semplificare il più possibile.

Se si guarda, per esempio, all’approccio adottato da Google Maps o da servizi simili, è abbastanza ovvio che, oltre ad avere server potenti, hanno semplificato il più possibile: solo una serie di tile come strato di base, e pochissimi strati aggiuntivi (e non tutti contemporaneamente). Anche se non puoi creare una mappa così semplice, è comunque importante sapere quali strati devono assolutamente essere mostrati alla prima visualizzazione della mappa, e quali compromessi sono accettabili per i tuoi utenti.

Se il tuo progetto ha 50 livelli da attivare e disattivare, la stragrande maggioranza dei tuoi utenti non ne selezionerà mai la maggior parte. Naturalmente, ci sono casi d’uso reali in cui i singoli livelli devono essere visualizzati selettivamente, e non è quindi possibile raggrupparli per ridurre il numero di livelli visualizzati.

Suggerimenti

Per ottimizzare il più possibile la vostra applicazione, vi suggeriamo di:

  • Creare progetti QGIS separati, e quindi diverse mappe Lizmap, per scopi diversi, raggruppando così i dati in temi logici. Per esempio, una mappa sullo sviluppo urbano con forse 10 strati e una sull’ambiente, con circa 5 strati, sono di solito più leggibili, e molto più veloci, di un unico progetto troppo complesso con tutti i dati. Aggiungere una piccola immagine per ogni progetto aiuterà gli utenti a selezionare il progetto pertinente a prima vista. Puoi anche condividere alcuni degli strati tra diversi progetti, attraverso il meccanismo di incorporamento in QGIS.
  • Usa l’opzione :guilabel: Solo mappe nell’interfaccia web dell’amministratore. Questa opzione permette all’utente di passare automaticamente da una mappa all’altra, attraverso il pulsante Home, mantenendo il più possibile la localizzazione e il livello di zoom. In questo caso, la pagina di benvenuto di Lizmap con la lista dei progetti e le loro miniature non viene visualizzata, e l’utente viene diretto automaticamente ad uno dei progetti, a scelta dell’amministratore.
  • Non mostrare tutti i livelli all’avvio (disattivare la casella di controllo Toggled come descritto sopra). Solo i livelli molto importanti dovrebbero essere visibili in modo predefinito, e gli utenti dovrebbero attivare solo il livello di cui hanno bisogno. Questo permette una sensibile riduzione del numero di richieste e del traffico di rete totale.
  • Creare gruppi di livelli e usare l’opzione Raggruppa come livello nel plugin Lizmap. Generalmente una serie di livelli dello stesso tema generale può essere visualizzata come un insieme, con una scelta appropriata di stili. In questo caso, Lizmap mostrerà una sola casella di controllo per l’intero gruppo, e soprattutto richiederà una sola serie di tiles per l’intero gruppo, riducendo così il numero di tiles e di richieste al server, e il volume totale di dati da scaricare. Verrà visualizzata la legenda del gruppo.
  • Usare l’opzione Singola tile per alcuni livelli. In questo caso, Lizmap richiederà solo un’immagine per livello, di circa la dimensione dello schermo, invece di una serie di piastrelle. Questo ridurrà quindi notevolmente il numero di richieste al server. Per esempio, nel nostro esempio sopra, senza le ottimizzazioni descritte, se tutti i livelli sono visualizzati, ogni utente richiederà 30 immagini (una per livello) per ogni zoom o pan, invece di 480. La dimensione totale dei dati da scaricare è comunque simile. D’altra parte, è molto improbabile che utenti diversi richiedano esattamente la stessa immagine, quindi l’uso di una cache è inutile in questo caso, ed è evitato da Lizmap (le due opzioni si escludono a vicenda). La scelta ottimale (tile singolo vs. tiled) è diversa per i diversi livelli. Per esempio, un livello base complesso, creato combinando 15 livelli individuali, sarà meglio usato come un gruppo (:guilabel: Gruppo come livello), affiancato e messo in cache. Un semplice livello lineare, come una serie di linee di autobus, può essere visualizzato come un singolo tile.
  • Usa l’opzione Nascondi le caselle di controllo per i gruppi: questo evita che gli utenti clicchino su un gruppo con ad esempio 20 livelli senza averne realmente bisogno, sparando così una grande serie di richieste al server. In ogni caso, evitare gruppi di più di 5-10 livelli è di solito una buona pratica.
  • Ottimizzare i dati e il progetto QGIS. Come accennato in precedenza, la pubblicazione di una mappa su Internet cambierà il vostro punto di vista: come detto, dovete ricordare che molti utenti possono raggiungere il server in parallelo, quindi evitare di sovraccaricarlo è fondamentale:
    • crea un indice spaziale per tutti i tuoi livelli vettoriali
    • piramidalizzare tutti i vostri livelli raster (tranne quelli molto piccoli)
    • visualizzare solo i dati in scala appropriata: per esempio, visualizzare uno strato dettagliato di edifici a 1:500.000 non ha senso, poiché l’immagine è quasi illeggibile, e mette molto sotto stress il server
    • utilizzare la versione semplificata di un livello per visualizzarlo in diverse scale. Puoi quindi raggruppare lo strato originale (da visualizzare ad esempio intorno a 1:1.000) con le versioni semplificate (da visualizzare ad esempio intorno a 1:10.000, 1:50.000, ecc.), e :guilabel: Gruppo come livello per lasciare che l’utente lo veda come un unico strato, utilizzando i dati più appropriati ad ogni scala
    • fare attenzione alla riproiezione al volo (OTF). Se, per esempio, si visualizzano dati in Lambert 93 (EPSG:2154) su una mappa di base da OpenStreetmap o Google (in Pseudo Mercator, EPSG:3857), QGIS Server ha bisogno di riproiettare raster e vettori prima di generare la mappa. Questo può avere un impatto sui tempi di rendering per strati grandi e complessi. In Francia, è possibile evitare la riproiezione utilizzando la mappa base da IGN Géoportail direttamente in EPSG:2154
    • essere consapevoli del fatto che certe opzioni di rendering (ad esempio etichette, espressioni, ecc.) possono essere molto impegnative per il server
    • se usi PostGIS, ottimizzalo: aggiungi sempre indici spaziali, indici per campi filtrati, per chiavi esterne, parametri appropriati per la configurazione di PostgreSQL, possibilmente una connessione tramite socket Unix invece di TCP/IP (puoi farlo tramite l’uso di servizi), ecc.
    • utilizzare un formato immagine appropriato. Per i livelli di base, dove non hai bisogno di trasparenza JPEG è di solito l’opzione migliore: le tessere saranno più piccole, e più veloci da scaricare. Per gli altri livelli, prova con PNG di minore profondità (16bit o 8bit): per alcuni simboli, il risultato visivo può essere lo stesso, e le tessere più piccole. Controlla se la qualità dell’immagine è accettabile nel tuo caso
    • Usare la semplificazione lato server se possibile. Leggere Semplificazione lato Server.
  • Aggiornate il vostro server. Questa è sempre un’opzione, ma spesso è inutile se non hai ottimizzato il tuo progetto come descritto sopra. In ogni caso, un server di fascia bassa (ad esempio 2 Gb di RAM, 2 core a 2,2 GHz) non è adatto. Un quad-core veloce con 8 Gb di RAM è un minimo ragionevole. Evitare di installare QGIS server e Lizmap su Windows, è più complesso e più lento.
  • Lizmap evita il download automatico delle legende all’avvio e ad ogni livello di zoom. Questo sarà fatto esclusivamente su richiesta, se la leggenda è visualizzata, risparmiando così una richiesta per livello per ogni zoom.

In dettaglio: come attivare le cache

Nel Lizmap plugin ‣ Livelli, è possibile abilitare per ogni livello o gruppo la cache (lato client e server) per le immagini generate.

Lato server

Questa caratteristica non è compatibile con l’opzione Singola tile. Lizmap Web Client può creare dinamicamente una cache tiles sul server. Questa cache è la memorizzazione delle immagini già generate da QGIS-Server sul server. L’applicazione Lizmap Web Client genera automaticamente la cache man mano che le tiles vengono richieste. Abilitare la cache può alleggerire notevolmente il carico sul server, dato che non vogliamo più tile QGIS-Server di quelle già fatte.

Per attivarlo, è necessario:

  • selezionare la casella Server tile cache.
  • specifica il tempo di scadenza del server della cache in secondi: Expiration (seconds). 0` significa nessuna scadenza sul server, il tile sarà mantenuto sul server fino a quando la cache non sarà cancellata.

L’opzione Metatile permette di specificare le dimensioni dell’immagine in aggiunta per generare un tile. Il principio di Metatile è quello di richiedere al server un’immagine più grande del previsto, per tagliarla alla dimensione della richiesta e restituirla al client web. Questo metodo evita le etichette troncate ai bordi e le discontinuità tra le piastrelle, ma richiede più risorse. Il valore predefinito è 3,3, un’immagine la cui larghezza e altezza sono uguali a 5 volte la larghezza e l’altezza richiesta. Questa opzione è inutile per i raster.

Nota

Per i livelli vettoriali con metatile, dovete impostare la posizione dell’etichetta su una posizione fissa. Se l’etichetta è molto lunga, non dimenticate di usare una funzione di word wrap o di aumentare un po” la dimensione dei metatile. Così le etichette vengono visualizzate nella stessa area.

Lato client

L’opzione Browser client cache permette di specificare un tempo di scadenza per i tiles nella cache del browser web (Mozilla Firefox, Chrome, Internet Explorer, Opera, ecc.) in secondi. Quando si naviga la mappa di Lizmap con il browser, esso memorizza le tiles visualizzate nella sua cache. Abilitare la cache del client può ottimizzare notevolmente Lizmap perché il browser non richiede nuovamente il server per i tiles già nella cache che non sono scaduti.

Avvertimento

I valori 0 e 1 sono equivalenti e non attivano l’opzione.

Suggeriamo di impostare il valore massimo (1 mese equivale a 24 x 3600 x 30 = 2.592.000 secondi), tranne ovviamente per i livelli i cui dati cambiano spesso.

Nota

  • La cache deve essere attivata solo al momento che si padroneggia il rendering, quando si vuole spostare il progetto in produzione.
  • Questi due sistemi di cache, server e client, sono completamente indipendenti l’uno dall’altro. Ma naturalmente, è interessante usarli insieme per ottimizzare l’applicazione e liberare risorse del server.

Centralizzazione della cache con l’integrazione di gruppi e livelli da un progetto principale

In QGIS, è possibile integrare in un progetto, gruppi o strati di un altro progetto (che sarà chiamato «genitore»). Questa tecnica è interessante perché permette di impostare le proprietà dei livelli una sola volta in un progetto e utilizzarle in diversi altri, per esempio per i livelli di base. Nei progetti «figli» che integrano questi livelli, non è possibile cambiare queste proprietà.

Lizmap usa questa caratteristica per centralizzare la cache delle tiles. Per tutti i progetti figli che usano i livelli integrati del progetto padre, Lizmap richiede le tiles di QGIS-Server dal progetto padre, non dai progetti figli. La cache sarà centralizzata nel progetto padre e tutti i progetti figli che usano i livelli beneficeranno della cache condivisa.

Per utilizzare questa funzionalità, è necessario:

  • pubblicare il progetto QGIS padre con Lizmap
    • dovete scegliere the right announced extent in proprietà del progetto ‣ QGIS Server, perché questa estensione sarà riutilizzata in modo identico nei progetti figli.
    • è necessario configurare la cache per integrare i livelli. Inoltre, tieni conto delle opzioni scelte qui (formato immagine, metatilità, scadenza) per utilizzarle come tali nei progetti figli.
    • È possibile nascondere il progetto dalla pagina principale di Lizmap con la casella di controllo in Map ‣ Nascondi il progetto Web Client Lizmap.
  • aprire il progetto figlio e integrare i livelli o i gruppi in questo progetto, per esempio l’ortofoto. Poi è necessario:
    • verificare che l” estensione annunciata in Proprietà progetto QGIS ‣ QGIS Server sia esattamente la stessa del progetto padre.
    • dovete configurare la cache per il livello integrato con esattamente le stesse opzioni di quelle selezionate dal progetto padre: dimensione dell’immagine, scadenza, metatile.
    • è necessario impostare l’id Lizmap del Repository sorgente del progetto padre (quello configurato nell’interfaccia di amministrazione di Lizmap Web Client).
    • il codice del «Progetto sorgente» (il nome del progetto QGIS padre senza l’estensione .qgs) viene inserito automaticamente per i livelli e i gruppi integrati.
  • Pubblicare il progetto figlio sul Lizmap Web Client come al solito.