03. QGIS - nástroje zpracování, modelář, PyQGIS¶
V této části se zaměříme na možnosti automatizace výpočetních kroků v prostředí QGIS https://qgis.org. Kontrétně:
- grafický modelář
- Python API (PyQGIS)
Příklad výpočetní úlohy¶
Nejprve si vyzkoušíme řešit následující výpočetní úlohu pomocí
nástrojů zpracování (Processing > Toolbox
).
Zadání¶
Vyberte body z datasetu LUCAS nacházející se v jižní Itálii v oblastech, kde může dojít k zamrzání vody (nadmořká výška nad 1000 m n. m.). Výsledek validujte na základě CORINE Land Cover (CLC).
Vstupní data¶
Poznámka
Předstažená data najdete na GIS.labu v adresáři Repository/155FGIS/03
.
- Stáhněte DTM pokrývající jižní Itálii ve formátu GeoTIFF
- Dlaždice E40N10
- https://land.copernicus.eu/imagery-in-situ/eu-dem/eu-dem-v1.1
- Stáhněte CLC pro Evropu ve formátu GeoPackage
- Stáhněte data LUCAS z projektu ST_LUCAS pro danou zájmovou oblast
Postup výpočtu¶
- Identifikujte území s nadmořskou výškou nad 1000 m n.m.
- Omezte body LUCAS na základě vektorové masky
Vector > Geoprocessing Tools > Clip...
- Vyberte body LUCAS s třídou krajinného pokryvu korespondující s vodou (viz atribut LC1)
- Výběr uložte do nové vrstvy
Pravé tlačítko nad vrstvou > Export > Save selected features as...
- Nikdy nevěřte jednomu datovému zdroji - proveďte validaci na základě vodních ploch z datasetu CLC
- Ořežte plochy CLC na základě vektorové masky zájmového území
- Vyberte plochy s třídou korespondující s vodou (viz atribut Code_18)
- Výběr uložte do nové vrstvy
- Vybrané CLC plochy rozšiřte pomocí obalové zóny o 100m
- Vyberte body LUCAS ležicí v rozšířených CLC plochách
Výsledek úlohy je následující:
Úkol
Omezte úlohu pouze na severní svahy
Grafický modelář¶
Pro výše uvedenou úlohu vytvořte model: Processing > Graphical Modeler
.
Postup:
- do modelu nejprve přidejte vstupní data (záložka
Inputs
) - posléze přidávejte výpočetní nástroje (záložka
Algorithms
)
Poznámka
Masku zájmového uzemí zkuste vytvořit namísto rastrového kalkulátoru
pomocí reklasifikace (Reclassify by table
).
Výsledný model může vypadat následovně (ke stažení zde):
Úkol
Přidejte další vstupní parametry:
- LUCAS LC třída
- CLC třída
- velikost obalové zóny
Úkol
Vyzkoušejte export modulu do Python skriptu. Takto vytvořený skript lze spustit z panelu nástrojů zpracovaní.
Python API¶
Processing¶
Stáhněte data LUCAS pro vaše zájmové území a proveďte následující
výpočet pomocí Python modulu processing
:
- vyberte body LUCAS na první úrovni nomenklatury Land Cover (LC) , viz řádek 4. K tomu použijte nástroj native:extractbyexpression, viz řádek 13.
- ořežte plochy CLC na základě prostorového rozsahu vybraných bodů LUCAS gdal:clipvectorbyextent, viz řádek 21.
- dále omezte výběr ploch CLC na první úrovni nomenklatury LC podobně jako u bodu 1, viz řádek 6 a 29
- vytvořte obalovou zónu kolem vybraných CLC ploch native:buffer, viz řádek 7 a 37
- na závěr vyberte body LUCAS, které leží v rozšířených CLC plochách native:extarctbylocation, viz řádek 45
Úkol
Skript upravte tak, aby mezivýsledky ukládal do paměti počítače. Můžete se inspirovat skriptem exportovaným z grafického modeláře.
Úkol
Projděte další úlohy ze školení skupiny GISMentors.
PyQGIS¶
Dokumentace:
Projděte všechny vrstvy a vypište jejich souřadnicový systém.
from qgis.core import QgsProject
# mapLayers() vraci slovnik
for layer in QgsProject.instance().mapLayers().values():
print(f'{layer.name()}: {layer.crs().authid()}')
Projděte všechny body ve vybrané vrstvě a vypište jejich souřadnice a
hodnotu atributu lc1
.
from qgis.core import QgsProject
# mapLayersByName() vraci seznam
for feature in QgsProject.instance().mapLayersByName('lucas')[0].getFeatures():
# souradnice lze vypsat i pomoci feature.geometry(), ale pokud chceme
# jejich hodnoty, musime z nich vytvorit objekt typu Point
# print(point.geometry())
point = feature.geometry().asPoint()
print(f'[{point.x()}, {point.y()}]: {feature["lc1"]}')
Projděte všechny body ve vybrané vrstvě, vytvořte kolem nich obalovou
zónu s poloměrem určeným atributem obs_dist
, a vypočtěte její obsah.
from qgis.core import QgsProject
# mapLayersByName() vraci seznam
for feature in QgsProject.instance().mapLayersByName('lucas')[0].getFeatures():
if feature['obs_dist']: # nutno pokud jsou nektere prvky NULL
# druhym parametrem je pocet lomovych bodu pouzitych k vytvoreni kruznice
# (jedna se o body navic ke ctyrem potrebnym pro ctverec)
buffer = feature.geometry().buffer(feature["obs_dist"], 5)
point = feature.geometry().asPoint()
print(f'[{point.x()}, {point.y()}]: {buffer.area()} m2')
Úkol
Vyzkoušejte si rozdílné aproximace kružnice pro obalovou zónu.
Úkol
Projděte další úlohy ze školení skupiny GISMentors.