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.
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í.
Jednotlivé prvky procházíme sekvenčně v cyklu
for
na řádku 8.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ů.
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í.
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 funknciviter()
.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á