Přístup k rastrovým datům¶
Přístup k rastrovým datům umožňuje PyGRASS ve třech režimech:
RasterRow (náhodné čtení po řádcích, sekvenční zápis)
RasterRowIO (čtení po řádcích z vyrovnávací paměti, sekvenční zápis)
RasterSegment (náhodné čtení a zápis po dlaždicích)
Další informace v dokumentaci PyGRASS.
Varování
GRASS při čtení rastrových dat vždy data převzorkuje podle aktuálního výpočetního regionu. Manipulaci s regionem má v PyGRASS na starost třída Region anebo lze přímo použít modul g.region.
Statistika rastrových dat¶
V následující ukázce vypíšeme statistiku rastru:
Před načtením dat je nastaven výpočetní region (řádek 11-13).
Rastrová data jsou načtena pomocí třídy RasterRow (řádek 15-16).
Jednotlivé řádky a sloupce rastru jsou procházeny cyklem
for
(řádky 20-21).Na konci skriptu nezapomeneme rastrovou mapu korektně uzavřít 34.
1#!/usr/bin/env python3
2
3import numpy as np
4from grass.pygrass.raster import RasterRow
5from grass.pygrass.modules import Module
6
7from grass.pygrass.gis.region import Region
8
9name = 'dmt@PERMANENT'
10
11reg = Region()
12reg.from_rast(name)
13reg.set_current()
14
15rast = RasterRow(name)
16rast.open('r')
17
18min = max = None
19count = ncount = 0
20for row in rast:
21 for value in row:
22 if np.isnan(value):
23 ncount += 1
24 else:
25 if min is None:
26 min = max = value
27 else:
28 if min > value:
29 min = value
30 elif max < value:
31 max = value
32 count += 1
33
34rast.close()
35
36print("min={:.2f} max={:.2f} count={} (no-data: {})".format(
37 min, max, count, ncount)
38)
Skript ke stažení zde.
Výpis může vypadat následovně:
min=53.80 max=1530.51 count=138116 (no-data: 59244)
Poznámka
Tento skript berte jako ilustrační, rozhodně jej nelze považovat za optimální cestu pro zjištění extremních hodnot v rastru. Porovnejte s modulem r.univar a verzí skriptu založené na knihovně NumPy (17-18).
1#!/usr/bin/env python3
2
3import numpy as np
4from grass.pygrass.raster import RasterRow
5from grass.pygrass.gis.region import Region
6
7name = 'dmt@PERMANENT'
8
9reg = Region()
10reg.from_rast(name)
11reg.set_current()
12
13with RasterRow(name) as rast:
14 array = np.array(rast)
15
16print("min={:.2f} max={:.2f} count={} (no-data: {})".format(
17 array.min(), array.max(), array.size,
18 np.count_nonzero(np.isnan(array)))
19)
Skript ke stažení zde.
Dotazování na rastrová data¶
Skript vypisuje pro definiční body obcí v ČR jejich nadmořské výšky odvozené z digitálního modelu terénu (rastrová mapa dmt).
Před načtením rastrových dat na řádcích 10-12 je na základě rastrové mapy dmt nastaven výpočetní region.
Rastrová mapa dmt je načtena třídou RasterRow (řádka 14-15).
Jelikož se jedná u vstupní vektorové mapy o data bodová, tak stačí mapu otevřít bez topologie (řádky 17-18).
Souřadnice definičních bodů obcí jsou převedeny na souřadnice rastru funkcí
coor2pixel
(řádek 21)
1#!/usr/bin/env python3
2
3from grass.pygrass.raster import RasterRow
4from grass.pygrass.vector import Vector
5from grass.pygrass.gis.region import Region
6from grass.pygrass.utils import coor2pixel
7
8name = 'dmt@PERMANENT'
9
10reg = Region()
11reg.from_rast(name)
12reg.set_current()
13
14dmt = RasterRow(name)
15dmt.open('r')
16
17obce = Vector('obce_bod')
18obce.open('r')
19
20for o in obce:
21 x, y = coor2pixel(o.coords(), region)
22 value = dmt[int(x)][int(y)]
23 print ('{:40}: {:.0f}'.format(o.attrs['nazev'], value))
24
25obce.close()
26dmt.close()
Skript ke stažení zde.
Výpis může vypadat následovně:
...
Kopidlno : 225
Neratov : 223
Podhorní Újezd a Vojice : 336
...
Poznámka
Rychlost implementace můžete porovnat s modulem v.what.rast.
v.what.rast -p map=obce_bod@ruian raster=dmt@PERMANENT