:: Python :: tin.hmed.basin :: |
---|
Lo script tin.hmed.basin.py
(*) è una applicazione estensiva dell'algoritmo
implementato in v.quota.py. Lo script, permette
di calcolare la quota media, minima e massima di un bacino idrografico e per estensione di una
qualsiasi entità topologica areale sovrapponibile ad una copertura TIN.
Per apprendere come realizzare un TIN con Grass, si faccia riferimento alle seguenti pagine: Costruzione TIN da Punti Quotati, Costruzione TIN da Curve di Livello e Costruzione TIN da Entità Quotate. Tornando ora, allo script tin.hmed.basin.py (*), il suo utilizzo è semplice, la finestra di dialogo richiede l'immissione di una copertura TIN, di un file vettoriale a topologia areale racchiudente il bacino idrografico e del valore della spaziatura di campinamento delle altezze puntuali (Delta campionamento). Lo schema seguito nel codice è il seguente, vengono aperti entrambi i file se esisteni e, mediante un doppio ciclo for, si procede al calcolo delle altezze nei punti campionati mediante la funzione Vect_tin_get_z(map_info, x, y, byref(z), None, None) controllando, preventivamente, che questi ricadano all'interno del bacino mediante la funzione Vect_point_in_area(map_info_b, 1, x, y) inclusa in una istruzione if. Ovviamente la precisione dei risultati ed i tempi di elaborazione sono proporzionali al valore della spaziatura di campionamento impostata (Delta campionamento). Una griglia con 10.000.000 di celle richiede un tempo di elaborazione di circa 3 minuti.
#!/usr/bin/env python #**************************************************************** #* #* MODULE: tin.hmed.basin, v 1.0.0 #* #* AUTHOR(S): Antonio Alliegro #* #* PURPOSE: Calcolo hmed, hmin, hmax di un bacino mediante #* campionamento #* #* COPYRIGHT: (C) 2011 Antonio Alliegro Civil Engineer #* Salerno, Italy #* antonioall(at)libero.it #* #* First Version: 2011/09/14 #* Last Version: 2011/09/14 #* #* This program is free software under the #* GNU General Public License (>=v2). #* Read the file COPYING that comes with GRASS #* for details. #* #**************************************************************** #%module #% description: Calcolo hmed, hmin, hmax di un bacino mediante campionamento #% keywords: TIN, vector #%end #%option #% key: map #% type: string #% gisprompt: old,vector,vector #% key_desc: tin #% description: Nome copertura TIN #% required: yes #%end #%option #% key: basin #% type: string #% gisprompt: old,vector,vector #% key_desc: vector #% description: Nome copertura bacino #% required: yes #%end #%option #% key: delta #% type: double #% answer: 1.0 #% key_desc: float #% description: Delta campionamento #% required: yes #%end import os, sys import grass.script as grass from grass.lib.gis import * from grass.lib.vector import * def main(): input = options['map'] basin = options['basin'] delta = float(options['delta']) hmin = 99999.9 hmax = -hmin hmed = 0.0 n = 0 # Inializza la libreria GRASS G_gisinit('') # Controlla se le coperture sono nel percorso di ricerca mapset = G_find_vector2(input, "") if not mapset: grass.fatal("Il file vettoriale <%s> non e' stato trovato" % input) mapset_b = G_find_vector2(basin, "") if not mapset_b: grass.fatal("Il file vettoriale <%s> non e' stato trovato" % basin) # Definisce la struttura delle coperture map_info = pointer(Map_info()) map_info_b = pointer(Map_info()) # Setta le coperture al livello 2 (level 2: topology) Vect_set_open_level(2) # Apre i files vettoriali Vect_open_old(map_info, input, mapset) Vect_open_old(map_info_b, basin, mapset_b) # Verifica se il TIN e' un vettoriale 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) # Verifica se il vettoriale del bacino ha tipologia areale nareas = Vect_get_num_areas(map_info_b) if nareas == 0: grass.fatal("Il file vettoriale <%s> non ha tipologia areale" % basin) # Estrazione valori della regione corrente window = pointer(Cell_head()) G_get_window(window) nrows = window.contents.rows ncols = window.contents.cols xref = window.contents.west yref = window.contents.south xres = window.contents.ew_res yres = window.contents.ns_res # Calcolo numero righe e colonne nuova griglia nx = int(nrows * xres / delta) + 1 ny = int(ncols * yres / delta) + 1 # Blocco elaborazione grass.message("Passo 1/2: Pre-elaborazione TIN...") z = c_double() G_percent(0, nx, 2) Vect_tin_get_z(map_info, xref, yref, byref(z), None, None) grass.message("...Fatto") grass.message("Passo 2/2: Calcolo quote...") for i in range(nx): for j in range(ny): x = xref + j * delta y = yref + i * delta if Vect_point_in_area(map_info_b, 1, x, y) == 1: Vect_tin_get_z(map_info, x, y, byref(z), None, None) hmed += z.value if z.value < hmin: hmin = z.value if z.value > hmax: hmax = z.value n += 1 G_percent(i, nx, 2) grass.message("...Fatto") # Risultati if n > 0: hmed = hmed / n grass.message("-----------------------------") grass.message("Delta campionamento = %.3f" % delta) grass.message("Numero celle totali = %d" % (nx * ny)) grass.message("Numero celle bacino = %d" % n) grass.message("hmed =%15.3f" % hmed) grass.message("hmin =%15.3f" % hmin) grass.message("hmax =%15.3f" % hmax) # Chiusura coperture Vect_close(map_info) Vect_close(map_info_b) return 0 #End main if __name__ == "__main__": options, flags = grass.parser() sys.exit(main()) Visualizza il file sorgente di tin.hmed.basin.py 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:
|