Geometrie v QGIS Python API

Programování v GIS 4

Jan Caha

2025-10-14

Rozhraní - interface

  • specifikace definice objektů, jeho atributů a metod (funkcí), ale bez konkrétních implementací (nebo pouze jejich částí)
  • samotné interface objekty nelze vytvořit (protože se nejedná o kompletní objekty)
  • třídy, které z nich odvozují, musí specifikovat chybějící implementace - vnitřní implementace je věcí objektu
  • důvod - všechny objekty, které implementují rozhraní lze využívat zaměnitelně a lze navrhovat funkce, které pracují s rozhraními
  • v Pythonu pomocí třídy ABC z modulu abc

Příklad

  • viz skript
  • v realitě mnohem komplexnější - interface třídy mohou definovat i desítky funkcí (část z nich mohou i implementovat), funkce implementující rozhraní mohou funkce přepisovat, upravovat a nadstavovat

Příklad rozhraní v QGIS

  • QgsMapLayer - rozhraní pro všechny vrstvy
  • funkce např. crs(), extent(), legend(), renderer(), reload() a celá řada dalších
  • funkce jsou společné bez ohledu na typ vrstvy
  • vektorové vrstvy, rastrové vrstvy, mesh vrstvy, point cloud vrstvy atd.
  • všechny vrstvy implementují rozhraní QgsMapLayer a lze s nimi tudíž nakládat stejně
  • další příklad jsou geometrie

QgsGeometry

  • hlavní třída pro práci s geometrií
  • obsahuje řadu funkcí (i statické)
  • samotná geometrie ve třídě ale pouze odkaz na interface

Praktické tipy

  • vytvářejte geometrie přes konkrétní třídy (QgsPoint, QgsLineString, …), případně pomocí WKT/WKB
  • QgsGeometry využijte pro transformace, serializaci (asWkt(), asWkb()), validitu (isGeosValid()), prostorové operace (buffer(), centroid(), intersection(), …)
  • mějte na paměti, že dostupné funkce a jejich význam se liší podle typu geometrie (např. area() dává smysl pro plochy, nikoliv pro body/linie)

QgsAbstractGeometry

  • interface pro geometrie
  • komplexně definovány všechny funkce, které by měla geometrie implementovat
  • mnoho tříd geometrií založených na tomto interface
    • QgsPoint, QgsLineString, QgsPolygon
    • QgsMultiPoint, QgsMultiLineString, QgsMultiPolygon
    • QgsGeometryCollection
    • QgsSurface, QgsCurve, QgsCompoundCurve, QgsTriangle

Hierarchie geometrií v QGIS

  • QgsAbstractGeometry – společné rozhraní pro všechny geometrie
  • Základní geometrie:
    • QgsPoint, QgsLineString, QgsPolygon
  • Multi-geometrie:
    • QgsMultiPoint, QgsMultiLineString, QgsMultiPolygon
  • Kolekce a další specializace:
    • QgsGeometryCollection, QgsSurface, QgsCurve, QgsCompoundCurve, QgsTriangle

Poznámka: Třída QgsGeometry je „obal“ kolem konkrétní implementace rozhraní QgsAbstractGeometry a poskytuje nadstavbové funkce (transformace, serializace WKT/WKB, validace, prostorové operace atp.).

Krátká ukázka (Python)

from qgis.core import QgsGeometry, QgsPoint, QgsTriangle

# vytvoření trojúhelníku z bodů (QgsTriangle implementuje QgsAbstractGeometry)
triangle = QgsTriangle(
  QgsPoint(0, 0),
  QgsPoint(1, 0),
  QgsPoint(0.5, 2),
)

# metriky přímo nad abstraktní geometrií
print(f"Area: {triangle.area()}")      # plocha trojúhelníku
print(f"Length: {triangle.length()}")  # obvod trojúhelníku

# převod na hlavní třídu QgsGeometry (wrapper kolem abstraktní geometrie)
geom = QgsGeometry(triangle)

# jednoduchá operace nad geometrií – densifikace
densified = geom.densifyByDistance(0.3)
print(densified.asWkt())  # výstup ve formátu WKT

Další poznámky

  • většina metod je definována v rozhraní a implementována v konkrétních třídách
  • partCount() a ringCount() dávají smysl pro vícedílné nebo polygonové geometrie; u bodů vrací typicky 1/1
  • pro práci s kolekcemi (QgsGeometryCollection) je vhodné hlídat typy prvků uvnitř kolekce

Dotazy?