Programmazione & GIS

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

tin.hmed.basin.py

tin.hmed.basin.py - Risultato

#!/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: