Programmazione & GIS

:: Python :: v.quota ::

In questo esempio (v.quota.py) si mostra come integrare la libreria grass.script con le librerie grass.lib.gis(*) e grass.lib.vector(*). Dai commenti e dal codice stesso, è possibile anche trarre utili riferimenti sull'utilizzo della libreria ctypes fondamentale per interfacciare Python con le librerie vettoriali e raster presenti in Grass.
L'applicativo chiede all'utente di inserire il nome di una copertura vettoriale e le coordinate X e Y di un punto. Il codice verifica se la copertura è 3D, in caso affermativo calcola la quota, ma ne stampa il risultato se e solo se il punto cade all'interno del vettoriale.
Per la realizzazione di coperture vettoriali 3D si faccia riferimento alle pagine dedicate alle realizzazione dei TIN: Costruzione TIN da Punti Quotati, Costruzione TIN da Curve di Livello e Costruzione TIN da Entità Quotate.

v.quota.py

#!/usr/bin/env python
#****************************************************************
#*
#* MODULE:     v.quota, v 1.0.0
#*
#* AUTHOR(S):  Antonio Alliegro
#*
#* PURPOSE:    Calcola la quota di un punto di un vettoriale 3D
#*
#* COPYRIGHT:  (C) 2011 Antonio Alliegro Civil Engineer
#*             Salerno, Italy
#*             antonioall(at)libero.it
#*
#*             First Version: 2011/08/16
#*             Last  Version: 2011/08/16
#*
#*             This program is free software under the
#*             GNU General Public License (>=v2).
#*             Read the file COPYING that comes with GRASS
#*             for details.
#*
#****************************************************************

#%module
#% description: Calcola la quota di un punto di un vettoriale 3D
#% keywords: vector
#%end

#%option
#% key: map
#% type: string
#% gisprompt: old,vector,vector
#% key_desc: nome
#% description: Nome copertura vettoriale 3D
#% required: yes
#%end

#%option
#% key: x
#% type: double
#% key_desc: Coordinata X
#% description: Coordinata X
#% required: yes
#% answer: 2515000
#%end

#%option
#% key: y
#% type: double
#% key_desc: Coordinata Y
#% description: Coordinata Y
#% required: yes
#% answer: 4456000
#%end 
                        
import os, sys
import grass.script as grass
from grass.lib.gis    import *
from grass.lib.vector import *

def main():
    input = options['map']
    x = options['x']
    y = options['y']
# Inializza la libreria GRASS G_gisinit('') # Controlla se il vettoriale e' nel percorso di ricerca mapset = G_find_vector2(input, "") if not mapset: grass.fatal("Il file vettoriale <%s> non e' stato trovato" % input) # Definisce la struttura della copertura map_info = pointer(Map_info()) # Setta la copertura al livello 2 (level 2: topology) Vect_set_open_level(2) # Apre il file vettoriale Vect_open_old(map_info, input, mapset) # Verifica se il vettoriale e' 3D if Vect_is_3d(map_info): grass.message("Il file vettoriale <%s> e' 3D" % input) else: grass.fatal("Il file vettoriale <%s> non e' 3D" % input) # Conversione del tipo float di Python nel tipo double di ctypes dx = c_double(float(x)) dy = c_double(float(y)) z = c_double() # CALCOLA LA QUOTA DEL PUNTO DI COORDINATE (x, y) # si noti che z viene passata per riferimento, difatti, la funzione # richiede che questo paramentro sia un puntatore a un double ctypes ret = Vect_tin_get_z(map_info, dx, dy, byref(z), None, None); if ret > 0: # Si osservi che per leggere il valore da una variable ctypes di tipo # double si utilizza la proprieta' .value grass.message("Coordinata X del punto:%15f" % dx.value) grass.message("Coordinata Y del punto:%15f" % dy.value) grass.message("Quota del punto (Z):%18f" % z.value) else: grass.fatal("Il punto non ricade nel vettoriale <%s>" % input) # Chiude la copertura Vect_close(map_info) return 0 #End main if __name__ == "__main__": options, flags = grass.parser() sys.exit(main())

Visualizza il file sorgente di v.quota.py


v.quota.py-Risultato


NOTA (*): La libreria grass.lib è disponibile a partire dalla versione 6.4.2 di Grass. Pertanto il presente applicativo non è utilizzabile nelle versioni 6.4.1, 6.4.0 e precedenti.


Argomenti correlati: