NDVI - Pokročilejší verze skriptu

Pokročilejší verze skriptu je rozšířena o:

  • uživatelské rozhraní, řádky 3-23

  • vstupní parametry (red, nir, aoi a classes), viz řádky 6-23

  • uživatelské rozhraní je zpracováno funkcí parse() (řádek 97), která je součástí balíčku grass.script (řádek 28)

  • hodnoty parametrů jsou na řádku 97 uloženy do proměnné options, přepínače do proměnné flags, ty jsou dále použity na řádcích 33-35,57,75

  • celý kód je vložen do funkce main() (řádek 32)

 1#!/usr/bin/env python3
 2
 3#%module
 4#% description: Creates reclassified NDVI based on given AOI.
 5#%end
 6#%option G_OPT_R_MAP
 7#% key: red
 8#% description: Name of red channel
 9#% answer: LC81920252013215LGN00_B4@landsat
10#%end
11#%option G_OPT_R_MAP
12#% key: nir
13#% description: Name of nir channel
14#% answer: LC81920252013215LGN00_B5@landsat
15#%end
16#%option G_OPT_V_MAP
17#% key: aoi
18#% answer: obce@ruian_praha
19#%end
20#%option G_OPT_F_INPUT
21#% key: classes
22#% required: no
23#%end
24
25import sys
26from subprocess import PIPE
27
28from grass.script import parser, fatal, message
29
30from grass.pygrass.modules import Module
31
32def main():
33    vis = options['red']
34    nir = options['nir']
35    aoi = options['aoi']
36    if '@' in aoi:
37        aoi_name = aoi.split('@')[0]
38    else:
39        aoi_name = aoi
40    
41    ndvi = "ndvi_{}".format(aoi_name)
42    r_ndvi= "r_ndvi_{}".format(aoi_name)
43
44    # 0. nastavit vypocetni region
45    Module('g.region', align=vis, vector=aoi)
46    
47    # 1. vypocet NDVI
48    message("VIS: {0} ; NIR: {1}".format(vis, nir))
49    Module('r.mapcalc',
50           expression="{o} = float({n} - {v}) / ({n} + {v})".format(o=ndvi, v=vis, n=nir),
51           overwrite=True)
52    
53    # 2. reklasifikace (1,2,3)
54    message("Reklasifikuji...")
55    # r.reclass umi reklasifikovat pouze celociselne rastry, proto pouzime
56    # r.recode
57    if not options['classes']:
58        recode = """
59        -1:0.05:1 
60        0.05:0.35:2 
61        0.35:1:3
62        """
63        kwargs = {
64            'rules' : '-',
65            'stdin_' : recode
66        }
67    else:
68        kwargs = {
69            'rules' : options['classes']
70        }
71    Module('r.recode', input=ndvi, output=r_ndvi,
72           overwrite=True, **kwargs)
73    
74    # 3. tabulka barev
75    if options['classes']:
76        colors = """
77        1 red
78        2 yellow
79        3 0 136 26
80        """
81        Module('r.colors', map=r_ndvi,
82               rules='-', quiet=True, stdin_=colors)
83    
84    # 4. vypsat vysledek
85    message("Generuji report...")
86    report = Module('r.stats', flags='pl', input=r_ndvi, separator=':', stdout_=PIPE)
87    
88    for line in report.outputs.stdout.splitlines():
89        trida, popisek, procento = line.split(':')
90        print("Trida {}: {}".format(trida, procento))
91        
92    return 0
93
94if __name__ == "__main__":
95    options, flags = parser()
96    sys.exit(main())

Výsledná verze skriptu ke stažení zde.

../_images/wxgui-ndvi-v2-0.png

Obr. 11 Příklad spuštění pokročilé verze skriptu v GUI, výběr vstupních parametru v dialogu nástroje.

../_images/wxgui-ndvi-v2-1.png

Obr. 12 Výsledek je vypsán do záložky Command output v dialogu nástroje.

Poznámky k uživatelskému rozhraní

Parametry jsou definovány pomocí tzv. standardizovaných voleb, např. G_OPT_R_MAP definující parametr pro volbu rastrové mapy. V našem případě změníme potřebné vlastnosti (key, description) a zvolíme výchozí hodnotu parametru pro snažší testování (answer).

Ve výsledku se skript chová jako standardní modul systému GRASS, přepínačem --help obdržíme informace o jeho syntaxi.

ndvi-v2.py --help
Creates reclassified NDVI based on given AOI.
Usage:
 ndvi-v2.py red=name nir=name aoi=name [classes=name]
[--help]
   [--verbose] [--quiet] [--ui]
Parameters:
      red   Name of red channel
            default: LC81920252013215LGN00_B4@landsat
      nir   Name of nir channel
            default: LC81920252013215LGN00_B5@landsat
      aoi   Name of vector map
            default: obce@ruian_praha
  classes   Name of input file

Poznámky k vypisování informačních zpráv

Nahradili jsme funkci print() pro vypisování zpráv o průběhu funkcí message() z balíčku grass.script.

print("VIS: {0} ; NIR: {1}".format(vis, nir))

přepsáno na

    message("VIS: {0} ; NIR: {1}".format(vis, nir))

Díky tomu budou fungovat globální přepínače --quiet a --verbose pro tichý, resp. upovídaný mód. Např. při použítí volby --quiet se vypíše pouze výsledný report, ostatní zprávy o průběhu výpočtu budou skryty.

ndvi-v2.py red=LC81920252013215LGN00_B4@landsat nir=LC81920252013215LGN00_B5@landsat aoi=obce@ruian_praha --q
Trida 1: 1.30%
Trida 2: 72.33%
Trida 3: 26.37%

Poznámky ke spuštění modulu

Pokud skript spustíme bez parametrů mělo by vyskočit grafické okno podobné ostatním modulům systému GRASS.

../_images/wxgui-ndvi-v2-0.png

Obr. 13 Vygenerovaný grafický dialog skriptu.

Mějme soubor classes.txt s odlišným rozdělením tříd:

-1:0.1:1 
0.1:0.40:2 
0.40:1:3

Soubor ke stažení zde.

Spuštění skriptu bude vypadat následovně

ndvi-v2.py red=LC81920252013215LGN00_B4@landsat nir=LC81920252013215LGN00_B5@landsat aoi=obce@ruian_praha classes=classes.txt

s výsledkem:

Trida 1: 4.70%
Trida 2: 79.37%
Trida 3: 15.93%