Knihovna GDAL/OGR

Programování v GIS 2

Jan Caha

2025-03-03

Popis GDAL/OGR

  • nízkoúrovňová open source knihovna
  • v Pythonu zpřístupňujeme její binding - dokumentace
  • kód knihovny v C/C++ odlišnosti v chování od Pythonu (místy ne zcela logické chování, řídí se historickými přístupy)
  • většinu objektů uložených v proměnných je vhodné po použití nastavit na None, čímž se explicitně uvolní paměťové prostředky
  • knihovna má hlavní modul osgeo a několik dílčích modulů
    • gdal - rastry
    • ogr - vektory
    • osr - souřadnicové systémy
  • kód není typovaný jak je Pythonu doporučované a je dobré místy typování doplňovat, aby IDE mohlo poskytovat nápovědu a mypy dobře kontrolovat kód

Příklady typování

from pathlib import Path

from osgeo import gdal, ogr

gdal.UseExceptions()

file = Path(__file__).parent / "soubor.txt"

ds: gdal.Dataset = gdal.OpenEx(file.as_posix())

layer: ogr.Layer = ds.GetLayer()

Zdroje informací

  • GDAL/OGR Cookbook
  • řada ukázek a příkladům, které jsou vhodným startovacím bodem

Otevírání souborů

  • funkce gdal.OpenEx() (rastry i vektory) a ogr.Open() (pouze vektory)
  • jako první první parametr cesta k souboru
    • buď lokální - klasický zápis
    • nebo virtuální začínající /vsi* kde * je typ virtuální složky

Virtuální složky

  • např. /vsicurl/cesta_k_online.souboru - automaticky stahuje data
  • /vsizip/cesta_k_lokálnímu.souboru - extrahuje ze zip souboru
  • /vsis3, /vsigs, /vsiaz, /vsioss pro přístup k online službám
  • /vsimem - soubory v RAM paměti, existují pouze po dobu běhu programu, mají ale excelentní rychlost přístup - neomezuje je fyzický disk ale mají specifický určený formát
  • tyto adresy pak fungují všude, kde je GDAL/OGR využíván (třeba python knihovny ale i QGIS)

Drivery

  • každý podporovaný formát má svůj vlastní
  • mohou být pouze pro čtení (DWG), značná část ale podporuje i zápis (GPKG, GeoTiff)
  • některé drivery nepodporují změnu dat, lze je pouze načíst a vytvořit (GeoJSON)
  • často není nutné k nim přistupovat přímo, ale např. pro vytvoření nových dat (souboru) to nutné je
  • drivery MEM - raster a Memory - vektor pro data neuložené fyzicky, ale pouze v RAM
    • velice jednoduché a rychlé formáty, ale pouze pro dobu běhu programu
    • nemají formát v pravém slova smyslu (existují jako objekty v nějaké podobě v paměti)
    • neplést s daty s adresou /vsimem - také v RAM, ale mají formát

Obecné struktury

  • drivery gdal.Driver a ogr.Driver - reprezentace jednotlivých driverů
  • souřadnicový systém osr.SpatialReference - reprezentace souřadnicového systému a operací s nimi

GDAL Struktury

  • datový zdroj gdal.Dataset - základní objekt pro práci s daty, zdroj dat
  • pásmo gdal.Band - jednotlivá vrstva v rastrovém souboru, může být i pouze jedna
  • array gdal.MDArray - sice existuje, ale v Pythonu spíše používáme numpy.array (funkce ReadAsArray())
  • a další, ale tyto jsou nejdůležitější

OGR Struktury

  • datový zdroj ogr.DataSource (ale může být i gdal.Dataset) - základní objekt pro práci s daty, zdroj dat
  • vrstva ogr.Layer - reprezentace jedné vrstvy v datovém zdroji
  • definice vrstvy ogr.FeatureDefn - definice vrstvy, obsahuje informace o atributech (typy, geometrie etc.)
  • prvek ogr.Feature - reprezentace jednoho prvku ve vrstvě
  • geometrie ogr.Geometry - reprezentace geometrie prvku
  • atributy ogr.Field - reprezentace atributu prvku
  • a další, ale tyto jsou nejdůležitější

OGR Geometry

  • reprezentace geometrie
  • řada funkcí a operací, přímo na objektu
  • funkce ogr.GT_* pro modifikace a konverze
  • ogr.CreateGeometryFrom* pro tvorbu geometrie z různých formátů
  • formáty WKB a WKT

Příklad

Načtení souboru a základní info

  • další ukázka v příkladech
from pathlib import Path

from osgeo import gdal, ogr

gdal.UseExceptions()

if __name__ == "__main__":
    file = Path.cwd().parent.parent / \
        "_data" / "ne_10m_admin_0_countries.shp"

    print(file.exists())

    ds: gdal.Dataset = gdal.OpenEx(file.as_posix())

    layer: ogr.Layer = ds.GetLayer()

    print(layer.GetName())
    print(layer.GetFeatureCount())

Vlastní kontextové managery

  • pro práci s vrstvami, pásmy, ale i datovými zdroji GDAL/OGR může být užitečné vytvořit si vlastní třídy kontextových managerů
  • předejdeme tak problémům s uvolněním paměti a zjednodušíme si práci
  • příklad na cvičení

Spouštění operací z GDAL

  • hlavní funkce
  • gdal.VectorTranslate() (gdal.VectorTranslateOptions()) pro vektorová data
  • pro rastrová data je funkcí vícero gdal.Translate() (gdal.TranslateOptions()), gdal.Warp() (gdal.WarpOptions())
  • mnoho dalších popsaných v dokumentaci
  • množství parametrů, vhodné prostudovat - mnoho operací lze řešit pomocí těchto funkcí
  • všude, kde se používají cesty k souborům lze použít cesty /vsi* nebo přímo objekty gdal.Dataset

Práce s daty v paměti

  • viz ukázkový kód na cvičení
  • bez formátu s určitým formátem

Výhody GDAL/OGR

  • dostupnost
  • přístup k širokému spektru geodat
  • přístup na všech úrovních
  • široké spektrum možností a nastavení
  • přípravené nástroje

Nevýhody GDAL/OGR

  • někdy ne úplně “pythonový” přístup k operacím
  • komplikovanější postupy
  • někdy až příliš široké možnosti
  • vede ke složitějším skriptům

Zhodnocení

  • nástroj s nejširší nabídkou možností a potenciálem
  • klade vyšší nároky na programátora
  • mohou vznikat “zajímavé” chyby, těžší na odhalení a vyřešení
  • zcela jistě nástroj o němž má geoinformatik mít přehled a znát ho

Dotazy?