Programmazione & GIS

:: 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:

v.somma.py

Passiamo alla scrittura del codice in linguaggio Python vero e proprio con la dichiarazione delle librerie utilizzate:
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: