Skip to content

13 QGIS Python

Jürgen Hansmann edited this page Jun 18, 2026 · 5 revisions

QGIS Python

QGIS hat eine eingebaute Python-Konsole. Damit kann man direkt mit dem geöffneten Projekt, den geladenen Layern und den Geodaten interagieren - ohne ein separates Skript zu schreiben, und ohne 47 Menüklicks für eine einfache Abfrage.

Wer bis hierhin durchgehalten hat, versteht jetzt alles, was dazu nötig ist: Variablen, Schleifen, Bedingungen, Funktionen. Die QGIS-Konsole ist einfach Python - in einem anderen Kontext.

Die Konsole öffnet man über: Erweiterungen → Python-Konsole (oder Ctrl+Alt+P).


Die QGIS Python-Konsole funktioniert auf Windows, macOS und Linux identisch - QGIS bringt sein eigenes Python mit.


Beispiel: Kantonsgrenzen von swisstopo laden und auswerten

Hier ein Beispiel, das zeigt, wie man einen swisstopo-Layer direkt aus der Python-Konsole lädt und auswertet - ohne vorher irgendetwas manuell zu klicken.

Schritt 1: Layer laden

swisstopo stellt swissBOUNDARIES3D als gezipptes GeoPackage bereit. Mit /vsizip/vsicurl/ liest GDAL die ZIP-Datei direkt über HTTP - ohne sie vorher herunterzuladen und zu entpacken:

url = (
    "/vsizip/vsicurl/https://data.geo.admin.ch/ch.swisstopo.swissboundaries3d/"
    "swissboundaries3d_2026-01/swissboundaries3d_2026-01_2056_5728.gpkg.zip"
)

# |layername=... wählt den Kantons-Layer aus dem GeoPackage (das mehrere Layer enthält)
layer = QgsVectorLayer(f"{url}|layername=tlm_kantonsgebiet", "Kantone", "ogr")

if layer.isValid():
    QgsProject.instance().addMapLayer(layer)
    print(f"Layer geladen: {layer.name()}, {layer.featureCount()} Features")
else:
    print("Fehler: Layer konnte nicht geladen werden.")

QgsVectorLayer und QgsProject müssen hier nicht importiert werden - die QGIS Python-Konsole lädt qgis.core und qgis.utils automatisch vor (siehe PyQGIS Cookbook). Der Skript-Editor teilt sich dieselbe Umgebung wie die Konsole, also gilt das auch dort.

Der Layer erscheint danach in der QGIS-Legende - genau so, als hätte man ihn manuell über den Layer-Dialog hinzugefügt.

Schritt 2: Felder anzeigen

layer = iface.activeLayer()
print(layer.fields().names())

Schritt 3: Erste Features inspizieren

for feature in list(layer.getFeatures())[:10]:  # max. 10
    print(feature["name"], "–", feature["kantonsnummer"])

Schritt 4: Nach Attribut filtern

for feature in layer.getFeatures():
    if feature["kantonsnummer"] <= 3:  # ZH, BE, LU (nach kantonsnummer sortiert)
        print(feature["name"], f"– Fläche: {feature.geometry().area() / 1e6:.0f} km²")

Schritt 5: Features selektieren

# Alle Kantone mit Fläche > 2000 km² auswählen
ids = [
    f.id() for f in layer.getFeatures()
    if f.geometry().area() / 1e6 > 2000
]
layer.selectByIds(ids)
print(f"{len(ids)} Kantone selektiert")

Die selektierten Features werden in QGIS gelb hervorgehoben - Python-Code und Karte interagieren direkt.


iface ist das Interface zu QGIS selbst - automatisch verfügbar, kein Import nötig. QgsProject.instance() ist das aktuelle QGIS-Projekt.


Grundprinzip

# Aktiven Layer abfragen
layer = iface.activeLayer()
print(layer.name())
print(layer.featureCount())

Über Features iterieren

layer = iface.activeLayer()

for feature in list(layer.getFeatures())[:10]:  # max. 10, sonst endlos bei grossen Layern
    name = feature["name"]
    geom = feature.geometry()
    print(f"{name}: Fläche {geom.area() / 1e6:.0f} km²")

feature["name"] greift auf die Attributspalte name zu - genau wie bei einem Dictionary.

Ausgewählte Features

for feature in layer.selectedFeatures():
    print(feature["name"])

Neuen Layer erstellen und hinzufügen

# Temporären Punktlayer erstellen
layer = QgsVectorLayer("Point?crs=EPSG:2056", "Meine Punkte", "memory")
QgsProject.instance().addMapLayer(layer)

Skripte im Editor

Grössere Skripte schreibt man nicht in der Konsole, sondern im eingebauten Editor (neben der Konsole: Symbol «Skript-Editor öffnen»). Der Editor erlaubt mehrzeilige Skripte, Syntaxhervorhebung und das Speichern von .py-Dateien.


Übung: Kantone auswerten qgis_kantone.py

  1. Öffne QGIS und die Python-Konsole.
  2. Lade den Kantonsgrenz-Layer von swisstopo mit dem Code aus dem POC oben.
  3. Zeige alle Spaltennamen mit layer.fields().names().
  4. Gib die 5 flächengrössten Kantone aus (berechne die Fläche mit feature.geometry().area()).
  5. Selektiere alle Kantone, die an den Kanton Bern grenzen.

Tipp: Mit layer.fields().names() siehst Du die genauen Spaltennamen - Gross-/Kleinschreibung zählt.


Übung: Messpunkte laden qgis_messpunkte.py

  1. Lade messpunkte.csv direkt in QGIS (Layer → Layer hinzufügen → Getrennte Textdatei).
  2. Öffne die Python-Konsole.
  3. Gib für jeden Messpunkt Name und Höhe aus.
  4. Berechne mit Python die Höhendifferenz zwischen dem höchsten und tiefsten Punkt.

Weiterführend: PyQGIS

Die vollständige QGIS Python-API heisst PyQGIS. Damit lassen sich unter anderem:

  • Symbologie und Darstellung steuern
  • Verarbeitungsalgorithmen (Processing) automatisieren
  • Eigene QGIS-Plugins entwickeln

Dokumentation: docs.qgis.org/latest/de/docs/pyqgis_developer_cookbook

Clone this wiki locally