153ZODH / 4. cvičení: Porovnání verzí

Z GeoWikiCZ
m (sablona)
m (r.mapcalc uvod)
Řádek 8: Řádek 8:
__TOC__
__TOC__
== Osnova ==
== Osnova ==
== Rastrová algebra ==
'''Rastrová (mapová) algebra''' ([http://en.wikipedia.org/wiki/Map_algebra Map algebra]) je poměrně komplexní téma. Rastrovou algebru má v GRASSu ve své moci téměř všemocný modul {{GrassPrikaz|r.mapcalc}} (viz manuálová stránka modulu). K tématu rastrové algebry je dostupný i speciální [http://grass.itc.it/gdp/raster/mapcalc-algebra.pdf tutoriál]. Rastrové algebře je věnována kapitola 6.16 v [http://grass.fsv.cvut.cz/wiki/index.php/GIS_GRASS_-_Praktick%C3%A1_rukov%C4%9B%C5%A5 GRASS příručce] a kapitola 15 v [http://grass.fsv.cvut.cz/wiki/index.php/GIS_GRASS_6.0_-_Praktick%C3%A1_rukov%C4%9B%C5%A5_za%C4%8D%C3%ADnaj%C3%ADc%C3%ADch_u%C5%BEivatel%C5%AF GIS GRASS 6.0 - Praktická rukověť začínajících uživatelů].
Modul {{GrassPrikaz|r.mapcalc} lze ho ovládat vedvou různým módech - tzv. interaktivním, kdy spustíte modul bez parametrů a zadáváte jednotlivé výrazy, pro ukončení slouží klíčové slovo "end".
# interaktivní mód modulu r.mapcalc
#
r.mapcalc
Enter expressions, "end" when done.
mapcalc> p12 = tm1 / tm2
mapcalc> p23 = tm2 / tm3
mapcalc> end
Výhodnější je však předat dané výrazy modulu jako parametr (uzavřít do <u>uvozovek</u>!), nebo je uložit do textového souboru (například při opětovném použití) a přesměrovat do modulu přes standardní vstup.
# zadání výrazu jako parametr
#
r.mapcalc 'p12 = tm1 / tm2'
r.mapcalc 'p23 = tm2 / tm3'
#
# výrazy uložené v textovém souboru
#
r.mapcalc < podily.txt
''Poznámka: Modul {{GrassPrikaz|r.mapcalc}} provádí výpočet podobně jako ostatní moduly pro zpracování rastrových dat v aktuální výpočetním regionu!''
Obecná forma výrazu:
nova_mapa = vyraz (mapa1, mapa2, ...)
kde <tt>vyraz</tt> může zahrnovat názvy rastrových mapových vrstev, celočíselné či reálné konstanty a podporované funkce.
<center>
{|border="1px" cellpadding="3px" rules="all"
|+Tab. č.1: Operátory
|-
!operátor !! popis !! typ !! priorita
|-
|<tt>^</tt>
|exponent
|aritmetický
|align="right" | 5
|-
|<tt>%</tt>
|modulo (zbytek po celočíselném dělení)
|aritmetický
|align="right" | 4
|-
|<tt>/</tt>
|dělení
|aritmetický
|align="right" | 4
|-
|<tt>*</tt>
|násobení
|aritmetický
|align="right" | 4
|-
|<tt>+</tt>
|sčítání
|aritmetický
|align="right" | 3
|-
|<tt>-</tt>
|odečítání
|aritmetický
|align="right" | 3
|- 
|<tt>==</tt>
|rovnost
|logický
|align="right" | 2
|- 
|<tt>!=</tt>
|nerovnost
|logický
|align="right" | 2
|- 
|<tt>></tt>
|větší než
|logický
|align="right" | 2
|-     
|<tt><</tt>
|menší než
|logický
|align="right" | 2
|- 
|<tt>>=</tt>
|větší rovno než
|logický
|align="right" | 2
|- 
|<tt><=</tt>
|menší rovno než
|logický
|align="right" | 2
|-     
|<tt>&&</tt>
|AND (a)
|logický
|align="right" | 1
|-
|<tt><nowiki>||</nowiki></tt>
|OR  (nebo)
|logický
|align="right" | 1
|- 
|<tt>#</tt>
|rozděluje tabulku barev
|aritmetický
|align="right" | -
|-
|}
{|border="1px" cellpadding="3px" rules="all"
|+Tab č.2: Funkce
|-
!funkce !! význam !! mat. zápis !! typ
|-
|<tt>abs(x)</tt>
|absolutní hodnota z ''x''
|<tt><nowiki>|x|</nowiki></tt>
|&nbsp;
|-
|<tt>atan(x)</tt>
|arkustangens z ''x'' (výsledek ve stupních)
|<tt>arctan(x)</tt>
|F
|-
|<tt>atan(x,y)</tt>
|arkustangens z ''x/y'' (výsledek ve stupních)
|<tt>arctan(x/y)</tt>
|F
|-
|<tt>cos(x)</tt>
| kosinus z ''x'' (''x'' ve stupních)
|<tt>cos(x)</tt>
|F
|-
|<tt>double(x)</tt>
|převede ''x'' na číslo s plovoucí desetinnou čárkou (výstupní mapa DCELL)
|
|F
|-
|<tt>eval([x,y,...,]z)</tt>
|vyhodnotí výrazy ''x'' a ''y'' a výsledek uloží do ''z''
|&nbsp;
|&nbsp;
|-
|<tt>exp(x)</tt>
|exponenciální funkce z ''x''
|<tt>e<sup>x</sup></tt>
|F
|-
|<tt>exp(x,y)</tt>
| mocnina ''y'' z ''x''
|<tt>x<sup>y</sup></tt>
|F
|-
|<tt>float(x)</tt>
| převede ''x'' na číslo s plovoucí desetinnou čárkou (výstupní mapa FCELL)
|&nbsp;
|F
|-
|<tt>if</tt>
|podmíněný příkaz
|&nbsp;
|&nbsp;
|-
|<tt>if(x)</tt>
|''1'', když ''x'' není ''0'', jinak ''0''
|&nbsp;
|&nbsp;
|-
|<tt>if(x,a)</tt>
| ''a'', když ''x'' není ''0'', jinak ''0''
|&nbsp;
|&nbsp;
|-
|<tt>if(x,a,b)</tt>
|''a'', když ''x'' není ''0'', jinak ''b''
|&nbsp;
|&nbsp;
|-
|<tt>if(x,a,b,c)</tt>
|''a'', když ''x > 0'', ''b'' když ''x'' rovno ''0'', ''c'' když ''x < 0''
|&nbsp;
|&nbsp;
|-
|<tt>int(x)</tt>
|převede ''x'' na celé číslo, zbytek odřízne
|&nbsp;
|&nbsp;
|-
|<tt>isnull()</tt>
|''1'', když ''x'' rovno ''NULL'' (no data)
|&nbsp;
|F
|-
|<tt>log(x)</tt>
|přirozený logaritmus z ''x''
|<tt>ln(x)</tt>
|F
|-
|<tt>log(x,b)</tt>
|logaritmus z ''x'' při základu ''b''
|<tt>log<sub>b</sub>(x)</tt>
|F
|-
|<tt>max(x,y [,z...])</tt>
|vrátí největší ze zadaných hodnot
|&nbsp;
|*
|-
|<tt>median(x,y[,z...])</tt>
|vrátí prostřední hodnotu (medián) ze zadaných hodnot
|&nbsp;
|*
|-
|<tt>min(x,y[,z...])</tt>
|vrátí nejmenší ze zadaných hodnot
|&nbsp;
|*
|-
|<tt>mode(x,y[,z...])</tt>
|vrátí nejčetnější hodnotu (modus) ze zadaných hodnot
|&nbsp;
|*
|-
|<tt>not(x)</tt>
|1 pokud ''x'' je nula, jinak 0
|&nbsp;
|&nbsp;
|-
|<tt>rand(low,high)</tt>
|vrátí náhodnou číselnou hodnotu z intervalu [low; high]
|&nbsp;
|&nbsp;
|-
|<tt>round(x)</tt>
|zaokrouhlí ''x'' na nejbližší celočíselnou hodnotu
|&nbsp;
|I
|-
|<tt>sin(x)</tt>
|sinus z ''x'' (''x'' ve stupních)
|<tt>sin(x)</tt>
|F
|-
|<tt>sqrt(x)</tt>
|odmocnina z ''x''
|<tt>sqrt(x)</tt>
|F
|-
|<tt>tan(x)</tt>
|tangens z ''x'' (''x'' ve stupních)
|<tt>tan(x)</tt>
|F
|}
</center>
''Vysvětlivky:''
<div style="margin-left: 10px">
{|
|-
|*
|...
|Vrací reálné číslo, pokud je ''x'' reálné číslo.
|-
|F
|...
|Výsledek je vždy reálné číslo.
|-
|I
|...
|Výsledek je celé číslo.
|-
|}
</div>
<center>
{|border="1px" cellpadding="3px" rules="all"
|+Tab č.3: Speciální proměnné
|-
! proměnná !! význam
|-
|<tt>x()</tt>
|proměnná pro aktuální souřadnici ''x''
|-
|<tt>y()</tt>
|proměnná pro aktuální souřadnici ''y''
|-
|<tt>col()</tt>
|proměnná pro aktuální číslo sloupce
|-
|<tt>row()</tt>
|proměnná pro aktuální číslo řádku
|-
|<tt>nsres()</tt>
|proměnná pro aktuální rozlišení sever-jih
|-
|<tt>ewres()</tt>
|proměnná pro aktuální rozlišení východ-západ
|-
|}
</center>
V následující části se zaměříme na '''lokalní''' operace, kdy hodnota výsledné buňky vzniká na základě hodnot korespondujících hodnot vstupní vrstvy/vrstev). V dalších cvičeních se budeme používat operace '''fokální''', které se provádí v rámci množiny rastrových buněk pokryté
tzv. ''moving window'' -- plovoucím oknem.
[[Soubor:ZOD-cv4-test-tm1_tm2.png|frame|center|Obr č.1 Vstupní kanály tm1 a tm2]]
[[Soubor:ZOD-cv4-test-operace12.png|frame|center|Obr č.2: (a) tm1 + tm2; (b) tm1 - tm2; (c) tm1 * tm2; (d) tm1 / tm2; (e) 1.0 * tm1 / tm2]]
Několik drobných poznámek:
* Datový typ buněk výsledné vrstvy (celočíselná; hodnoty s plovoucí desetinnou čárkou) se odvozuje z datového typu buněk vstupních vrstev a datovém typu konstant uvedených ve výrazu. Výsledkem dělení dvou celočíselných rastrových vrstev je tedy opět vrstva s celočíselnými hodnotami buněk!
* Vstupují-li do výpočtu rastrové buňky s hodnotou NULL ("žádná data") je výsledkem opět hodnota NULL.





Verze z 21. 10. 2008, 10:03

Mapová algebra, sčítání, odčítání rastrových dat, podíl obrazu, NDVI

< Stránky předmětuPředchozí cvičeníDalší cvičení

Osnova

Rastrová algebra

Rastrová (mapová) algebra (Map algebra) je poměrně komplexní téma. Rastrovou algebru má v GRASSu ve své moci téměř všemocný modul r.mapcalc (viz manuálová stránka modulu). K tématu rastrové algebry je dostupný i speciální tutoriál. Rastrové algebře je věnována kapitola 6.16 v GRASS příručce a kapitola 15 v GIS GRASS 6.0 - Praktická rukověť začínajících uživatelů.

Modul {{GrassPrikaz|r.mapcalc} lze ho ovládat vedvou různým módech - tzv. interaktivním, kdy spustíte modul bez parametrů a zadáváte jednotlivé výrazy, pro ukončení slouží klíčové slovo "end".

# interaktivní mód modulu r.mapcalc
#
r.mapcalc


Enter expressions, "end" when done.
mapcalc> p12 = tm1 / tm2
mapcalc> p23 = tm2 / tm3
mapcalc> end

Výhodnější je však předat dané výrazy modulu jako parametr (uzavřít do uvozovek!), nebo je uložit do textového souboru (například při opětovném použití) a přesměrovat do modulu přes standardní vstup.

# zadání výrazu jako parametr
#
r.mapcalc 'p12 = tm1 / tm2'
r.mapcalc 'p23 = tm2 / tm3'
#
# výrazy uložené v textovém souboru
#
r.mapcalc < podily.txt

Poznámka: Modul r.mapcalc provádí výpočet podobně jako ostatní moduly pro zpracování rastrových dat v aktuální výpočetním regionu!

Obecná forma výrazu:

nova_mapa = vyraz (mapa1, mapa2, ...)

kde vyraz může zahrnovat názvy rastrových mapových vrstev, celočíselné či reálné konstanty a podporované funkce.

Tab. č.1: Operátory
operátor popis typ priorita
^ exponent aritmetický 5
% modulo (zbytek po celočíselném dělení) aritmetický 4
/ dělení aritmetický 4
* násobení aritmetický 4
+ sčítání aritmetický 3
- odečítání aritmetický 3
== rovnost logický 2
!= nerovnost logický 2
> větší než logický 2
< menší než logický 2
>= větší rovno než logický 2
<= menší rovno než logický 2
&& AND (a) logický 1
|| OR (nebo) logický 1
# rozděluje tabulku barev aritmetický -
Tab č.2: Funkce
funkce význam mat. zápis typ
abs(x) absolutní hodnota z x |x|  
atan(x) arkustangens z x (výsledek ve stupních) arctan(x) F
atan(x,y) arkustangens z x/y (výsledek ve stupních) arctan(x/y) F
cos(x) kosinus z x (x ve stupních) cos(x) F
double(x) převede x na číslo s plovoucí desetinnou čárkou (výstupní mapa DCELL) F
eval([x,y,...,]z) vyhodnotí výrazy x a y a výsledek uloží do z    
exp(x) exponenciální funkce z x ex F
exp(x,y) mocnina y z x xy F
float(x) převede x na číslo s plovoucí desetinnou čárkou (výstupní mapa FCELL)   F
if podmíněný příkaz    
if(x) 1, když x není 0, jinak 0    
if(x,a) a, když x není 0, jinak 0    
if(x,a,b) a, když x není 0, jinak b    
if(x,a,b,c) a, když x > 0, b když x rovno 0, c když x < 0    
int(x) převede x na celé číslo, zbytek odřízne    
isnull() 1, když x rovno NULL (no data)   F
log(x) přirozený logaritmus z x ln(x) F
log(x,b) logaritmus z x při základu b logb(x) F
max(x,y [,z...]) vrátí největší ze zadaných hodnot   *
median(x,y[,z...]) vrátí prostřední hodnotu (medián) ze zadaných hodnot   *
min(x,y[,z...]) vrátí nejmenší ze zadaných hodnot   *
mode(x,y[,z...]) vrátí nejčetnější hodnotu (modus) ze zadaných hodnot   *
not(x) 1 pokud x je nula, jinak 0    
rand(low,high) vrátí náhodnou číselnou hodnotu z intervalu [low; high]    
round(x) zaokrouhlí x na nejbližší celočíselnou hodnotu   I
sin(x) sinus z x (x ve stupních) sin(x) F
sqrt(x) odmocnina z x sqrt(x) F
tan(x) tangens z x (x ve stupních) tan(x) F

Vysvětlivky:

* ... Vrací reálné číslo, pokud je x reálné číslo.
F ... Výsledek je vždy reálné číslo.
I ... Výsledek je celé číslo.
Tab č.3: Speciální proměnné
proměnná význam
x() proměnná pro aktuální souřadnici x
y() proměnná pro aktuální souřadnici y
col() proměnná pro aktuální číslo sloupce
row() proměnná pro aktuální číslo řádku
nsres() proměnná pro aktuální rozlišení sever-jih
ewres() proměnná pro aktuální rozlišení východ-západ

V následující části se zaměříme na lokalní operace, kdy hodnota výsledné buňky vzniká na základě hodnot korespondujících hodnot vstupní vrstvy/vrstev). V dalších cvičeních se budeme používat operace fokální, které se provádí v rámci množiny rastrových buněk pokryté tzv. moving window -- plovoucím oknem.

Obr č.1 Vstupní kanály tm1 a tm2
Obr č.2: (a) tm1 + tm2; (b) tm1 - tm2; (c) tm1 * tm2; (d) tm1 / tm2; (e) 1.0 * tm1 / tm2

Několik drobných poznámek:

  • Datový typ buněk výsledné vrstvy (celočíselná; hodnoty s plovoucí desetinnou čárkou) se odvozuje z datového typu buněk vstupních vrstev a datovém typu konstant uvedených ve výrazu. Výsledkem dělení dvou celočíselných rastrových vrstev je tedy opět vrstva s celočíselnými hodnotami buněk!
  • Vstupují-li do výpočtu rastrové buňky s hodnotou NULL ("žádná data") je výsledkem opět hodnota NULL.



< Stránky předmětuPředchozí cvičeníDalší cvičení