gen 28

Condividi

Da un po’ di mesi sono passato da utente a “sviluppatore in erba” di algoritmi con la potente libreria di Sextante GIS (qualcuno la conoscerà come integrazione di gvSIG) interamente scritta in Java e che ha un papà attivissimo: Victor Olaya 8-) . Per chi non la conoscesse, Sextante è una libreria di geoalgoritmi in grado di interfacciarsi con i dati geografici attraverso specifici Bindings (tra cui per gvSIG, OpenJump ed anche le GeoTools). Non entro nel merito su come funzionano i bindings, ma possiamo intenderli come delle interfacce tra Sextante e le applicazioni desktop GIS.

Credo che molti di noi utenti GIS abbiano una volta almeno desiderato sviluppare un algoritmo di analisi spaziale per uno scopo ben preciso :-) A volte ci viene in aiuto la possibilità di costruire dei flussi di lavoro (workflow) possibili anche con Sextante attraverso il suo modelbuilder, ma in questo post proveremo a sviluppare ex novo un geoalgoritmo basato sulla libreria di Sextante.

Ciò che troverete scritto è sostanzialmente tratto e basato sull’ottimo manuale di programmazione Sextante scritto da V. Olaya. Lo scenario applicativo è il seguente: abbiamo installato sul nostro calcolatore un software GIS Open Source (es. gvSIG) esteso con Sextante. Questo breve tutorial presuppone anche una conoscenza di base di Java e un ambiente di sviluppo, in questo caso mi baserò su Eclipse.

Per prima cosa scarichiamo i binari dal sito di Sextante. Appena aperta la cartella, troveremo delle sotto cartelle (bindings, core e help). Ciò di cui avremo bisogno sono i file .jar contenuti nella cartella “core” e che costituiranno le nostre librerie per lo sviluppo dei nostri geoalgoritmi.

A questo punto possiamo avviare Eclipse e creare un nuovo progetto nominandolo “Tutorial”. Adesso creaimo una cartella “lib” dove andremo a collocare i file .jar presenti nella cartella “core” di Sextante. Non ci resta che aggiungere al Build Path del nostro progetto i file presenti nella cartella “lib”.

Bene, adesso dovremo creare un nuovo package (es. it.mionome.sextante.testraster). La struttura di Sextante prevede che ciascun package contenga un algoritmo ed eventuali classi di supporto. Per questo motivo creeremo una nuova classe (senza metodo main)  nominandola MoltplicaRasterAlgorithm – nota bene che il suffisso Algorithm è necessario per essere riconosciuto nel Framework di Sextante come nuovo algoritmo.
Tutti gli algoritmi estendono la classe GeoAlgorithm di Sextante e, pertanto, implementano due metodi:

  • defineCharacteristics()
  • processAlgorithm()

Il primo definisce i parametri dell’algoritmo che serviranno anche per la sua interfaccia grafica; il secondo definisce la struttura dell’algoritmo in termini di calcolo e processi. Procediamo con lo sviluppo di un semplice algoritmo che moltiplica ogni cella di un dato raster in ingresso per un dato valore e restituisce un nuovo raster. Questo esempio è tratto proprio dalla guida citata, ovvero la Programming Guide di Sextante scritta da Victor Olaya.
Ecco come si presenterà la nostra classe dopo averla estesa con GeoAlgorithm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package es.unex.sextante.multiplyRaster;
import es.unex.sextante.core.GeoAlgorithm;
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
public class MoltiplicaRasterAlgorithm extends GeoAlgorithm{
 
@Override
 
public void defineCharacteristics() {
// TODO Auto-generated method stub
 
}
 
@Override
 
public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
// TODO Auto-generated method stub
 
return false;
}
}

Passiamo con il definire il contenuto del primo metodo e, dunque, le caratteristiche del nostro algoritmo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static final String RESULT = "RESULT";
public static final String INPUT = "INPUT";
public static final String VALUE = "VALUE";
public void defineCharacteristics() {
	this.setName("Multiply raster");
	this.setGroup("My algorithm");
	this.setGeneratesUserDefinedRasterOutput(false);
 
	try {
		m_Parameters.addInputRasterLayer("INPUT", "Raster layer", true);
		m_Parameters.addNumericalValue("VALUE", "Value", 1,
				AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
		addOutputRasterLayer("RESULT", "Result");
	} catch (RepeatedParameterNameException e) {e.printStackTrace();
	}
}

Analizziamo il codice passo passo. Dalla riga 5 alla riga 6 vengono definiti il nome ed il gruppo di appartenenza del nuovo algoritmo riferito all’interfaccia grafica della toolbar di Sextante. La riga 7 è necessaria perchè creando un nuovo dato raster in uscita, dovremmo definire le estensioni di tale dato in termini di cella e regione. In questo caso impostiamo di default che il dato in uscita avrà le stesse caratteristiche del dato di ingresso e disattiviamo l’opzione con un false.
Le righe 10,11 e 12 rispondono alle semplici domande: quali sono i dati ed i parametri di input (definibili nella GUI del nostro algoritmo) e quali sono i dati in uscita prodotti. In questo caso necessitiamo di un raster in ingresso, un valore numerico come moltiplicatore ed un dato raster in uscita per cui si debba definire il path di scrittura.

Passiamo adesso a definire il processo di calcolo dell’algoritmo:

1
2
3
4
5
6
7
	public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
		int x,y;
		int iNX, iNY;
		double dValue;
		double dConstant;
		IRasterLayer layer;
                IRasterLayer result;

Per prima cosa definiamo le variabili. Come potrete approfondire nel manuale, Sextante si interfaccia con dati raster, vector e tabelle tramite classi apposite: IRasterLayer, IVectorLayer e ITable.
Adesso possiamo inizializzare le nostre variabili notando come definiamo, a livello di codice, anche l’estensione del raster in uscita (ricordiamo che abbiamo disattivato l’opzione tramite GUI).

8
9
10
11
    layer = m_Parameters.getParameterValueAsRasterLayer("INPUT");
    dConstant = m_Parameters.getParameterValueAsDouble("VALUE");
    GridExtent extent = new GridExtent(layer);
    result = getNewRasterLayer("RESULT", Sextante.getText("Result"), IRasterLayer.RASTER_DATA_TYPE_FLOAT, extent);

Dalla riga 8 alla 11 impostiamo come parametri dell’algoritmo i dati di input immessi tramite GUI. Non ci resta che definire il processo di calcolo. Abbiamo bisogno di due semplici cicli for che scandisca cella per cella ne recuperi il value e lo moltiplichi per il nostro moltiplicatore restituendo il risultato come nuovo value.

12
13
14
15
16
17
18
19
20
21
22
23
layer.setWindowExtent(extent);
		iNX = extent.getNX();
		iNY = extent.getNY();
		for (y = 0; y < iNY && setProgress(y, iNY); y++){
			for(x = 0; x < iNX; x++){
				dValue = layer.getCellValueAsDouble(x, y);
				result.setCellValue(x, y, dValue * dConstant);
			}
		}
		return !m_Task.isCanceled();
	}
}

La riga 21 contiene il codice con cui terminare la procedura del nostro algoritmo.
Ricapitolando…il codice completo sarà il seguente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package es.unex.sextante.multiplyRaster;
import es.unex.sextante.additionalInfo.AdditionalInfoNumericalValue;
import es.unex.sextante.core.*;
import es.unex.sextante.dataObjects.IRasterLayer;
import es.unex.sextante.exceptions.RepeatedParameterNameException;
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
import es.unex.sextante.rasterWrappers.GridExtent;
 
public class MultiplyRasterAlgorithm extends GeoAlgorithm{
 
public static final String RESULT = "RESULT";
public static final String INPUT = "INPUT";
public void defineCharacteristics() {
 
this.setName("Multiply raster");
 
this.setGroup("My algorithm");
 
this.setGeneratesUserDefinedRasterOutput(false);
 
try {
 
m_Parameters.addInputRasterLayer("INPUT", "Raster layer", true);
m_Parameters.addNumericalValue("VALUE", "Value", 1,
AdditionalInfoNumericalValue.NUMERICAL_VALUE_DOUBLE);
addOutputRasterLayer("RESULT", "Result");
 
} catch (RepeatedParameterNameException e) {e.printStackTrace();
 
}
 
}
 
public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
 
int x,y;
int iNX, iNY;
double dValue;
double dConstant;
IRasterLayer layer;
IRasterLayer result;
 
layer = m_Parameters.getParameterValueAsRasterLayer("INPUT");
dConstant = m_Parameters.getParameterValueAsDouble("VALUE");
GridExtent extent = new GridExtent(layer);
result = getNewRasterLayer("RESULT", Sextante.getText("Result"), IRasterLayer.RASTER_DATA_TYPE_FLOAT, extent);
 
layer.setWindowExtent(extent);
iNX = extent.getNX();
iNY = extent.getNY();
for (y = 0; y < iNY && setProgress(y, iNY); y++){
for(x = 0; x < iNX; x++){
dValue = layer.getCellValueAsDouble(x, y);
result.setCellValue(x, y, dValue * dConstant);
}
 
}
return !m_Task.isCanceled();
}
}

Siamo pronti per testare il nostro algoritmo. Esportiamo i nostri sorgenti come file .jar prestando attenzione al nome del file che dovrà contenere il prefisso “sextante”. Ad esempio potremmo nominare il nostro file: “sextante_test”.
Copiamo il nostro jar nella cartella “es.unex.sextante” presente nella directory “extensiones” di gvSIG. A questo punto troveremo nella toolbar di Sextante un nuovo gruppo di algoritmi “My Algorithm” con il geoalgoritmo “Multiply raster”.
Spero che possa avere stimolato la vostra curiosità e vi invito ancora una volta a consultare e approfondire questi argomenti nel manuale scritto da Olaya (a cui si riferisce questo post).

Spero presto di aggiungere la seconda parte con un algoritmo nel mondo vector (..tratto sempre dallo stesso manuale in inglese) :lol:

Tagged with:
nov 06

Condividi


In seguito alla lettura del Blog dei miei colleghi e amici di TANTO, ho pensato interessante fissare anche nel mio diario alcune riflessioni scaturite da percorsi di ricerca e che ritengo condivise da molti ;-)

È in corso una rivoluzione contemporaneamente concettuale, metodologica e operativa e che trova il suo nucleo nell’informazione geografica e nell’aggiornamento dei modelli di conoscenza dei fenomeni territoriali che si sviluppano sulla base delle interazioni e contaminazioni tra la mole di dati geografici pubblici e “privati” e la filosofia e la tecnologia dell’era Web 2.0. Ciò ci suggerisce che anche il contesto in cui si sviluppano oggi i processi decisionali si complica, o potremo dire si arricchisce di un ulteriore “binario di saperi” che sono prodotti dalla collettività o da aggregazioni di individui, ma non per questo meno utili e validi di quelli distribuiti dalle fonti istituzionali.
«Web 2.0 a supporto dei processi decisionali inclusivi». Così Stefano Fiaschi definisce ciò che rappresenta di fatto un possibile scenario di svolta generato dall’utilizzo delle nuove tecnologie dell’informazione. Il tema centrale è quello della democrazia partecipativa basata sull’idea che la partecipazione alla “cosa pubblica” includa tra gli attori anche tutti i cittadini direttamente interessati dalle decisioni che le istituzioni prendono per il proprio territorio. Michele Vianello ci ricorda inoltre che «la conoscenza non è un gioco “individuale”, ma è figlia di un processo di collaborazione che deve coinvolgere i cittadini». Tende a configurarsi, dunque, nell’era della Digital Earth e del Web 2.0 l’integrazione, in un unico modello di conoscenza, di tutti gli elementi conoscitivi di un territorio “adottato” tra soggetti, attori e comunità attivi nelle azioni di monitoraggio, gestione e governo del territorio. L’uso appropriato e creativo delle nuove tecnologie consentirebbe di “fare rete” tra tutti i soggetti interessati, a vario titolo, in azioni che hanno per oggetto il territorio. in tale scenario il Geotagging consente una partecipazione attiva della comunità locale dandole la possibilità di segnalare problemi, forme di disagio ma anche istanze progettuali e proposte per una gestione partecipata del proprio territorio.

Le prime sperimentazioni di social geotagging per il monitoraggio partecipato del territorio sono rintracciabili nel progetto britannico pioniere di FixMyStreet attraverso cui è possibile segnalare geograficamente un problema attinente al tema della manutenzione della viabilità (www.fixmystreet.com/). Questo progetto è stato anche il modello su cui si è basata parte della strategia di Amministrare 2.0 del Comune di Venezia che, tra i servizi Web 2.0 messi a disposizione per la propria cittadinanza digitale, ha attivato una piattaforma attraverso cui è possibile segnalare e localizzare problemi, forme di disagio e questioni attinenti al tema della manutenzione urbana.

In linea con questo scenario è il progetto Geospatial Revolution della Penn State University che pone come obiettivo quello di diffondere conoscenza, o meglio la conoscenza delle potenzialità della rivoluzione basata sulle tecnologie local-based.
Il progetto ambizioso quanto estremamente  interessante e stimolante si articolerà in 8 episodi di cui, attualmente, ne sono disponibili i primi due.

Grazie al mio Blog preferito di TANTO ed alle persone che alimentandolo sempre stimolano la curiosità di tutti noi studiosi, professionisti o semplici utenti che vivono questa rivoluzione geografica in cui il territorio lo fa da protagonista ;-)

Tagged with:
giu 09

Condividi


Sicuramente è noto il mondo delle “macchine virtuali” con cui possiamo avere disponibili nei nostri pc vari sistemi operativi che usiamo per test o semplicemente perchè alcuni software che non sono platform indipendent.
L’anno scorso mi è capitato di utilizzare GISVM come macchina virtuale (un disco virtuale con Ubuntu ed una ricca suite di sw GIS open source). Grazie a GISVM ho potuto ovviare ad una serie di problemi di compatibilità e librerie tra alcuni sw GIS e Windows (soprattutto Vista) ed oggi questa macchina virtuale è giunta alla Beta 2. Personalmente mi sono trovato talmente bene che ancora oggi svolgo le lezioni GIS sul mio mac con la VM di GISVM in Ubuntu ;-)

In questi giorni ho appreso che anche un’altra Virtual Machine con un Live DVD è alla terza release con alcune novità che mi hanno solleticato e che ben presto testerò sempre sul mio mac. Il suo nome è Arramagong, la cui distribuzione (come nel caso di GISVM) è libera e disponibile nel web. Tra le novità più interessanti di questa terza edizione, sicuramente le nuove release di Geoserver 2.0, gvSIG 1.9, Kosmo 2.0 e GRASS 6.4 incluse nella VM.

E’ chiaro che tutti questi software possono essere installati singolarmente sulle proprie macchine – nel sito si legge che è presente una cartella con i diversi installer – ma volete mettere la possibilità di disporre di strumenti desktop ed anche server in un solo colpo!
Personalmente ritengo sia GISVM che Arramagong due VM GIS open source molto utili e versatili soprattutto per la didattica GIS e consiglio di provarle sulle proprie macchine 8-)

 
preload preload preload