Geometrie geoprvků a knihovna Shapely

V této části se blíže seznámíme jak pracovat s geometrií vektorových prvků.

Knihovna Shapely (stejného autora jako Fiony) nám umožňuje pracovat s geometrickou složkou popisu geoprvků opět ve stylu jazyka Python. Stejně jako Fiona, převádí Shapely geometrické vlastnosti na objekty typu JSON.

Jak jsme si řekli, Fiona převádí vstupní data z různých formátů na strukturu GeoJSON:

from shapely.geometry import shape
cr = chko[54]

Shapely

Shapely obsahuje i některé funkce pro modifikaci geometrií, například generalizaci, obalovou zónu (buffer) nebo porovnání dvou geometrií. Shapely využívá pro manipulaci s geometriemi knihovu GEOS, která je zase re-implementací nástroje JTS (Java Topoology Suite) do jazyka C, a používá se například v databázové nadstavbě PostGIS. GEOS a JTS odpovídají specifikaci OGC Simple Feature. Knihovna Shapely nám umožní řešit například úlohy typu:

  • Jakou výměru má plošný prvek?
  • Překrývají se dva prvky?
  • Jak vypadá společný průnik více prvků?
  • Vytvořit obalovou zónu okolo prvku.

Pro práci s geometriemi proto potřebujeme převést data na struktury Shapely:

poly = shape(cr['geometry'])
print (poly.bounds)

simple = poly.simplify(10)
print (simple.intersects(poly))
(-683329.1875, -993228.75, -681265.625, -991528.0)

Poznámka

V prostředí Jupyter notebook můžeme geometrii vizualizovat prostě tak, že obsah proměnné s geometrií necháme vypsat, např.:

geom = shape(chko[54]["geometry"])
geom

Todo

Příklad vykreslení geometrie pomocí matplotlib https://deparkes.co.uk/2015/03/11/how-to-plot-polygons-in-python/

Nyní se můžeme vypsat celou řadu metadat o daném geometrickém objektu

print(geom.type)
print(geom.area)
...

Úkol

Zjistěte, jaký má naše geometrie obvod a najděte souřadnice jejího centroidu. Jaká metoda se použije pro vytvoření obalové zóny a jak funguje?

Poznámka

Kompletní ukázkový příklad na využití knihoven Fiona a Shapely zde.

Převod geometrie zpět na formát JSON

Na převod zpět do formátu JSON použijeme funkci mapping z modulu shapely.geometry

Jako příklad si vytvoříme „ručně“ celý nový vektorový objekt

new_feature = {
    "type": "Feature",
    "properties": {
        "NAZEV": "prvek s obalovou zonou 100m",
    },
    "geometry": mapping(geom.buffer(100))
}