Prostorové funkce¶
Z mnoha funkcí a funkcionalit nabízených PostGISem se zaměříme jen na vybrané a to analytické funkce a funkce pro zpracování geometrií.
Výpočet plochy, obvodu, délky a dalších charakteristik geometrie¶
Asi nejzákladnější informace, kterou můžeme o plošném prvku (polygonu) zjistit je její výměru. Kromě typického zadání „zjisti, jak velkou mají Vomáčkovi zahrádku“ je nezbytná pro provedení pokročilejších úloh typu „vyber obce, jejichž rozloha leží alespoň z osmdesáti procent v národním parku atp“.
Tip
Poměr výměry a obvodu polygonu se používá při odstraňování „sliverů“ (mezer mezi polygony).
Jedná se o následující funkce:
- ST_Length
Délka linie lomené čáry
- ST_Area
Výpočet výměry polygonu
- ST_Perimeter
Vrací obvod polygonu
- ST_Centroid
Vrací centroid polygonu
- ST_PointOnSurface
Bod ležící uvnitř geometrie
Informace o vzájemném prostorovém vztahu prvků¶
PostGIS definuje funkce pro určení prostorového vztahu prvků dle OGC standardu Simple Features a to:
ST_Intesects a další¶
Prvky sdílejí alespoň jeden bod, dochází k jejich prostorovému průniku.
SELECT ST_Intersects('POLYGON((0 0,4 0,4 3,0 0))', 'POLYGON((2 0,6 0,6 3,2 0))');
SELECT ST_Intersects('POLYGON((0 0,4 0,4 3,0 0))', 'POLYGON((4 0,8 0,8 3,4 0))');
SELECT ST_Intersects('POLYGON((0 0,4 0,4 3,0 0))', 'POLYGON((5 0,9 0,9 3,5 0))');
Doplněk k funkci ST_Intersects, prvky jsou prostorově různé.
Prvek A prostorově obsahuje prvek B, tj. žádný bod z geometrie B neleží vně geometrie A a alespoň jeden bod z B leží uvnitř A.
Podobné jako ST_Contains
Opačné pořadí argumentů, než u předešlých funkcí.
Doplněk k funkci ST_Contains, žádný bod z geometrie A neleží vně geometrie B a alespoň jeden bod z A leží uvnitř B.
Podobná jako funkce ST_Within, geometrie leží v zadané vzdálenosti od jiné geometrie.
SELECT ST_Within('POLYGON((0 0,4 0,4 3,0 0))'::geometry, 'POLYGON((0 0,8 0,8 6,0 0))'::geometry);
SELECT ST_Contains('POLYGON((0 0,4 0,4 3,0 0))'::geometry, 'POLYGON((0 0,8 0,8 6,0 0))'::geometry);
SELECT ST_Covers('POLYGON((0 0,4 0,4 3,0 0))'::geometry, 'POLYGON((0 0,8 0,8 6,0 0))'::geometry);
SELECT ST_Contains('POLYGON((0 0,8 0,8 6,0 0))'::geometry, 'POLYGON((0 0,4 0,4 6,0 0))'::geometry);
SELECT ST_Covers('POLYGON((0 0,8 0,8 6,0 0))'::geometry, 'POLYGON((0 0,4 0,4 6,0 0))'::geometry);
SELECT ST_CoveredBy('POLYGON((0 0,4 0,4 3,0 0))'::geometry, 'POLYGON((0 0,8 0,8 6,0 0))'::geometry);
SELECT ST_Covers( 'POLYGON((0 0,8 0,8 8,0 8,0 0))'::geometry,'POLYGON((1 1,5 1,5 4,1 1))'::geometry);
Důležité
Tyto funkce jsou často velmi podobné a liší se v detailech (které však mohou být podstatné).
Obdoba ST_Intersects, vrací true pouze tehdy, pokud průnik je stejného typu jako vstupní prvky (tedy, průnikem ploch je plocha, průnikem linií linie a tak dále) a zároveň ani jeden prvek zcela nezakrývá druhý.
Prvky se prostorově kříží, tj. mají společný bod, ne však všechny.
Prvky se prostorově dotýkají, tj. mají společný bod, ne však společný vnitřek.
Geometrická shoda prvků.
ST_Relate¶
Obecné určení vzájemného prostorového vztahu prkvů vychází z takzvané „matice devíti průniků“ (DE-9IM), viz manuál. Bližší informace o této problematice zde.
Matice průniků vypadá následovně:
A/B
vnitřní část
hranice
vnější část
vnitřní část
hranice
vnější část
V každém políčku se objeví požadovaná dimenze prvku, který vznikne průnikem prvků A a B. Tedy pro bod
0
, linii1
a polygon2
. Další povolené hodnody jsouF
pro prázdný průnik,T
pro libovolný neprázdný průnik a*
v případě, že informaci o průniku na tomto místě matice nepovažujeme za směrodatnou.Tuto funkcionalitu v PostGISu zajištuje funkce ST_Relate. Funkci můžeme použít ve dvou tvarech. Pokud zadáme jako třetí argument matici průniku (i s využitím „divokých karet“), tak funkce vrací hodnoty true/false podle toho, zda jsou všechny podmínky v matici splněny. Případně funkci můžeme použít jen se dvěma argumenty, geometriemi. Potom funkce vrací matici průniku, případně můžeme přidat argument pro číslo pro pravidlo uzlů hranice.
-- výpis matice průniku SELECT ST_Relate('POLYGON((1 1,1 3,3 3,3 1,1 1))'::geometry, 'POLYGON((1 1,1 3,3 3,3 1,1 1))'::geometry); SELECT ST_Relate('POLYGON((1 1,1 3,3 3,3 1,1 1))'::geometry, 'POLYGON((0 0,0 3,3 3,3 0,0 0))'::geometry); SELECT ST_Relate('POLYGON((1 1,1 4,4 4,4 1,1 1))'::geometry, 'POLYGON((0 0,0 3,3 3,3 0,0 0))'::geometry); SELECT ST_Relate('POLYGON((3 3,3 4,4 4,4 3,3 3))'::geometry, 'POLYGON((0 0,0 3,3 3,3 0,0 0))'::geometry); SELECT ST_Relate('POLYGON((0 3,0 6,3 6,3 3,0 3))'::geometry, 'POLYGON((0 0,0 3,3 3,3 0,0 0))'::geometry); -- mají dva polygony společný prostor? SELECT ST_Relate('POLYGON((1 1,1 4,4 4,4 1,1 1))'::geometry, 'POLYGON((0 0,0 3,3 3,3 0,0 0))'::geometry, '2********'); --dva polygony se vzájemně nepřekrývají SELECT ST_Relate('POLYGON((1 1,1 4,4 4,4 1,1 1))'::geometry, 'POLYGON((0 0,0 3,3 3,3 0,0 0))'::geometry, 'F********'); -- polygony se nepřekrývají a nemají ani společnou hranici SELECT ST_Relate('POLYGON((1 1,1 4,4 4,4 1,1 1))'::geometry, 'POLYGON((5 5,9 5,9 9,5 9,5 5))'::geometry, 'F***F****');
ST_Distance¶
ST_Distance vrací minimální vzdálenost mezi dvěma prvky.
Důležité
U funkcí, které pracují s prostorovými vztahy je třeba brát v potaz zda použitá funkce pracuje interně s MOO a indexy. Například funkce ST_Intersects s nimi pracuje a funkce ST_Relate nikoliv. V případě, že funkce nepoužívá index je vhodné ji optimalizovat použitím poddotazu s operátorem.
Pokud chcete použít funkci bez předchozího použití operátoru, přidejte před název funkce podtržítko. (_ST_DWithin místo ST_DWithin)
Tip
Podívejte se na zdrojové kódy variant funkce ST_DWithin, najdete je v tabulce pg_proc.
Geometrické analýzy¶
V této části se zaměříme na funkce, které vrací modifikovanou geometrii vstupních prvků.
Obalová zóna. Funkce má dva parametry: vstupní geometrii a šířka zóny. Je možné zadat ještě nějaké další parametry (počet segmentů na čtvrtinu kruhu, „čepičky“, „kolínka“ atp).
Varování
- Různý počet segmentů se může projevit i v počtu vybraných
bodů.
SET SEARCH_PATH = ukol_1, public; SELECT COUNT(NULLIF(ST_Intersects(adresnibod, ST_Buffer(geom_p, 250)), false)) FROM ( SELECT geom_p, adresnibod FROM adresy a, vesmirne_zrudice v WHERE v.id = 1 AND a.adresnibod && ST_Buffer(v.geom_p, 250) ) data; -- počet segmentů 100 SELECT COUNT(NULLIF(ST_Intersects(adresnibod, ST_Buffer(geom_p, 250, 100)), false)) FROM ( SELECT geom_p, adresnibod FROM adresy a, vesmirne_zrudice v WHERE v.id = 1 AND a.adresnibod && ST_Buffer(v.geom_p, 250, 100) ) data;
Vrací MOO prvku zvětšený na každou stranu o zadaný rozměr. Je možné zadat jednu hodnotu, nebo hodnoty dvě, jednu pro osu x a druhou pro osu y.
Tip
Srovnejte rychlost dotazu s použitím operátoru && při použití ST_Buffer a ST_Expand.
Vrací prostorový rozdíl prvků.
Vrací prostorový průnik prvků.
Vrací prostorové sjednocení prvků.
Rozdělí prvek podle jiného prvku a vrátí typ geometry collection. Možné použít například pro dělení prvků na základě mřížky.
Agregační funkce¶
Sloučí geometrii z více záznamů do jednoho.
ST_Collect, ST_UnaryUnion, ST_Union
Různé typy sjednocení.
Vytvoří linii z množiny bodů.
Další funkce¶
Výběr z oblíbených funkcí.
ST_IsValid a ST_MakeValid¶
ST_IsValid, ST_IsValidDetail, případně ST_IsValidReason
Slouží ke zjištění, zda je prvek geometricky validní.
Nahradí invalidní geometrii validní geometrií, zkrátka prvek zvaliduje.
ST_Multi¶
Mění typ geometrie z jednoduché na multigeometrii.
SELECT ST_AsText(ST_Multi('LINESTRING(1 1,5 5)'::geometry));
ST_Dump¶
Rozpustí „multi“ geometrii, nebo GEOMETRYCOLLECTION na jednotlivé komponenty. Vrací typ record s geometrií a cestou ke geometrii v GEOMETRYCOLLECTION.
ST_CollectionExtract¶
Vyfiltruje z GEOMETRYCOLLECTION bodové, liniové, nebo plošné prvky.