Úvod do prostorových dotazů

Prostorová data jsou v rámci databází úplně normální data uložena v tabulce, kde jeden z atributů (sloupečků) je geometrie objektu.

Prostorové dotazy nejsou nic jiného, že standardní databázové dotazy typu SELECT s tím, že např. v podmínce WHERE aplikujeme některý z prostorových filtrů pomocí speciálních funkcí nebo operátorů.

Základní funkce

Mezi základní funkce, se kterými se můžeme setkat jsou funkce pro převody geometrií a základní informace o geometrii.

ST_AsText

Geometrie jsou v databázi uloženy ve formátu WKB (well know binary) - pro lidi prakticky nečitelný zápis. Pro zobrazení ve formátu WKT (Well Known Text) slouží tato funkce. Může nám pomoci ke kontrole obsahu, např. zda máme očekávané souřadnice.

SELECT st_astext(geom) FROM parcely;
../_images/ssql1.png

Obr. 23 ST_AsText

ST_Area

Tato funkce slouží k výpočtu plochy polygonu.

SELECT st_area(geom) FROM parcely;
../_images/ssql2.png

Obr. 24 ST_Area

ST_Transform

Tato funkce slouží k transformaci mezi souřadnicovými systémy. V dotazu je použito klíčové slovo LIMIT, které omezí dotaz na uvedený počet záznamů.

SELECT st_astext(st_transform(geom, 4326)) FROM parcely LIMIT 5;
../_images/ssql3.png

Obr. 25 ST_Transform

ST_Intersects

Tato funkce slouží k zjištění zda se dvě geometrie prostorově protínají. Zde ji používáme v kombinaci dvou vrstev s využitím JOIN. V příkladu také používáme operátor ||, který slouží, k zřetězení řetězců. Pomocí něj ze dvou atributů vytvoříme zápis parcelního čísla, tak jak jej známe, tedy číslo / podlomení.

SELECT (p.KmenoveCislo || '/' || p.PododdeleniCisla) cislo, u.Nazev
FROM ulice u JOIN parcely p ON
(u.Nazev = 'Podevsí' AND (ST_Intersects(u.geom, p.geom)));
../_images/ssql4.png

Obr. 26 ST_Intersects

Výsledkem dotazu jsou dvě parcely, protože ulice zasahuje svou geometrií do dvou parcel, tak jak je zobrazeno na dalším obrázku

../_images/ssql5.png

Obr. 27 Parcely zasahující do osy ulice Podevsí

Využití pohledu

Jak jsme si už říkali, můžeme tento SELECT uložit pro pozdější využití

CREATE VIEW parcely_podevsi AS
SELECT (p.KmenoveCislo || '/' || p.PododdeleniCisla) cislo, u.Nazev
FROM ulice u JOIN parcely p ON
(u.Nazev = 'Podevsí' AND (ST_Intersects(u.geom, p.geom)));