NDVI - Pokročilejší verze skriptu¶
Pokročilejší verze skriptu je rozšířena o:
uživatelské rozhraní, řádky 3-23
vstupní parametry (
red
,nir
,aoi
aclasses
), 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.
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.
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%