NDVI - Základní verze skriptu

Začneme verzí skriptu bez vstupních parametrů, názvy vstupních a výstupních rastrových map jsou uvedeny na řádcích 7-12.

Na řádku 3 se importuje z knihovny PyGRASS třída Module, která nám umožní z prostředí jazyka Python spouštět moduly systému GRASS jako je např. g.region (viz řádek 15).

Poznámka

Spouštět moduly systému GRASS z jazyka Python umožňuje také knihovna GRASS Python Scripting Library. V našem případě budeme striktně používat knihovnu PyGRASS.

 1#!/usr/bin/env python3
 2
 3from grass.pygrass.modules import Module
 4from subprocess import PIPE
 5
 6# vstup
 7vis="LC81920252013215LGN00_B4@landsat"
 8nir="LC81920252013215LGN00_B5@landsat"
 9aoi="obce@ruian_praha"
10# vysledek
11ndvi="ndvi"
12r_ndvi= "r_{}".format(ndvi)
13
14# 0. nastavit vypocetni region
15Module('g.region', align=vis, vector=aoi)
16
17# 1. vypocet NDVI
18print("VIS: {0} ; NIR: {1}".format(vis, nir))
19Module('r.mapcalc',
20       expression="{o} = float({n} - {v}) / ({n} + {v})".format(o=ndvi, v=vis, n=nir),
21       overwrite=True)
22
23# 2. reklasifikace (1,2,3)
24print("Reklasifikuji...")
25# r.reclass umi reklasifikovat pouze celociselne rastry, proto pouzime
26# r.recode
27recode = """
28 -1:0.05:1 
29 0.05:0.35:2 
30 0.35:1:3
31"""
32Module('r.recode', input=ndvi, output=r_ndvi,
33       rules='-', overwrite=True, stdin_=recode)
34
35# 3. tabulka barev
36colors = """
37 1 red
38 2 yellow
39 3 0 136 26
40"""
41Module('r.colors', map=r_ndvi,
42       rules='-', quiet=True, stdin_=colors)
43
44# 4. vypsat vysledek
45print("Generuji report...")
46report = Module('r.stats', flags='pl', input=r_ndvi, separator=':', stdout_=PIPE)
47
48print('-' * 80)
49for line in report.outputs.stdout.splitlines():
50    trida, popisek, procento = line.split(':')
51    print("Trida {}: {}".format(trida, procento))
52print('-' * 80)

Skript je ke stažení zde.

../_images/wxgui-ndvi-v1.png

Obr. 10 Příklad spuštění skriptu v GUI a vizualizace výsledku v mapovém okně.

Tip

Namísto funkce print(...) zkuste použít

from grass.pygrass.messages import Messenger

msgr = Messanger()
msgr.message('...')

Poznámky k volání modulů

Moduly systému GRASS se volají ve skriptech se stejnými parametry jako z příkazové řádky. Například pro volání na řádku 15:

Module('g.region', align=vis, vector=aoi)

by korespondující zápis pro příkazovou řádku vypadal následovně:

g.region align=LC81920252013215LGN00_B4@landsat vector=obce@ruian_praha

Jednotlivé parametry modulu se zadávaní jako argumenty třídy Module. Vyjímkou jsou globální přepínače (tj. ty, které jsou uvozeny dvěma pomlčkami) jako je --quiet, --overwrite a další. Ty se zadávají jako argument s hodnotou True, např. overwrite=True. Běžné přepínače (uvozeny jednou pomlčkou) se předávají jako hodnota argumentu flags.

Poznámka pro pokročilé

Zkracování názvů parametrů

Při volání modulů z příkazové řádky lze názvy parametrů libovolně zkracovat, pouze s tou podmínkou, aby byly jednoznačné. V níže uvedeném případě bude následnující volání v pořádku i když méně čitelné.

g.region al=LC81920252013215LGN00_B4@landsat v=obce@ruian_praha

Podobné zkracování názvů parametrů není při použití třídy Module z knihovny PyGRASS možné.

Shortcuts

PyGRASS umožňuje emulovat způsob volání modulů z příkazové řádky pomocí tzv. „shortcuts“. Příklad volání modulu g.region (řádek 15):

from grass.pygrass.modules.shortcuts import general as g

g.region(raster=vis)

Vstup

Některé moduly přijímají vstup ze souboru, např. r.recode s parametrem rules (řádky 32-33). Místo fyzického vytvoření vstupního souboru na disku lze použít standardní vstup, konktrétně argument stdin_ s hodnotou řetězce, který má být na vstupu. V tomto případě musí parameter modulu rules nabývat hodnoty -.

recode = """
 -1:0.05:1 
 0.05:0.35:2 
 0.35:1:3
"""
Module('r.recode', input=ndvi, output=r_ndvi,
       rules='-', overwrite=True, stdin_=recode)

Zpracování výstupu

U modulů, které svůj výstup zapisují na standardní výstup, lze jejich výstup zachytit přes argument stdout_=PIPE. Obsah výstupu je potom uložen jako řetězec v atributu třídy Module outputs.stdout, viz řádek 45.

from subprocess import PIPE
report = Module('r.stats', flags='pl', input=r_ndvi, separator=':', stdout_=PIPE)
for line in report.outputs.stdout.splitlines():
    trida, popisek, procento = line.split(':')