Přístup k vektorovým datům

K vektorovým datům lze přistupovat ve dvou režimech:

  • bez topologie (ala jednoduché geoprvky, viz OGC standard Simple Features), tento přístup zajišťuje třída Vector

  • včetně topologie, viz třída VectorTopo

Další informace v dokumentaci PyGRASS.

Průchod vektorovými prvky bez topologie

Skript níže vypisuje souřadnice definičních bodů z mapy obce_bod mapsetu ruian spolu s jejich názvy.

  1. Nejprve na řádku 5 vytvoříme instaci třídy Vector odkazující na zvolenou vektorovou mapu, kterou na následujícím řádku otevřeme v režimu čtení.

  2. Jednotlivé prvky procházíme sekvenčně v cyklu for na řádku 8.

  3. Na konci skriptu nezapomeneme vektorovou mapu korektně uzavřít 11.

 1#!/usr/bin/env python3
 2
 3from grass.pygrass.vector import Vector
 4
 5obce = Vector('obce_bod', mapset='ruian')
 6obce.open('r')
 7
 8for prvek in obce:
 9    print ("{:<25}: {:.0f} {:.0f}".format(prvek.attrs['nazev'], prvek.x, prvek.y))
10    
11obce.close()

Skript ke stažení zde.

Důležité

Tímto způsobem (bez topologie) lze procházet v mapě pouze základní geometrická primitiva jako jsou body, linie, hraniční linie a centroidy, viz kapitola Topologický model ze školení pro začátečníky. Přístup ke složeným typům jako jsou plochy již vyžaduje topologii.

Výpis skriptu může vypadat následovně:

...
Božejov                  : -700917 -1129944
Cejle                    : -677975 -1132017
Drahonice                : -781273 -1137206
...

Přístup k topologii

Přístup k topologii vektorových prvků zajišťuje třída VectorTopo. Více informací o topologickém modelu systému GRASS najdete ve školení pro začátečníky.

V následující ukázce vypíšeme pro každý okres počet jeho sousedů.

  1. Na řádku 5 vytvoříme instaci třídy VectorTopo odkazující na zvolenou vektorovou mapu, kterou na následujícím řádku otevřeme v režimu topologického čtení.

  2. Jednotlivé prvky (tj. okresy) procházíme sekvenčně v cyklu for na řádku 8. Pro průchod složených topologických primitiv, jako jsou v tomto případě plochy, musíme použít funknci viter().

  3. Pro každou plochu okresu projdeme její hraniční linie 10 a zjistíme jaká plocha je od této linie nalevo a napravo 11 (-1 představuje žádný prvek).

 1#!/usr/bin/env python3
 2
 3from grass.pygrass.vector import VectorTopo
 4
 5okresy = VectorTopo('okresy', mapset='ruian')
 6okresy.open('r')
 7
 8for o in okresy.viter('areas'):
 9    sousede = set()
10    for b in o.boundaries():
11        for n in b.read_area_ids():
12            if n != -1 and n != o.id:
13                sousede.add(n)
14    
15    print('{:20}: {}'.format(o.attrs['nazev'], len(sousede)))
16
17okresy.close()

Skript ke stažení zde.

Výpis skriptu může vypadat následovně:

...
Blansko             : 5
Brno-město          : 1
Vyškov              : 6
...

Nalezení nejbližších prvků, zápis nových prvků

K nalezení nejbližších prvků je vyžadován přístup k topologii. V následujícím příkladu budeme hledat nejbližší ulici k dané záchrance. Dále zkontrolujeme, zda je záchrance přiřazen korektní kód ulice (dle RÚIAN).

Záchranky jsou společně s nejbližšími ulicemi zapsány do nové vektorové mapy zachranka_ulice (řádky 10, 15,24,26). Atributová tabulka pro výstupní vektorovou mapu je definována na řádcích 11-14.

 1#!/usr/bin/env python3
 2
 3from grass.pygrass.vector import VectorTopo
 4
 5zachranka = VectorTopo('adresnimista_zachranka', mapset='ruian_praha')
 6zachranka.open('r')
 7ulice = VectorTopo('ulice', mapset='ruian_praha')
 8ulice.open('r')
 9
10zu = VectorTopo('zachranka_ulice')
11cols = [('cat',       'INTEGER PRIMARY KEY'),
12        ('kod',       'INTEGER'),
13        ('ulice',     'TEXT'),
14        ('nespravny', 'INTEGER')]
15zu.open('w', tab_cols=cols)
16
17seznam = []
18for z in zachranka:
19    u = ulice.find['by_point'].geo(z, maxdist=1000.)
20    if u is None:
21        continue
22    nespravny = z.attrs['ulicekod'] != u.attrs['kod']
23    print ('{:10} {:1} {}'.format(z.attrs['kod'], nespravny, u.attrs['nazev']))
24    zu.write(z, (z.attrs['kod'], u.attrs['nazev'], nespravny))
25    if u.cat not in seznam:
26        zu.write(u, (None, u.attrs['nazev'], None))
27        seznam.append(u.cat)
28
29zu.table.conn.commit() # nutne pro zapis atributu !!!
30
31zu.close()
32zachranka.close()
33ulice.close()

Skript ke stažení zde.

Varování

Velmi důležitý řádek je 29, kde dochází k zápisu atributů do atributové tabulky. Pokud nezavoláte funkci commit(), tak do výstupní vektorové mapy nezapíší žádné atributy!

Skript současně vypisuje na výstup kód záchranky, 0 nebo 1 podle toho, zda se nalezená nejbližší ulice shoduje s údajem z RÚIANu a nakonec adresu této ulice. Výpis může vypadat následovně:

40432211 0 Chrpová
40432408 1 Strašnická
40433048 0 Práčská
../_images/zachranka_ulice.png

Obr. 14 Zvýraznění úseků ulic nejbližších dané záchrance.