GeoTools: un toolkit Open Source Java per il GIS

GeoTools: un toolkit Open Source Java per il GIS

In questo articolo vedremo come utilizzare il toolkit GeoTools, composto da una serie di librerie Open Source scritte in Java, che permette di effettu

Tutorial Apache POI: creiamo un file Excel
Un toolkit per la misura delle performance: Java Microbenchmark Harness
Accedere con JNDI ad un Naming Service: il FileSystem

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:

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:

Carichiamo il nostro 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:

La mappa dei comuni italiani con i relativi confini

Utilizzando la quarta icona (procedendo da sinistra)  sulla barra degli strumenti in alto, possiamo ottenere il dettaglio di un particolare punto sulla mappa:

Cliccando sul comune di roma vengono visualizzate alcune informazioni del comune

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

WORDPRESS: 4
  • comment-avatar
    Antonio 13 anni ago

    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…

    • comment-avatar

      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.

  • comment-avatar
    Valerio 12 anni ago

    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

  • comment-avatar
    Andrea 10 anni ago

    grazie, post molto interessante.
    E’ possibile ottenere informazioni sulle coordinate dei perimetri per provincie e comuni?