NDVI - Pokročilejší verze skriptu¶
Pokročilejší verze skriptu je rozšířena o:
uživatelské rozhraní, řádky 3-23
vstupní parametry (
red,nir,aoiaclasses), viz řádky 6-23uživatelské rozhraní je zpracováno funkcí
parse()(řádek 97), která je součástí balíčkugrass.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,75celý 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.
Obr. 11 Příklad spuštění pokročilé verze skriptu v GUI, výběr vstupních parametru v dialogu nástroje.¶
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.
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%