Programmazione & GIS

:: Python :: v.elimina ::

Volendo eliminare un file vettoriale sul mio sistema mediante le funzionalità fornite con Grass, il più delle volte, eseguendo il relativo comando, questo fallisce al primo tentativo, mentre il 90% delle volte riesce al secondo. A dire il vero, se al vettoriale non è collegato un database, l'eliminazione avviene sempre al primo tentativo (Aggiornamento gennaio 2012: il problema è stato risolto, se il file vettoriale è collegato ad un database ora viene eliminato sempre al primo tentativo).
Per ovviare a questo inconveniente, ho realizzato una funzione remove che utilizzando g.remove effettua iterativamente più tentativi (per un massimo di 5) controllando a priori se il vettoriale esiste oppure è stato eliminato nel precedente ciclo. La funzione viene richiamata dal corpo dello script (main). A remove viene associata la variabile copertura che contiene il nome del vettoriale da eliminare estratto dalla variabile globale map dal parser.

v.elimina.py

Ovviamente, la funzione remove può essere estrapolata da questo contesto ed utilizzata in applicativi più complessi ove, per esempio, è necessario creare dei vettoriali temporanei sui quali effettuare estrazioni di informazioni nonché calcoli e che poi vanno opportunamente eliminati a fine elaborazione.

Si riporta di seguito il codice dello script Python v.elimina.py per Grass 6.4.X:
#!/usr/bin/env python
#****************************************************************
#*
#* MODULE:     v.elimina, v 1.0.0
#*
#* AUTHOR(S):  Antonio Alliegro
#*
#* PURPOSE:    Elimina coperture vettoriali
#*
#* COPYRIGHT:  (C) 2011 Antonio Alliegro Civil Engineer
#*             Salerno, Italy
#*             antonioall(at)libero.it
#*
#*             First Version: 2011/06/21
#*             Last  Version: 2011/06/21
#*
#*             This program is free software under the
#*             GNU General Public License (>=v2).
#*             Read the file COPYING that comes with GRASS
#*             for details.
#*
#****************************************************************

#%module
#% description: Elimina coperture vettoriali
#% keywords: vector
#%end

#%option
#% key: map
#% type: string
#% gisprompt: old,vector,vector
#% key_desc: nome
#% description: Nome copertura vettoriale
#% required: yes
#%end
                        
import sys, time
import grass.script as grass

def remove(cover_name):
    i = 0
    while grass.find_file(cover_name, element = 'vector')['fullname'] != '' and i < 5:
        ret = grass.parse_command('g.remove',
                                  flags = 'f',
                                  vect = cover_name,
                                  quiet = True)
        i += 1

    if grass.find_file(cover_name, element = 'vector')['fullname'] == '':
        grass.message("File <%s> rimosso al tentativo n. %d" % (cover_name, i))

    return 0
    #End remove

def main():
    copertura = options['map']

    remove(copertura)

    return 0
    #End main

if __name__ == "__main__":
    options, flags = grass.parser()
    sys.exit(main())
                        
Visualizza il file sorgente di v.elimina.py per Grass 6.4.X


Nella versione di Grass 7.0.X è stato modificata la sintassi del comando g.remove. Pertanto, per poterlo utilizzare, occorre modificare le righe di codice dove viene richiamato:
def remove(cover_name):
    i = 0
    while grass.find_file(cover_name, element = 'vector')['fullname'] != '' and i < 5:
        ret = grass.parse_command('g.remove',
                                  flags = 'f',
                                  type = 'vector',
                                  name = cover_name,
                                  quiet = True)
        i += 1
    
    if grass.find_file(cover_name, element = 'vector')['fullname'] == '':
        grass.message("File <%s> rimosso al tentativo n. %d" % (cover_name, i))
    
    return 0
                        
Visualizza il file sorgente di v.elimina.py per Grass 7.0.X


Argomenti correlati: