Úvod do prostorových dotazů¶
Prostorová data jsou v rámci databází ukládána jako zcela běžná data ve formě tabulek, 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 čitelném pro člověka - 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](../_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](../_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](../_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](../_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](../_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)));