In questo articolo vedremo come utilizzare il toolkit GeoTools, composto da una serie di librerie Open Source scritte in Java, che permette di effettu
In questo articolo vedremo come utilizzare il toolkit GeoTools, composto da una serie di librerie Open Source scritte in Java, che permette di effettuare le tipiche operazioni di un sistema GIS su informazioni derivanti da dati geografici. Un GIS (Geographic(al) Information System, in italiano Sistema Informativo Geografico) è un sistema informativo computerizzato che permette di acquisire, gestire, manipolare e visualizzare dati georeferenziati e si distingue da quello che viene chiamato sistema SIT (Sistema Informativo Territoriale) il quale include al suo interno anche le organizzazioni (composte da uomini, strumenti e procedure) che si occupano del sistema GIS.
L’informazione territoriale può essere codificata in un sistema informativo geografico attraverso due tipologie principali di dato: il dato vettoriale e il dato raster.
I dati vettoriali sono costituiti da elementi semplici quali punti, linee e poligoni, codificati e memorizzati sulla base delle loro coordinate. Un punto viene individuato in un sistema informativo geografico attraverso le sue coordinate reali (x1, y1); una linea o un poligono attraverso la posizione dei suoi nodi (x1, y1; x2, y2; …). A ciascun elemento è associato un record del database informativo che contiene tutti gli attributi dell’oggetto rappresentato.
Il dato raster permette di rappresentare il mondo reale attraverso una matrice di celle, generalmente di forma quadrata o rettangolare, dette pixel. A ciascun pixel sono associate le informazione relative a ciò che esso rappresenta sul territorio. La dimensione del pixel (detta anche pixel size), generalmente espressa nell’unità di misura della carta (metri, chilometri etc.), è strettamente relazionata alla precisione del dato.
I dati vettoriali e i dati raster si adattano ad usi diversi. La cartografia vettoriale è particolarmente adatta alla rappresentazione di dati che variano in modo discreto (ad esempio l’ubicazione dei cassonetti dei rifiuti di una città o la rappresentazione delle strade o una carta dell’uso del suolo), la cartografia raster è più adatta alla rappresentazione di dati con variabilità continua (ad esempio un modello digitale di elevazione o una carta di acclività del versante).
Uno dei formati più utilizzati per la memorizzazione di dati vettoriali è lo shapefile ESRI. Il formato è stato sviluppato e regolato da ESRI ed emesso come open standard, allo scopo di accrescere l’interoperabilità fra i sistemi ESRI e altri GIS. Di fatto è diventato uno standard per il dato vettoriale spaziale, e viene usato da una grande varietà di sistemi GIS.
Con “shapefile” si indica di norma un insieme di file con estensione .shp, .dbf, .shx, altre che hanno in comune il prefisso dei nomi (per es. “laghi.*”). Spesso con shapefile si indica però solo i file “.shp”. Tuttavia questo file da solo è incompleto poiché interpretazione ed utilizzo dipendono dagli altri file.
Gli shapefile descrivono spazialmente punti, poligoni, polilinee utilizzabili, ad es., per rappresentare stagni, laghi e fiumi, rispettivamente. A ciascun elemento possono essere associati ulteriori attributi che descrivono le voci (ad es. nome o temperatura).
Uno shapefile è considerato come un unico insieme, ma in realtà è l’insieme di più file. Tre file sono obbligatori, senza di essi uno shapefile non è tale; ad essi si possono aggiungere altri 9 file che conservano indici e dati accessori. Tutti i file di uno Shapefile sono allocati nella stessa cartella:
File obbligatori:
- .shp – il file che conserva le geometrie;
- .shx – il file che conserva l’indice delle geometrie;
- .dbf – il database degli attributi.
File opzionali:
- .sbn e .sbx – indici spaziali;
- .fbn e .fbx – indici spaziali delle feature in sola lettura;
- .ain e .aih – indici attributari dei campi della tabella;
- .prj – il file che conserva l’informazione sul sistema di coordinate, espresso in Well-Known Text;
- .shp.xml – metadato dello shapefile;
- .atx – indice attributario della tabella (file .dbf) nella forma <nome_shapefile>.<nome_colonna>.atx (ArcGIS 8 e superiori).
Una descrizione dettagliata del formato viene fornita nel seguente file pdf tratto dal sito della ESRI:
http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
Possiamo reperire degli shapefile di esempio dalle seguenti URL:
- OpenStreetMap project: http://download.geofabrik.de/
- Raccolta di shapefile: http://www.statsilk.com/maps/download-free-shapefile-maps
- Elenco di siti da cui scaricare dati cartografici nazionali: http://www.portalecartografico.it/nazionali.html
- GADM database (Global Administrative Areas): http://www.gadm.org/country
Dal sito dell’Istat è possibile inoltre scaricare gli shapefile delle Regioni, Province e Comuni di Italia raggruppati per anno (2001, 2008 e 2010):
http://www.istat.it/it/strumenti/territorio-e-cartografia
Vediamo ora come poter realizzare uno strumento che ci permetti di visualizzare dei dati georeferenziati in formato shapefile. A questo scopo utilizziamo il toolkit GeoTools che possiamo scaricare dal sito Sourceforge:
http://sourceforge.net/projects/geotools/files/
scegliamo l’ultima release e la versione già compilata (geotools-version-milestone-bin.zip), la quale include una serie di librerie .jar. In alternativa è possibile scaricarne i sorgenti e compilarli utilizzando Maven.
Creiamo a questo punto un Progetto Java all’interno del nostro Editor Eclipse, cliccando su File -> New -> Java Project. Il pacchetto che abbiamo scaricato contiene una pletora di librerie, per il nostro esempio possiamo includere solo quelle qui di seguito elencate:
- commons-pool-1.5.4.jar;
- geoapi-2.3-M1.jar;
- geoapi-pending-2.1-M1.jar;
- gt-api-version-milestone.jar;
- gt-coverage-version-milestone.jar;
- gt-data-version-milestone.jar;
- gt-epsg-extension-version-milestone.jar;
- gt-grid-version-milestone.jar;
- gt-main-version-milestone.jar;
- gt-metadata-version-milestone.jar;
- gt-referencing-version-milestone.jar;
- gt-render-version-milestone.jar;
- gt-shapefile-version-milestone.jar: questa è la libreria che ci consente di leggere i file che compongono lo shapefile;
- gt-shapefile-renderer–version-milestone.jar;
- gt-swing-version-milestone.jar;
- jdom-1.0.jar;
- jsr-275-1.0-beta-2.jar;
- jts-1.11.jar;
- miglayout-3.7-swing.jar.
- vecmath-1.3.2.jar.
Una volta copiati questi jar in una cartella del nostro progetto (ad esempio lib), dobbiamo aggiungerli al Build Path.
Possiamo ora provare il toolkit utilizzando questo semplice codice:
package it.appuntisoftware; import java.io.File; import org.geotools.data.CachingFeatureSource; import org.geotools.data.FeatureSource; import org.geotools.data.FileDataStore; import org.geotools.data.FileDataStoreFinder; import org.geotools.map.DefaultMapContext; import org.geotools.map.MapContext; import org.geotools.swing.JMapFrame; import org.geotools.swing.data.JFileDataStoreChooser; public class GISDemo{ public static void main(String[] args) throws Exception { //Visualizza una finestra per la scelta del file di tipo shapefiles File file = JFileDataStoreChooser.showOpenFile("shp", null); if (file == null) { return; } FileDataStore store = FileDataStoreFinder.getDataStore(file); FeatureSource featureSource = store.getFeatureSource(); // Crea una mappa e vi aggiunge lo shapefile MapContext map = new DefaultMapContext(); map.setTitle("La mappa dei Comuni d'Italia"); map.addLayer(featureSource, null); // Visualizza la Mappa JMapFrame.showMap(map); } }
Lanciamo il nostro progetto e ci verrà presentato a video un pannello attraverso cui scegliere dal nostro FileSystem il file .shp:
in questo esempio sto caricando lo shapefile dei comuni italiani del 2010.
Terminata la fase di caricamento e rendering ci verrà mostrato un pannello che visualizza le informazioni geografiche dei comuni italiani con degli strumenti di zoom e di selezione:
Utilizzando la quarta icona (procedendo da sinistra) sulla barra degli strumenti in alto, possiamo ottenere il dettaglio di un particolare punto sulla mappa:
in particolare vengono visualizzare le coordinate (x,y) del punto in cui si è cliccato.
L’applicazione ha un problema di performance in quanto ad ogni refresh dell’immagine, ad esempio quando viene zoomata, viene riletto lo shapefile dal disco, per evitare ciò possiamo caricarlo in memoria utilizzando un meccanismo di caching implementto dalla classe CachingFeatureSource. Possiamo dunque reimplementare il nostro metodo in questo modo:
public void usingFeatureCaching() throws Exception { File file = JFileDataStoreChooser.showOpenFile("shp", null); if (file == null) { return; } FileDataStore store = FileDataStoreFinder.getDataStore(file); FeatureSource featureSource = store.getFeatureSource(); CachingFeatureSource cache = new CachingFeatureSource(featureSource); //abbiamo aggiunto questa riga MapContext map = new DefaultMapContext(); map.setTitle("La mappa dei Comuni d'Italia - utilizzando il caching"); map.addLayer(cache, null); //gli passiamo l'oggetto cache JMapFrame.showMap(map); }
Il nostro esempio è funzionante, ma sulla consolle viene visualizzata la seguente avvertenza:
17-dic-2010 16.33.55 org.geotools.factory.FactoryRegistry scanForPlugins
AVVERTENZA: Can’t load a service for category “MathTransformProvider”. Cause is “NoClassDefFoundError: javax/media/jai/WarpAffine”.
Per eliminare tale avvertenza dobbiamo scaricare la libreria Java Advanced Imaging (JAI) dal seguente indirizzo:
https://jai.dev.java.net/binary-builds.html
per i nostri scopi possiamo scegliere quella senza accelerazione nativa (jai-1_1_3-lib.zip), e la aggiungiamo al nostro Build-Path.
COMMENTS
E’ possibile realizzare un mini tutorial sull’accesso diretto al db gis per la scrittura delle informazioni di georeferenziazione e per la sua successiva estrapolazione e trasformazione in formato kml?…
Grazie e complimenti per il vostro lavoro…
Non sono un grande esperto dell’argomento, vedrò se riesco a fare almeno qualche articolo sui primi passi, grazie per aver letto il mio post.
Ciao,
non capisco se passando il file .shp va a prendere in automatico anche il .shx e il .dbf presente nello stesso path del .shp. In caso contrario sai come si fa a visualizzare sulla mappa anche il contenuto dei .shx e .dbf?
Grazie,
Valerio
grazie, post molto interessante.
E’ possibile ottenere informazioni sulle coordinate dei perimetri per provincie e comuni?