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 9).
- Rastrová data jsou načtena pomocí třídy RasterRow (řádek 11-12).
- Jednotlivé řádky a sloupce rastru jsou procházeny cyklem
for(řádky 16-17). - Na konci skriptu nezapomeneme rastrovou mapu korektně uzavřít 30.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/usr/bin/env python3
import numpy as np
from grass.pygrass.raster import RasterRow
from grass.pygrass.modules import Module
rast = 'dmt@PERMANENT'
Module('g.region', raster=rast, res=1000)
dmt = RasterRow(rast)
dmt.open('r')
min = max = None
count = ncount = 0
for row in dmt:
for value in row:
if np.isnan(value):
ncount += 1
else:
if min is None:
min = max = value
else:
if min > value:
min = value
elif max < value:
max = value
count += 1
dmt.close()
print ("min={:.2f} max={:.2f} count={} (no-data: {})".format(min, max, count, ncount))
|
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 (viz porovnání s modulem r.univar).
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 řádku 11 je podle rastrové mapy dmt nastaven výpočetní region.
- Rastrová mapa dmt je načtena třídou RasterRow (řádka 15-16).
- Jelikož se jedná u vstupní vektorové mapy o data bodová, tak stačí mapu otevřít bez topologie (řádky 18-19).
- Souřadnice definičních bodů obcí jsou převedeny na souřadnice rastru
funkcí
coor2pixel(řádek 22)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/usr/bin/env python3
from grass.pygrass.raster import RasterRow
from grass.pygrass.vector import Vector
from grass.pygrass.gis.region import Region
from grass.pygrass.utils import coor2pixel
from grass.pygrass.modules import Module
rast = 'dmt@PERMANENT'
Module('g.region', raster=rast)
region = Region()
dmt = RasterRow(rast)
dmt.open('r')
obce = Vector('obce_bod')
obce.open('r')
for o in obce:
x, y = coor2pixel(o.coords(), region)
value = dmt[int(x)][int(y)]
print ('{:40}: {:.0f}'.format(o.attrs['nazev'], value))
obce.close()
dmt.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