Algoritmes van Processing uitvoeren via Python (QGIS3)

De Toolbox van Processing in QGIS bevat een nog steeds groeiende collectie van gereedschappen voor geoprocessing. De Toolbox verschaft een gemakkelijke interface voor het batch-verwerking om een algoritme uit te voeren op een groot aantal invoeren. Bekijk Massa verwerken met behulp van Framework Processing (QGIS 3). Maar er zijn gevallen waarin u een beetje aangepaste logica in uw batch-verwerking moet inbouwen. Omdat alle algoritmes van Processing programmatisch kunnen worden uitgevoerd via de Python API, kunt u ze ook uitvoeren via de Python Console. Deze handleiding laat u zien hoe een algoritme van Processing uit te voeren via de Python Console om een aangepaste taak voor geoprocessing uit te voeren met slechts enkele regels code. Bekijk de handleiding Beginnen met programmeren in Python (QGIS3) om bekend te geraken met de basisbeginselen van de omgeving voor Python Scripting in QGIS.

Overzicht van de taak

We zullen 12 gerasterde rasterlagen gebruiken die de neerslag voor elke maand van het jaar weergeven en de gemiddelde maandelijkse neerslag berekenen voor de postcodes in de omgeving van Seattle.

Andere vaardigheden die u zult leren

  • Verkrijg toegang tot alle lagen (raster en vector) vanuit de console van Python en druk hun namen af.

  • Verschillende lagen samenvoegen tot één bestand met script van Python.

De gegevens ophalen

De PRISM Climate Group verzamelt klimatologische gegevens en verschaft historische en recente klimaatgegevens voor de gehele VS. Ga naar de gegevenspagina Recent Years en download de maandelijkse neerslaggegevens voor het jaar 2017 in de indeling BIL.

../../_images/data119.png

City of Seattle Open Data portal verschaft gratis en open gegevens voor de stad. Zoek naar en download de gegevens Zip Codes in de indeling shapefile.

Voor het gemak kunt u direct een kopie van beide gegevenssets downloaden vanaf de links hieronder:

PRISM_ppt_stable_4kmM3_2017_all_bil.zip

Zip_Codes.zip

Gegevensbron: [PRISM] [CITYOFSEATTLE]

Procedure

  1. Zoek naar de map PRISM_ppt_stable_4kmM3_2017_all_bil in de QGIS Browser en vergroot die. De map bevat 12 individuele lagen voor elke maand. Houd de Ctrl-toets ingedrukt en selecteer de bestanden .bil voor alle 12 maanden. Eenmaal geselecteerd, sleep ze naar het kaartvenster.

../../_images/1140.png

Notitie

De gegevens worden geleverd in de indeling BIL. Elke laag wordt weergegeven met een set bestanden, bestand .bil dat de feitelijke gegevens bevat, een bestand .hdr dat de structuur van de gegevens beschrijft en een bestand .prj dat de informatie voor de projectie bevat. QGIS kan het bestand .bil laden vooropgesteld dat de andere bestanden bestaan in dezelfde map.

  1. Een dialoogvenster Transformatie voor PRISM_ppt_stable_4kmM3_2017_all_bil selecteren zal verschijnen, laat de selectie op de standaardwaarden en klik op OK.

../../_images/2109.png
  1. Zoek vervolgens naar de map Zip_Codes en vergroot die. Sleep het bestand Zip_Codes.shp naar het kaartvenster.

../../_images/357.png
  1. Klik met rechts op de laag Zip_Codes en selecteer Op kaartlaag inzoomen. U zult de polygonen van de postcodes voor de stad en omliggende gebieden zien.

../../_images/429.png
  1. Ga naar Processing ‣ Toolbox.

../../_images/527.png
  1. Het algoritme om monsters te nemen uit een rasterlaag met behulp van vectorpolygonen staat bekend als Gebiedsstatistieken. Zoek naar het algoritme in de Toolbox van Processing. Selecteer het algoritme en ga er met uw muis overheen. U zult een Helptip zien met de tekst Algorithm ID: ‘native:zonalstatisticsfb’. Onthoud deze ID, die nodig is om dit algoritme aan te roepen via de API van Python. Dubbelklik op het algoritme Gebiedsstatistieken om het te starten.

../../_images/627.png
  1. We zullen een handmatige test van het algoritme uitvoeren voor één enkele laag. Dit is een nuttige manier om te controleren of het algoritme zich gedraagt zoals verwacht en ook een gemakkelijke manier om uit te zoeken hoe de relevante parameters aan het algoritme door te geven wanneer het gebruikt wordt via Python. Selecteer, in het dialoogvenster Gebiedsstatistieken, Zip_Codes als de Invoerlaag, PRISM_ppt_stable_4kmM3_201701_bil als de Rasterlaag en laat de andere parameters op hun standaardwaarden. Klik op de knop naast Statistieken om te berekenen en selecteer alleen Gemiddelde, klik vervolgens op de knop naast Gebiedsstatistieken en sla de laag op als january_mean.gpkg . Klik op Uitvoeren.

../../_images/726.png
  1. Schakel, als het algoritme is voltooid, naar de tab Log. Maak een notitie van de Parameters invoer die werden doorgegeven aan het algoritme. Klik op Close.

../../_images/826.png
  1. Nu zal een nieuwe laag january_mean worden toegevoegd aan het kaartvenster. Laten we de resultaten controleren, klik met rechts op de laag en selecteer Attributentabel openen. Dit bepaalde algoritme past de laag voor de invoerzones ter plekke aan en voegt een nieuwe kolom toe voor elke statistiek die werd geselecteerd. Een nieuwe kolom, genaamd _mean, is toegevoegd aan de tabel, omdat we alleen de waarde Gemiddelde hadden geselecteerd. De _ is het standaard voorvoegsel. Wanneer we het algoritme uitvoeren voor lagen van alle maanden is het nuttig om een aangepast voorvoegsel met het nummer van de maand te specificeren, zodat we eenvoudig de gemiddelde waarden kunnen identificeren voor elke maand (d.i. 01_mean, 02_mean etc.). Specificeren van dit aangepaste voorvoegsel is niet mogelijk in de interface Batch Processing van QGIS en als we deze opdracht zouden uitvoeren met die interface, zouden we het aangepaste voorvoegsel handmatig moeten toevoegen voor elke laag. Als u werkt met een groot aantal lagen kan dit behoorlijk omslachtig zijn. Vandaar dat we deze aangepaste logica kunnen toevoegen met de API van Python en het algoritme in een for-loop voor elke laag uitvoeren.

../../_images/926.png
  1. Ga, terug in het hoofdvenster van QGIS, naar Plug-ins ‣ Python Console.

../../_images/1034.png
  1. Klik op de knop Bewerker weergeven. Dit zal de bewerker voor Python openen waar veel code voor Python kan worden geschreven en uitgevoerd met één enkele klik op een knop.

../../_images/1141.png
  1. We moeten toegang hebben tot alle namen van de lagen om het algoritme van Processing uit te voeren via Python. Voer de volgende code in de bewerker in en druk op de knop Opdracht uitvoeren. U zult de namen van alle lagen zien afgedrukt in de console.

root = QgsProject.instance().layerTreeRoot()
for layer in root.children():
  print(layer.name())
../../_images/1235.png
  1. Wel, laten we nu het Gemiddelde berekenen voor één maand en een uitvoerlaag maken. In de code hieronder wordt break gebruikt om de loop te beëindigen nadat die de eerste keer is uitgevoerd, op deze manier kunnen we het gemiddelde voor de maand Januari berekenen.

import re

root = QgsProject.instance().layerTreeRoot()

input_layer = 'Zip_Codes'
unique_field = 'OBJECTID'

# Iterate through all raster layers
for layer in root.children():
  if layer.name().startswith('PRISM'):
    # Run Zonal Stats algorithm
    # Extract the YYYYMM part of the layer name
    pattern = r'_(\d+)_'
    matches = re.findall(pattern, layer.name())
    # Use the month as the prefix
    prefix = matches[0][-2:]
    params = {'INPUT_RASTER': layer.name(),
        'RASTER_BAND': 1, 'INPUT': input_layer,
        'COLUMN_PREFIX': prefix+'_', 'STATISTICS': [2],
        'OUTPUT': 'memory:'
        }
    result = processing.run("native:zonalstatisticsfb", params)

    result_layer = result['OUTPUT']
    QgsProject.instance().addMapLayer(result_layer)
    # Breaking out of loop to demonstrate the
    # zonalstatistics algorithm.
    break
../../_images/1333.png

Notitie

U kunt ook een QGIS algoritme voor Processing via Python uitvoeren met de functie processing.runAndLoadResults() in plaats van met processing.run() zoals hierboven weergegeven - wat het resultaat direct in het kaartvenster van QGIS zal laden.

  1. Een nieuwe laag output zal wordne toegevoegd aan het kaartvenster, klik met rechts op de laag en selecteer Attributentabel openen. 01_mean geeft het gemiddelde voor één mand weer, net zoals het hierboven vermelde algoritme 12 nieuwe lagen zal maken als het wordt uitgevoerd zonder de break.

../../_images/1431.png
  1. Now lets add code to merge all the months mean, and create an single output layer from it. We update the previous code, to iteratively run the Zonal Statistics algorithm. We define a new variable result_layer which is set to Zip_Codes in the beginning but gets updated with the output layer from each iteration. This will allow us to use the result of each iteration and add new columns to it. Enter the following code to iterate over all raster layers and create an single layer containing all months mean.

import re

root = QgsProject.instance().layerTreeRoot()

input_layer = 'Zip_Codes'
result_layer = input_layer
unique_field = 'OBJECTID'

# Iterate through all raster layers
for layer in root.children():
  if layer.name().startswith('PRISM'):
    # Run Zonal Stats algorithm
    # Extract the YYYYMM part of the layer name
    pattern = r'_(\d+)_'
    matches = re.findall(pattern, layer.name())
    # Use the month as the prefix
    prefix = matches[0][-2:]
    params = {'INPUT_RASTER': layer.name(),
        'RASTER_BAND': 1, 'INPUT': result_layer,
        'COLUMN_PREFIX': prefix+'_', 'STATISTICS': [2],
        'OUTPUT': 'memory:'
        }
    result = processing.run("native:zonalstatisticsfb", params)

    # Update the result_layer variable
    # The result will be used as input for the next iteration
    result_layer = result['OUTPUT']

QgsProject.instance().addMapLayer(result_layer)
../../_images/1526.png
  1. Als het verwerken eenmaal is voltooid zal een nieuwe laag output worden toegevoegd aan het kaartvenster. Klik met rechts op de laag en klik op Attributentabel openen.

../../_images/1625.png
  1. U zult in de tabel 12 nieuw toegevoegde kolommen zien met aangepaste voorvoegsels en waarden voor de gemiddelde neerslag, uitgenomen uit de rasterlagen.

../../_images/1726.png

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)