13.3. Esplorare i formati dati e i campi

13.3.1. Dati Raster

I dati raster GIS sono matrici di celle discrete che rappresentano caratteristiche/fenomeni su, sopra o sotto la superficie terrestre. Ogni cella nella griglia raster ha la stessa dimensione, e le celle sono solitamente rettangolari (in QGIS saranno sempre rettangolari). I tipici insiemi di dati raster includono dati di telerilevamento, come fotografie aeree, o immagini satellitari e dati modellati, come l’elevazione o la temperatura.

A differenza dei dati vettoriali, i dati raster in genere non hanno un record di database associato per ogni cella. Sono geocodificati dalla risoluzione del pixel e dalla coordinata X/Y di un pixel d’angolo del layer raster. Questo permette a QGIS di posizionare correttamente i dati sulla mappa.

Il formato GeoPackage è ideale per memorizzare dati raster quando si lavora con QGIS. Il popolare e potente formato GeoTiff è una buona alternativa.

QGIS fa uso di informazioni di georeferenziazione all’interno del layer raster (ad esempio, GeoTiff) o di un world file associato per visualizzare correttamente i dati.

13.3.2. Dati vettoriali

Molti degli elementi e degli strumenti disponibili in QGIS funzionano allo stesso modo, indipendentemente dalla fonte di dati vettoriali. Tuttavia, a causa delle differenze nelle specifiche dei formati (GeoPackage, ESRI Shapefile, MapInfo e MicroStation, AutoCAD DXF, PostGIS, SpatiaLite, DB2, Oracle Spatial, MSSQL Spatial databases, e molti altri), QGIS può gestire alcune delle loro proprietà in modo diverso. Il supporto è fornito dalla OGR Simple Feature Library. Questa sezione descrive come lavorare con queste specifiche.

Nota

QGIS supporta (multi)punto, (multi)linea, (multi)poligono, CircularString, CurvaComposta, CurvePolygon, MultiCurve, MultiSurface, tutti opzionalmente con valori Z e/o M.

Dovresti anche tener presente che alcuni driver non supportano alcuni di questi formati, come CircularString, CurvaComposta, CurvePolygon, MultiCurve, MultiSurface. QGIS li convertirà.

13.3.2.1. GeoPackage

Il formato GeoPackage (GPKG) è indipendente dalla piattaforma, ed è implementato come un contenitore di database SQLite, e può essere usato per memorizzare sia dati vettoriali che raster. Il formato è stato definito dall’Open Geospatial Consortium (OGC), ed è stato pubblicato nel 2014.

GeoPackage può essere utilizzato per memorizzare quanto segue in un database SQLite:

  • elementi vettore

  • insiemi di immagini di matrici di tasselli e mappe raster

  • attributi (dati non-spaziali)

  • estensioni

Dalla versione 3.8 di QGIS, GeoPackage può anche memorizzare progetti QGIS. I layer di GeoPackage possono avere campi JSON.

GeoPackage è il formato predefinito per i dati vettoriali in QGIS.

13.3.2.2. Formato ESRI Shapefile

Il formato ESRI Shapefile è ancora uno dei formati di file vettoriali più utilizzati, anche se ha alcune limitazioni rispetto ad esempio a GeoPackage e SpatiaLite.

Un insieme di dati in formato ESRI Shapefile è composto da diversi file. I tre seguenti sono obbligatori:

  1. .shp file contenente le geometrie

  2. .dbf file contenente gli attributi in formato dBase

  3. .shx file indici

Un insieme di dati in formato ESRI Shapefile può anche includere un file con un suffisso .prj, che contiene informazioni sulla proiezione. Anche se è molto utile avere un file di proiezione, non è obbligatorio. Un set di dati in formato Shapefile può contenere file aggiuntivi. Per ulteriori dettagli, si veda la specifica tecnica ESRI all’indirizzo https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf.

GDAL 3.1 ha il supporto in lettura e scrittura per il formato compresso ESRI Shapefile (shz e shp.zip).

Migliorare le prestazioni per i insiemi di dati in formato ESRI Shapefile

Per migliorare le prestazioni di visualizzazione di un insieme di dati in formato ESRI Shapefile, puoi creare un indice spaziale. Un indice spaziale migliorerà la velocità di zoom e di spostamento. Gli indici spaziali usati da QGIS hanno un’estensione .qix.

Segui questi passi per creare un indice spaziale:

  1. Carica un insieme di dati in formato ESRI Shapefile (vedi Il Pannello Browser)

  2. Apri la finestra di dialogo Proprietà Layer facendo doppio clic sul nome del layer nella legenda o facendo clic destro e scegliendo Proprietà… dal menu contestuale

  3. Nella scheda Sorgente, clicca sul pulsante Crea Indice Spaziale.

Problemi nel caricare un file .prj

Se carichi un dataset in formato ESRI Shapefile con un file .prj e QGIS non è in grado di leggere il sistema di riferimento delle coordinate da quel file, sarà necessario definire manualmente la proiezione corretta nella scheda Proprietà Layer ► Sorgente del layer cliccando il pulsante setProjection Seleziona SR. Questo è dovuto al fatto che i file .prj spesso non forniscono i parametri di proiezione completi come usati in QGIS ed elencati nella finestra di dialogo SR.

Per lo stesso motivo, se crei un nuovo dataset in formato ESRI Shapefile con QGIS, vengono creati due diversi file di proiezione: un file .prj con parametri di proiezione limitati, compatibili con il software ESRI, e un file .qpj, che fornisce tutti i parametri del SR. Ogni volta che QGIS trova un file .qpj, questo sarà usato al posto del .prj.

13.3.2.3. Files Testo Limitato

I file di testo delimitati sono molto comuni e ampiamente utilizzati a causa della loro semplicità e leggibilità - i dati possono essere visualizzati e modificati in un semplice editor di testo. Un file di testo delimitato è costituito da dati tabulari con colonne separate da un determinato carattere e righe separate da interruzioni di riga. La prima riga di solito contiene i nomi delle colonne. Un tipo comune di file di testo delimitato è un CSV (Comma Separated Values), con colonne separate da virgole. I file di testo delimitati possono anche contenere informazioni di posizione (vedi Memorizzazione di informazioni sulla geometria in un file di testo delimitato).

QGIS ti permette di caricare un file di testo delimitato come layer o come tabella ordinaria (vedi Il Pannello Browser o Importare file di testo delimitato). Prima controlla che il file soddisfi i seguenti requisiti:

  1. Il file deve avere una riga di intestazione con il nome dei campi. Questa deve essere la prima riga del file di testo (preferibilmente la prima riga del file di testo).

  2. Se la geometria deve essere abilitata, il file deve contenere campo(i) per definire la geometria. Questo campo(i) può avere qualsiasi nome.

  3. Le coordinate X e Y (se la geometria è identificata da coordinate) devono essere specificate come numeri. Il sistema di coordinate non è importante.

  4. Se hai un file CSV con colonne non contenenti stringhe, devi avere un file CSVT di accompagnamento (vedi la sezione Utilizzo di file CSVT per controllare la formattazione del campo).

Il file di dati di elevazione elevp.csv nell” insieme dei dati campione di QGIS (vedi la sezione Installare dati campione) è un esempio di un file di testo valido:

X;Y;ELEV
-300120;7689960;13
-654360;7562040;52
1640;7512840;3
[...]

Alcune cose da notare sul file di testo:

  1. Il file di testo di esempio usa ; (punto e virgola) come delimitatore (qualsiasi carattere può essere usato per delimitare i campi).

  2. La prima riga è la riga di intestazione. Questa contiene i campi X, Y e ELEV.

  3. Non si usano virgolette (") per delimitare i campi di testo

  4. Le coordinate X sono contenute nel campo X.

  5. Le coordinate Y sono contenute nel campo Y.

Memorizzazione di informazioni sulla geometria in un file di testo delimitato

I file testo delimitato possono contenere informazioni sulla geometria in due forme principali:

  • Come coordinate in colonne separate (es. Xcol, Ycol… ), per geometrie puntuali di dati;

  • Come well-known text (WKT) rappresentazione della geometria in una singola colonna, per qualsiasi tipo di geometria.

Sono supportati gli elementi con geometrie curve (CircularString, CurvePolygon e CompoundCurve) . Ecco alcuni esempi di tipi di geometria in un file di testo delimitato con geometrie codificate come WKT:

Label;WKT_geom
LineString;LINESTRING(10.0 20.0, 11.0 21.0, 13.0 25.5)
CircularString;CIRCULARSTRING(268 415,227 505,227 406)
CurvePolygon;CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))
CompoundCurve;COMPOUNDCURVE((5 3, 5 13), CIRCULARSTRING(5 13, 7 15,
  9 13), (9 13, 9 3), CIRCULARSTRING(9 3, 7 1, 5 3))

I file di testo delimitati supportano anche le coordinate Z e M nelle geometrie:

LINESTRINGZ(10.0 20.0 30.0, 11.0 21.0 31.0, 11.0 22.0 30.0)

Utilizzo di file CSVT per controllare la formattazione del campo

Quando si caricano i file CSV, il driver OGR assume che tutti i campi siano stringhe (cioè testo) a meno che non gli venga detto altrimenti. Puoi creare un file CSVT per dire all’OGR (e a QGIS) il tipo di dati delle diverse colonne:

Type

Name

Example

Whole number

Integer

4

Decimal number

Real

3.456

Date

Date (YYYY-MM-DD)

2016-07-28

Time

Time (HH:MM:SS+nn)

18:33:12+00

Date & Time

DateTime (YYYY-MM-DD HH:MM:SS+nn)

2016-07-28 18:33:12+00

Il file CSVT è un file di testo normale di UNA sola riga con i tipi di dati racchiusi da virgolette e separati da virgole, ad esempio:

"Integer","Real","String"

Puoi anche specificare la larghezza e la precisione di ogni colonna, ad esempio:

"Integer(6)","Real(5.5)","String(22)"

Questo file viene salvato nella stessa cartella del file .csv, con lo stesso nome, ma con .csvt come estensione.

Puoi trovare maggiori informazioni in GDAL CSV Driver.

13.3.2.4. Layer PostGIS

I layer PostGIS sono memorizzati in un database PostgreSQL. I vantaggi di PostGIS sono l’indicizzazione spaziale, il filtraggio e le possibilità di interrogazione. Usando PostGIS, le funzioni vettoriali come selezionare e identificare funzionano più accuratamente di quanto non avvenga con i layer OGR in QGIS.

Suggerimento

Layer PostGIS

Normalmente, un layer PostGIS è identificato da una voce nella tabella geometry_columns. QGIS può caricare layer che non hanno una voce nella tabella geometry_columns. Questo include sia tabelle che viste. Fai riferimento al tuo manuale PostgreSQL per informazioni sulla creazione di viste.

Questa sezione contiene alcuni dettagli su come QGIS accede ai layer PostgreSQL. La maggior parte delle volte, QGIS dovrebbe semplicemente fornirti una lista di tabelle di database che possono essere caricate, e le caricherà su richiesta. Tuttavia, se hai problemi a caricare una tabella PostgreSQL in QGIS, le informazioni che seguono possono aiutarti a capire i messaggi di QGIS e darti indicazioni per modificare la tabella PostgreSQL o la definizione della vista per permettere a QGIS di caricarla.

Chiave primaria

QGIS richiede che i vettori PostgreSQL contengano una colonna che possa essere usata come chiave univoca per il vettore. Le tabelle devono contenere una chiave primaria o una colonna con un vincolo univoco. Questa colonna deve essere di tipo int4 (un numero intero di 4 byte). Alternativamente, la colonna ctid può essere usata come chiave primaria. Se a una tabella mancano queste informazioni, verrà usata la colonna oid. Le prestazioni saranno migliori se la colonna è indicizzata (le chiavi primarie sono indicizzate automaticamente in PostgreSQL).

QGIS offre una casella di controllo Select at id che è attivata di default. Questa opzione ottiene gli id senza gli attributi, il che è più veloce nella maggior parte dei casi.

Viste

Se il layer di PostgreSQL è una vista sussistono gli stessi requisiti, ma non sempre necessitano chiavi primarie o colonne con vincoli univoci. Devi definire un campo della chiave primaria (deve essere un intero) nella finestra di dialogo di QGIS prima di caricare la vista. Se non c’è una colonna adatta nella vista, QGIS non caricherà il vettore. Se succede la soluzione è di modificare la vista in modo che contenga una colonna adatta (un intero e una chiave primaria con un vincolo univoco, preferibilmente indicizzato).

Come per le tabelle, una casella di controllo Seleziona all’ID è attiva per impostazione predefinita (vedere sopra per il significato della casella di controllo). Può aver senso disattivare questa opzione quando si utilizzano viste impegnative.

Stili di default dei layer QGIS e backup del database

Se vuoi fare una copia di backup del tuo database PostGIS usando i comandi pg_dump e pg_restore, e gli stili di default dei layer come salvati da QGIS non ripristinabili in seguito, devi impostare l’opzione XML su DOCUMENT prima del comando di ripristino.

SET XML OPTION DOCUMENT;

Filtro lato server

QGIS permette di filtrare gli elementi già sul lato server. Controlla Impostazioni ► Opzioni ► Sorgenti Dati ► checkbox Esegui le espressioni lato server se possibile per farlo. Solo le espressioni supportate saranno inviate al database. Le espressioni che usano operatori o funzioni non supportate saranno restituita alla esecuzione in locale.

Supporto di PostgreSQL alle diverse tipologie di dati

I tipi di dati supportati da PostgreSQL includono: intero, numero in virgola mobile, booleano, oggetto binario, dati stringa a lunghezza variabile, geometria, timestamp, array, hstore e json.

13.3.2.5. Importare dati in PostgreSQL

I dati possono essere importati in PostreSQL/PostGIS usando diversi strumenti, come il plugin DB Manager e gli strumenti da riga di comando shp2pgsql e ogr2ogr

DB Manager

QGIS ha un plugin di base chiamato dbManager DB Manager. Si può utilizzare per caricare dati, e include il supporto per gli schemi. Vedi la sezione Plugin DB Manager per ulteriori informazioni.

shp2pgsql

PostGIS include uno strumento chiamato shp2pgsql, che può essere usato per importare set di dati in formato Shapefile in un database compatibile con PostGIS. Per esempio, per importare un set di dati in formato Shapefile chiamato lakes.shp in un database PostgreSQL chiamato gis_data, usa il seguente comando:

shp2pgsql -s 2964 lakes.shp lakes_new | psql gis_data

Questo crea un nuovo layer chiamato lakes_new nel database gis_data. Il nuovo layer avrà un identificatore di riferimento spaziale (SRID) di 2964. Vedi la sezione Lavorare con le proiezioni per maggiori informazioni sui sistemi di riferimento spaziale e le proiezioni.

Suggerimento

Esportare dati da PostGIS

C’è anche uno strumento per esportare insiemi di dati PostGIS in formato Shapefile: pgsql2shp. Viene fornito all’interno della tua distribuzione PostGIS.

ogr2ogr

Oltre a shp2pgsql e DB Manager, esiste un altro strumento per alimentare i dati geografici in PostGIS: ogr2ogr. Fa parte dell’installazione di GDAL.

Per importare un insieme di dati in formato Shapefile in PostGIS, fai come segue:

ogr2ogr -f "PostgreSQL" PG:"dbname=postgis host=myhost.de user=postgres
password=topsecret" alaska.shp

Questo importerà l’insieme dei dati in formato Shapefile alaska.shp nel database PostGIS postgis usando l’utente postgres con la password topsecret sul server host myhost.de.

Nota che OGR deve essere costruito con PostgreSQL per supportare PostGIS. Puoi verificarlo digitando (in nix):

ogrinfo --formats | grep -i post

Se preferisci usare il comando COPY di PostgreSQL invece del metodo predefinito INSERT INTO, puoi esportare la seguente variabile d’ambiente (disponibile solo su nix e osx):

export PG_USE_COPY=YES

ogr2ogr non crea indici spaziali come fa shp2pgsl. Devi crearli manualmente, usando successivamente il normale comando SQL CREATE INDEX, come passo extra (come descritto nella prossima sezione Migliorare le prestazioni).

Migliorare le prestazioni

Recuperare elementi da un database PostgreSQL può essere dispendioso in termini di tempo, specialmente su una rete. Puoi migliorare le prestazioni di estrazione dei layer PostgreSQL assicurandoti che esista un indice spaziale PostGIS su ogni layer nel database. PostGIS supporta la creazione di un indice GiST (Generalized Search Tree) per velocizzare la ricerca spaziale (le informazioni sull’indice GiST sono prese dalla documentazione di PostGIS disponibile all’indirizzo https://postgis.net).

Suggerimento

Puoi usare il DB Manager per creare un indice per il tuo layer. Dovresti prima selezionare il layer e cliccare su Tabella ► Modifica tabella, andare alla scheda Indici e cliccare su Aggiungi indice spaziale.

La sintassi per creare un indice GiST è:

CREATE INDEX [indexname] ON [tablename]
  USING GIST ( [geometryfield] GIST_GEOMETRY_OPS );

Nota che per tabelle grandi, la creazione dell’indice può richiedere molto tempo. Una volta che l’indice è stato creato, si dovrebbe eseguire un VACUUM ANALYZE. Vedi la documentazione di PostGIS (POSTGIS-PROJECT in Letteratura e riferimenti web) per maggiori informazioni.

Il seguente esempio crea un indice GiST:

gsherman@madison:~/current$ psql gis_data
Welcome to psql 8.3.0, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

gis_data=# CREATE INDEX sidx_alaska_lakes ON alaska_lakes
gis_data-# USING GIST (the_geom GIST_GEOMETRY_OPS);
CREATE INDEX
gis_data=# VACUUM ANALYZE alaska_lakes;
VACUUM
gis_data=# \q
gsherman@madison:~/current$

13.3.2.6. Vettori a cavallo dei 180° di longitudine

Molti software GIS non gestiscono al meglio mappe vettoriali con un sistema di riferimento geografico (lat/lon) che attraversa la linea dei 180 gradi di longitudine (http://postgis.refractions.net/documentation/manual-2.0/ST_Shift_Longitude.html). Come risultato, se apriamo una mappa di questo tipo in QGIS, potremmo vedere due luoghi molto separati, che dovrebbero apparire uno vicino all’altro. In Fig. 13.23, il piccolo punto all’estrema sinistra della mappa (Isole Chatham) dovrebbe essere all’interno della griglia, alla destra delle isole principali della Nuova Zelanda.

../../../_images/vectorNotWrapping.png

Fig. 13.23 Mappa in lat/lon a cavallo dei 180° di longitudine

Una soluzione consiste nel trasformare i valori di longitudine utilizzando PostGIS e la funzione ST_Shift_Longitude. Questa funzione legge i punti/vertici di ogni elemento di una geometria e se la coordinata di longitudine è < 0° , aggiunge 360°. Il risultato sarà una versione 0° - 360° dei dati, che verranno poi visualizzati su una mappa centrata a 180°.

../../../_images/vectorWrapping.png

Fig. 13.24 Vettori a cavallo di 180° di longitudine usando la funzione ST_Shift_Longitude

Guida all’uso

  • Importa i dati in PostGIS (Importare dati in PostgreSQL) usando, per esempio, il plugin DB Manager.

  • Usa l’interfaccia da linea di comando di PostGIS per dare il seguente comando (nell’esempio “TABLE” è il nome della tua tabella PostGIS): gis_data=# update TABLE set the_geom=ST_Shift_Longitude(the_geom);

  • Se tutto è andato a buon fine, riceverai la conferma sul numero di geometrie che sono state aggiornate. Potrai cosi caricare la mappa e vedere le differenze (Figure_vector_crossing_map).

13.3.2.7. Vettori SpatiaLite

Se vuoi salvare un vettore usando il formato SpatiaLite, puoi farlo seguendo le istruzioni in Creare nuovi layer da layer esistente. Seleziona SpatiaLite come Formato e inserisci sia Nome file che Nome layer.

Inoltre, puoi selezionare SQLite come formato e poi aggiungere SPATIALITE=YES nel campo Opzioni personalizzate ► Origine dati. Questo dice a GDAL di creare un database SpatiaLite. Vedi anche https://gdal.org/drivers/vector/sqlite.html.

QGIS supporta anche le viste modificabili in SpatiaLite. Per la gestione dei dati di SpatiaLite, puoi anche usare il plugin di base DB Manager.

Se vuoi creare un nuovo layer SpatiaLite, fai riferimento alla sezione Creare un nuovo layer SpatiaLite.

13.3.2.8. Parametri specifici di GeoJSON

Con exporting layers in GeoJSON, sono disponibili alcune specifiche Opzioni del layer. Queste opzioni provengono da GDAL che è responsabile della scrittura del file:

  • COORDINATE_PRECISION il numero massimo di cifre dopo il separatore decimale da inserire in coordinate. I valori predefiniti sono 15 (nota: per le coordinate Lat Lon 6 è considerato sufficiente). La troncatura si verifica per rimuovere gli zeri finali.

  • RFC7946 di default verrà usato GeoJSON 2008. Se impostato su YES, verrà usato lo standard aggiornato RFC 7946. Il default è NO (quindi GeoJSON 2008). Vedi https://gdal.org/drivers/vector/geojson.html#rfc-7946-write-support per le principali differenze, in breve: solo EPSG:4326 è permesso, altri SR saranno trasformati, i poligoni saranno scritti in modo da seguire la regola della mano destra per l’orientamento, i valori di un array «bbox» sono [west, south, east, north], non [minx, miny, maxx, maxy]. Alcuni nomi di estensioni sono vietati negli oggetti FeatureCollection, Feature e Geometry, la precisione predefinita delle coordinate è di 7 cifre decimali

  • WRITE_BBOX impostato su YES per includere il perimetro di delimitazione delle geometrie a livello di elemento e insieme di elementi

Oltre a GeoJSON c’è anche un’opzione per esportare in «GeoJSON - Newline Delimited» (vedi https://gdal.org/drivers/vector/geojsonseq.html). Invece di una FeatureCollection con Features, puoi esportare un tipo (probabilmente solo Features) separato sequenzialmente con newline.

GeoJSON - Newline Delimited ha anche alcune opzioni specifiche per i Layer:

  • COORDINATE_PRECISION vedi sopra (come per GeoJSON)

  • RS se iniziare i record con il carattere RS=0x1E. La differenza è come gli elementi sono separati: solo da un carattere newline (LF) (Newline Delimited JSON, geojsonl) o aggiungendo anche un carattere record-separator (RS) (dando GeoJSON Text Sequences, geojsons). Il valore predefinito è NO. Ai file viene data l’estensione .json se l’estensione non è fornita.

13.3.2.9. Layer DB2 Spatial

IBM DB2 per Linux, Unix e Windows (DB2 LUW), i prodotti IBM DB2 per z/OS (mainframe) e IBM DashDB consentono agli utenti di memorizzare e analizzare i dati spaziali nelle colonne della tabella relazionale. La funzione DB2 per QGIS supporta la gamma completa di visualizzazione, analisi e manipolazione dei dati spaziali in questi database.

La documentazione utente su queste funzionalità può essere trovata in DB2 z/OS KnowledgeCenter, DB2 LUW KnowledgeCenter e DB2 DashDB KnowledgeCenter.

Per ulteriori informazioni sul funzionamento delle opzioni spaziali DB2, consulta il Tutorial DB2 Spatial Tutorial su IBM DeveloperWorks.

La funzionalità DB2 attualmente supporta solo l’ambiente Windows tramite il driver ODBC di Windows.

Il client che esegue QGIS deve disporre di uno dei seguenti componenti installati:

  • DB2 LUW

  • IBM Data Server Driver Package

  • IBM Data Server Client

Per aprire un dato DB2 in QGIS, vedi la sezione Il Pannello Browser o Caricare layer da Database.

Se stai accedendo a un database DB2 LUW sulla stessa macchina o usi DB2 LUW come client, gli eseguibili DB2 e i file di supporto devono essere inclusi nel percorso di Windows. Questo può essere fatto creando un file batch come il seguente con il nome db2.bat e includendolo nella cartella %OSGEO4W_ROOT%/etc/ini:

@echo off
REM Point the following to where DB2 is installed
SET db2path=C:\Program Files (x86)\sqllib
REM This should usually be ok - modify if necessary
SET gskpath=C:\Program Files (x86)\ibm\gsk8
SET Path=%db2path%\BIN;%db2path%\FUNCTION;%gskpath%\lib64;%gskpath%\lib;%path%