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, převzorkování

V následující ukázce vypíšeme statistiku převzorkovaného rastru:

  1. Před načtením dat je změněn aktuální region na prostorové rozlišení 1km (řádek 9).
  2. Rastrová data jsou načtena pomocí třídy RasterRow (řádek 11-12).
  3. Jednotlivé řádky a sloupce rastru jsou procházeny cyklem for (řádky 16-17).
  4. 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 python

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.

Důležité

Rastrová data budou v tomto případě převzorkována metodou nejblížšího souseda.

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).

  1. Před načtením rastrových dat na řádku 11 je podle rastrové mapy dmt nastaven výpočetní region.
  2. Rastrová mapa dmt je načtena třídou RasterRow (řádka 15-16).
  3. Jelikož se jedná u vstupní vektorové mapy o data bodová, tak stačí mapu otevřít bez topologie (řádky 18-19).
  4. 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 python

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 (u'{: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