Knihovna GDAL/OGR

Programování v GIS 2

Jan Caha

2024-03-04

Popis GDAL/OGR

  • nízkoúrovňová 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í 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ý je tak vhodné 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()

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 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

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žímáme numpy.array
  • 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ší

Příklad

  • data z Natural Earth
  • otevření souboru (bez i za použití driveru)
  • výběr vrstvy
  • iterace přes prvky - geometrie i atributy
  • definice vrstvy

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())

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

Dotazy?