:: Python :: v.somma :: |
|---|
|
L'esempio che si andrà a realizzare prevede la selezione di una copertura vettoriale e di
una colonna contenente valori numerici del suo database associato. Lo script, estratti
i valori dalla colonna, ne effettuerà la somma e ne mostrerà il valore.
Uno script Pytnon per Grass si compone di varie parti che andremo ad analizzare singolarmente. Chi ha già scritto degli applicativi in qualsiasi linguaggio sa quanto sia importante, per le revisioni del codice, iniziare con tutte le informazioni riguardanti la sua stesura; si ricordi che in Python i commenti hanno inizio con il simbolo "#". Si riportano di seguito le righe di commento di v.somma.py, sottolineando che la prima riga di codice, iniziante con i caratteri "#!", non può essere omessa, difatti essa ha lo scopo di comunicare all'interprete che si sta lanciando uno script Python:
#!/usr/bin/env python
#****************************************************************
#*
#* MODULE: v.somma, v 1.0.0
#*
#* AUTHOR(S): Antonio Alliegro
#*
#* PURPOSE: Calcola la somma dei valori di una colonna di
#* tipo numerico
#*
#* COPYRIGHT: (C) 2011 Antonio Alliegro Civil Engineer
#* Salerno, Italy
#* antonioall(at)libero.it
#*
#* First Version: 2011/06/02
#* Last Version: 2011/06/02
#*
#* This program is free software under the
#* GNU General Public License (>=v2).
#* Read the file COPYING that comes with GRASS
#* for details.
#*
#****************************************************************
Ora passiamo al codice vero e proprio, per utilizzare l'interfaccia grafica di Grass si
utilizzano particolari righe di commento che devono avere inizio con i simboli
"#%":
#%module
#% description: Calcola la somma dei valori di una colonna di tipo numerico
#% keywords: vector
#%end
#%option
#% key: map
#% type: string
#% gisprompt: old,vector,vector
#% key_desc: nome
#% description: Nome copertura vettoriale
#% required: yes
#%end
#%option
#% key: colonna
#% type: string
#% key_desc: colonna
#% description: Nome colonna
#% required: yes
#% gisprompt: old_dbcolumn,dbcolumn,dbcolumn
#%end
La struttura è semplice ha inizio con la parola module oppure
option e termina con
end. Le proprietà all'interno delle singole
strutture servono a definire le caratteristiche dei campi che verrano rappresentati al
lancio del modulo ed al controllo dei valori inseriti.Ovviamente può esservi una sola struttura module per ogni script e, inoltre, le chiavi presenti in essa sono puramente descrittive. Non vi è, invece, un limite numerico alle strutture option che possono rappresentare campi che devono essere compilati obbligatoriamente oppure no a seconda di come si imposta la proprietà required: con i valori yes/no. Una descrizione dettagliata delle varie opzioni sarebbe alquanto lunga e forse addirittura inutile, difatti è sufficiente andare nella cartella InstallazioneGRASS\script dove sono presenti una miriade di esempi che condividono con Python le stesse definizioni per quanto riguarda le strutture option e trovare, quindi, quello da cui estrapolare il codice da inserire nel proprio script. Ritengo sia il caso di precisare che map e input sono due variabili globali di Grass associate alle coperture da caricare. Esse non vanno utilizzate contemporaneamente nello stesso script altrimenti provocano dei malfunzionamenti. Se si usa una delle due variabili, globali, i campi successivi faranno riferimento a questa. Se nel nostro esempio non associassimo alla proprietà key: la parola map, il successivo elenco a discesa relativo ai nomi delle colonne del vettoriale sarebbe vuoto. Dopo la scrittura di queste semplici righe di commento l'interfaccia grafica del nostro esempio appare essere la seguente:
import sys, time
import grass.script as grass
Quindi si dichiara la funzione Main che contiene il codice principale dell'applicativo:
def main():
copertura = options['map']
colonna = options['colonna']
somma = 0.00
ret = grass.read_command('v.db.select',
map = copertura,
columns = colonna,
flags = 'c')
if ret == {}:
grass.fatal("Errore nella lettura dei dati della colonna")
vettore = ret.split('\n')
for v in vettore:
if v != '':
somma += float(v)
grass.message("Somma: %15f" % somma)
return 0
Il codice è semplice, si inizializzano le variabili
copertura e
colonna caricando i valori contenuti nei campi
map e
colonna, si pone la variabile
somma uguale a zero.
Per evitare i problemi anzidetti relativi a Python 2.5, si utilizza direttamente la funzione
read_command che lancia il comando
v.db.select. Quest'ultima restituisce i valori
numerici come stringhe in un buffer e il cui separatore è "\n". Collocate le stringhe nel
vettore dal nome omonimo con la funzione split,
i valori possono essere sommati nel ciclo for
ponendo attenzione nell'eliminare le stringhe vuote mediante un
if e forzando Python a considerarle come
valori reali (float). La funzione
message scrive a schermo il risultato
secondo la formattazione impostata.Le funzioni utilizzabili mediante la libreria grass.script si possono trovare nei file contenuti nella cartella: InstallazioneGRASS\etc\python\grass\script. Per finire andiamo a scrivere la parte di codice che riguarda la chiamata al parser di Grass per l'interpretazione dei comandi Python e la visualizzazione dell'interfaccia grafica:
if __name__ == "__main__":
options, flags = grass.parser()
sys.exit(main())
Visualizza il file sorgente di v.somma.py
Argomenti correlati:
|