Josef Troch (troch@mail.ru)
18.2.2002 (poslední změna 24.2.2002)

Spatial SQL (Prostorové SQL)

Prostorové databáze jsou databáze kombinující konvenční a prostorová data (tedy data vztahující se k poloze objektů, jejich velikosti atd.). V aplikacích využívajících prostorové informace jako jsou různé geografické informační systémy (GIS) či CAD/CAM systémy tedy vznikla potřeba vhodného dotazovacího jazyka, který by umožňoval pokládat: Použití běžných relačních dotazovacích jazyků pro zpracování dotazů na prostorová data je velmi obtížné, neboť tyto jazyky nemají pro prostorová data žádnou podporu (predikáty, operace) a neměly ani žádný vhodný datový typ (až do vzniku konceptu ADT) a tudíž data musela být ukládána do číselných a řetězcových proměnných a proto musel uživatel přesně znát strukturu uložení prostorových dat. V některých komerčních systémech se ovšem tento způsob udržel do dneška jen s tím rozdílem, že dnes již obsahují specializované funkce a predikáty pro prostorové operace.

Bylo tedy třeba navrhnout dotazovací jazyk, který by poskytoval jednoduché, intuitivní a snadno použitelné rozhraní pro dotazy i editaci obou druhů dat. Vzhledem k výše uvedenému se jako rozumné jevilo rozšířit funkcionalitu SQL o práci s prostorovými daty (neboť SQL je standart, je vhodné pro neprostorová data a uživatel ho typicky již zná).

M. J. Egenhofer v roce 1994 specifikoval 11 požadavků na prostorový dotazovací jazyk, které standartní dotazovací jazyky nesplňovaly:

Prostorový ADT Abstraktní geometrický datový typ "Spatial" s vhodnými operacemi a vztahy (aby uživatel nepotřeboval znát přesnou strukturu ukládání prostorových dat).
Grafická presentace výsledků Presentace výsledků dotazu v grafické formě včetně vizualizace příslušných neprostorových dat (nejpřirozenější forma k analýze prostorových dat).
Kombinování výsledků Možnost kombinování výsledků dotazu s výsledky jednoho či více předchozích dotazů.
Kontext Pro grafickou presentaci je často nezbytné zobrazování kontextu - tedy informací které nebyly explicitně vyžádány, ale jsou nezbytné k interpretaci výsledků dotazu v prostorovém umístění (př.: hledám-li na mapě Prahu, nestačí mi zobrazení tečky s nápisem Praha na bílé ploše).
Ověřování obsahu Kontrolní mechanismus k ověření obsahu kresby (aby uživatel zjistil, jakému dotazu odpovídá kresba - kvůli kombinování výsledků).
Výběr ukázáním Použití výsledků předchozího dotazu ukázáním (typicky myší) pro referenci v příštím dotazu.
Manipulace se zobrazováním Rozlišení prostorových objektů a jejich částí pomocí nastavování atributů jejich grafické presentace (barva, vzorek, ...).
Vysvětlivky Popisující legenda k jednotlivým druhům zobrazovaných objektů (jako na mapě).
Popisky (labels) Popisky k jednotlivým objektům (pro pochopení kresby) a možnost vybrání objektů, které mají být popsány (dotazovacím jazykem).
Volba měřítka Možnost volby libovolného měřítka zobrazení dotazu.
Vymezení oblasti Nástroje k omezení oblasti zájmu uživatele, nad kterou se bude provádět další dotaz (dotazy).

Oddělení dotazovacích a zobrazovacích (presentačních) instrukcí

Lze předpokládat, že výsledky dotazu budou často presentovány graficky. Uživatel by tedy měl mít možnost nastavovat parametry vykreslovacího prostředí. Ovšem při zabudování těchto instrukcí přímo do dotazovacího jazyka by se tento stal příliš složitým a obtížně použitelným. Je tedy rozumnější rozdělit každou instrukci do několika menších (typově různých) instrukcí. Takto můžeme rozlišit 3 typy intrukcí: Je vcelku rozumné tyto 3 typy instrukcí spojit do 2 jazyků - vlastního dotazovacího a presentačního. Typická práce uživatele se systémem pak bude vypadat zhruba takto: Prezentační jazyk tedy udává jak zobrazit výsledky dotazu - např. "ukaž budovy z výsledku dotazu jako červená kolečka"; může ovšem používat výrazy podobné klasickým dotazům pro detailní popis např. "ukaž budovy z výsledku dotazu, přitom obchody označ fialově a panelové domy modře".
Podobnost s dotazovacím jazykem naznačuje, že dotazovací jazyk typicky bude sloužit jako část prezentačního jazyka.


Spatial SQL (prostorové SQL)

Tento jazyk byl navržen v r. 1994 J. Egenhoferem, aby odstranil výše uvedené nedostatky konvenčních DB jazyků. Stejně jako v klasickém SQL se pracuje s příkazy ve formátu SELECT - FROM - WHERE, výsledky dotazů jsou relace.
Spatial SQL neobsahuje funkcionalitu pro editování dat.

Prostorová doména

K doménám SQL byla přidána nová doména "spatial" (prostorový) pro zajištění vysoké úrovně abstrakce prostorových dat. K této doméně patří řada prostorových operací a predikátů, které budou zmíněny později. Zmíněná doména se dělí ještě na 4 poddomény "spatial_0", "spatial_1", " spatial_2", "spatial_3" pro objekty příslušných dimenzí (tedy spatial_0 pro 0-rozměrné objekty - body, atd.).
Atribut z domény spatial se nazývá spatial atribut (prostorový atribut) a relace s tímto atributem spatial relation (prostorová relace).

Prostorové operace

Prostorové operace můžeme chápat jako funkce na prostorových objektech.
Můžeme je rozdělit na: Prostorové operátory se zapisují v prefixové notaci - jako funkce (př. distance(potok.geometry, silnice.geometry) ). Operátory se mohou vyskytnout v SELECT klauzuli, či v libovolné WHERE klauzuli jako část neprostorového predikátu. Tedy mohou se v dotazech používat na stejných místech jako agregační funkce.

Prostorové predikáty

Prostorové predikáty (spatial relationships) jsou relace (v matematickém smyslu) mezi dvěma prostorovými atributy - jejich výsledkem je tedy Boolean hodnota a tedy mohou být přímo použity coby predikáty v klauzuli WHERE. Tyto predikáty se zapisují stejně jako ostatní v SQL - infixově; jsou definovány přímo nad generalizovanou doménou spatial.

Definice tabulek s prostorovými daty

Obdobně jako v klasickém SQL.

Příklad 1 - definice tabulky mesta s řetězcovým atributem jmeno a prostorovým obsazenyProstor (zde město chápeme jako 2D objekt).
CREATE TABLE mesta
(jmeno    CHAR(20)
 obsazenyProstor  spatial_2);
Příklad 2 - Může být užitečné definovat město jako mnohoúhelník (obsazenyProstor) na podrobných mapách, nebo jako bod (poloha) na méně podrobných.
CREATE TABLE city
(jmeno char(20)
 obsazenyProstor spatial_2
 poloha  spatial_0);

Výběr ukázáním - predikát PICK

Predikát PICK umožňuje uživateli formulovat dotazy s referencí na prostorové objekty viditelné na obrazovce. Tento predikát může kvalifikovat každý prostorový atribut ve WHERE klausuli. Sémantika výběru závisí na prostorové dimenzi cíle - při odkazování na objekty vykreslené v 2D plánu cílem je buď 0 či 1-rozměrný objekt nejblíže ukázání a nebo 2D objekt, který místo ukázání obsahuje.
Nejasnosti jsou řešeny dle toho, jaký typ objektu uživatel v dotazu používá. Jsou-li 2 objekty požadovaného typu od ukázání stejně daleko (řídký případ), je uživateli nabídnut seznam možností, ze kterého může zvolit.

Příklad 1 - mapa států s hranicemi a velkými městy (tyto znázorněny body), uživatel se ptá na jméno města na které kliknul.
SELECT jmeno
FROM mesta
WHERE poloha = PICK;
Příklad 2 - ukáže-li uživatel na stejné místo a zadá následující dotaz, dostane název příslušného státu.
SELECT jmeno
FROM staty
WHERE poloha = PICK;

GPL (Graphical presentation language)

Spatial SQL obsahuje i oddělený presentační (zobrazovací) jazyk GPL pro manipulaci s grafickou presentací výsledků dotazu. Klíčovým pojmem je zde zobrazovací prostředí (graphical environment), které obsahuje nastavení jak zobrazovat položené dotazy. V průběhu zpracovávání dotazu jsou tyto informace spojeny s uživatelovým dotazem, aby podle nich mohl být vyrenderován výsledek. Pokud uživatel zobrazovací prostředí nezmění pomocí GPL instrukce, každý dotaz produkuje výsledek (mapu) zobrazenou stejným stylem.
GPL tvoří jakousi nadmnožinu dotazovací části Spatial SQL, Spatial SQL dotazy jsou používány pro specifikaci, k čemu se vlastní GPL instrukce vztahuje.

GPL obsahuje instrukce: Modifikátory Parametry nastavitelné pomocí GPL lze rozdělit do těchto skupin:
  1. Zobrazovací mód (display mode) - udává jak se zobrazují (kombinují) výsledky sekvence dotazů. Možnosti jsou: Neprostorové atributy v SELECT by měly být zobrazovány jako popisky (labels).


  2. Grafická presentace (graphical presentation) - k zadání grafické presentace objektů je používáno nastavování "vizuálních proměnných" (visual variables) (např. barva, vzorek, ...) - tyto zobrazovací atributy mohou být specifikovány buď pro celou prostorovou relaci, nebo pro její instance splňující nějaké podmínky. Zároveň má uživatel možnost zjistit momentální nastavení těchto proměnných jednoduše zobrazením vysvětlivek (legendy).
    Tato část GPL závisí na uživatelově hardwaru, proto je množina vizuálních proměnných rozšiřitelná.

    Vizuální proměnné se nastavují příkazem
    SET LEGEND jmenopromenne1 hodnota1 jmenopromenne2 hodnota2 ... FOR ...


  3. Měřítko (scale) - nastavuje se příkazem SET SCALE n; , kde n je kladné číslo ve významu měřítko 1 : n.


  4. Výřez (window), který má být zobrazen - nastavuje se pomocí SET WINDOW a může být zadán souřadnicemi dvou protilehlých rohů či jako nejmenší obdélník ohraničující výsledky dotazu.


  5. Kontext (spatial context) - pomocí SET CONTEXT lze definovat, kontext (viz výše) který je při zpracování dotazu přidán k jeho výsledkům.


  6. Zjištění obsahu kresby (examination of content) - výsledná kresba může být kombinací mnoha dotazů (pomocí overlay, remove, intersect), a proto by měl mít uživatel možnost, zjistit co je na kresbě resp. zjistit jaký dotaz by musel použít, aby zobrazil aktuální kresbu. Tohoto se dosáhne pomocí SHOW CONTENT. (Logicky zde nejde SET ani CANCEL.)

Příklady dotazů

Mějme geografickou databázi ČR obsahující města (tabulka mesta), ulice (tabulka ulice), pozemky (tabulka pozemky), budovy (tabulka budovy) a údaje o městské hromadné dopravě (tabulka mhd); prostorový atribut zmíněných tabulek je vždy poloha.

Chceme zobrazit mapu Kozí ulice v Olomouci se všemi pozemky, budovami a ulicemi, obytné domy chceme zobrazit zeleně, komerční budovy modře a hranice pozemků čárkovaně černou čarou. Silnice užší 5 m chceme vyšrafovat.
  1. Nastavení černé barvy a čárkování hranic pozemků.
    SET LEGEND
            COLOR black
            PATTERN dashed
    
    FOR SELECT boundary(poloha)
            FROM pozemky;
    
  2. Obytné budovy zeleně, komerční budovy modře.
    SET LEGEND
            COLOR green, blue
    
    FOR SELECT obytne.poloha, komercni.poloha
            FROM obytne budovy, komercni budovy
            WHERE komercni.typ="Komercni" and obytne.typ="Obytny";
    
  3. Nastavení šrafování uliček užších než 5 m.
    SET LEGEND
            PATTERN cross-hatched
    
    FOR SELECT interior(poloha)
            FROM ulice
            WHERE sirka < 5;
    
  4. Nastavení výřezu jako obal všech ulic v Olomouci.
    SET WINDOW
            SELECT poloha
            FROM ulice
            WHERE mesta.jmeno="Olomouc";
    
  5. Nastavení kontextu ulic - pro zobrazení přilehlých pozemků a budov pro každou dotazovanou ulici a jmen ulic.
    SET CONTEXT
    
    FOR ulice.poloha
            SELECT pozemky.poloha, budovy.poloha, ulice.jmeno
            FROM ulice, pozemky, budovy;
    
  6. Ještě nastavíme mód pro vykreslování nové mapy.
    SET MODE new;
    
  7. Nyní máme připraveno zobrazovací prostředí, můžeme položit dotaz Spatial SQL (až do teď to bylo všechno jen GPL).
    Vykresli ulici "Kozí" v Olomouci.
    SELECT ulice.poloha
    FROM ulice, mesta
    
    WHERE mesta.jmeno="Olomouc" and ulice.jmeno="Kozi" and
          ulice.poloha INSIDE mesto.poloha;
    
  8. Nastavíme mód pro zvýraznění výsledku následujícího dotazu. (GPL}
    SET MODE highlight;
    
  9. A teď si necháme tedy zvýraznit budovu na adrese "Kozí 3". (Spatial SQL)
    SELECT budovy.poloha
    FROM budovy
    
    WHERE adresa="Kozi 3";
    
  10. Původní úkol jsme splnili, můžeme pokračovat dalšími dotazy.
    Nastavení alphanumerického módu. (GPL)
    SET MODE alpha;
    
  11. Nyní nás zajímá vzdálenost myší označeného objektu od všech hospod v Olomouci (zmíněné polohové omezení nám zajistí dříve nastavený výřez). (Spatial SQL)
    SELECT distance(budovy.poloha, hospoda.poloha), hospoda.adresa
    FROM budovy, budovy hospoda
    
    WHERE budovy=PICK and hospoda.typ="Hospoda";
    
  12. Nastaví zobrazování tramvajovývh zastávek jako 2mm rudé kruhy. (GPL)
    SET LEGEND
            COLOR red
            SYMBOL "2mm disk"
    
    FOR SELECT poloha
            FROM mhd
            WHERE typ="Tramvajova zastavka";
    
  13. A budeme přidávat do mapy. (GPL)
    SET MODE overlay;
    
  14. A teď do mapy dokreslíme tramvajové zastávky vzdálené méně než 200 m od budovy označené myší. (Spatial SQL)
    SELECT poloha
    FROM mhd, budovy
    
    WHERE typ="Tramvajova zastavka" and budovy.poloha=PICK and
          distance(budova.poloha, mhd.poloha) < 200;
    
  15. A nakonec přebarvíme (okamžitě) na hnědo všechny budovy, ve kterých bydlí více než 30 lidí. (GPL)
    SET IMMEDIATELY COLOR brown
    
    FOR SELECT interior(poloha)
            FROM budovy
            WHERE pocetObyvatel > 30;
    

Geometrický objektový model

OGC (Open GIS Consortium) navrhlo hierarchii tříd pro práci s 0, 1, 2-dimenzionálními objekty (ve 2D prostoru) a sadu funkcí (především operátorů) nad nimi.

Hierarchie tříd:
Hierarchie tříd

Každý geometrický objekt je asociován se souřadným systémem (Spatial Reference System), ve kterém je definován.

Třída Geometry je abstraktní.
Point (bod) je 0 rozměrný, Curve (křivka) 1 rozměrná a Surface (povrch) dvourozměrný. GeometryCollection je kolekce (multimnožina) složená z 1 či více geometrických objektů - ve stejném souřadném systému (žádné jiné podmínky objekty v kolekci splňovat nemusí). Všechny její podtřídy mají prefix Multi.
Curve je uložena jako sekvence bodů, podtypy specifikují metody interpolace mezi body. Open GIS ve versi 1.1 definuje pouze podtřídu LineString odpovídající lineární interpolaci. Line je LineString s právě 2 body, LinearRing je LineString odpovídající jednoduché (neprotínající se) a uzavřené křivce. Surface je libovolný 2D geometrický objekt. Povrch je jednoduchý, lze-li ho definovat jednou "vnější hranicí" a 0 - n "vnitřními hranicemi" (tyto se nesmí protínat - definují "díry"). Polygon je jednoduchý povrch, jehož hranice jsou typu LinearRing, splňující ještě několik méně podstatných podmínek.

Každá třída má definovány metody pro prostorové operace (podobně jako výše, rozsáhlejší; pro třídu Geometry mimo jiné tyto: Dimension(), GeometryType(), SRID() (vrací souřadný systém)) a metody pro prostorové predikáty - podobné výše uvedeným.

Pro tento geometrický model Open GIS podrobně navrhuje 3 různé metody implementace:
  1. použitím numerických typů v SQL 92 pro uložení (geometrických) objektů
  2. použitím binárních typů v SQL 92 pro uložení (geometrických) objektů
  3. použitím SQL 92 s geometrickými typy (tedy rozšíření SQL) pro uložení (geometrických) objektů, tak že ke geometrickým typům lze přistupovat textově i binárně
Poslední varianta je nejperspektivnější (vzhledem k SQL 1999) - sloupec geometrických hodnot je implementován triviálně pomocí hodnot geometrického typu (použitím ADT).
Detaily viz (Literatura / Open GIS).


Poznámka na závěr

Vše výše uvedené vycházelo z předpokladu, že hranice prostorových objektů je přesně definována (nějakou křivkou apod.). Takovéto objekty se nazývají "objects with a crisp boundary" (objekty s ostrou hranicí) či zkráceně "crisp objects".
Toto zjednodušení reálného stavu ale není vždy akceptovatelné - příkladem může být hranice lesa na mapě, či hranice velmi zalidněné oblasti - zde je obtížné přesně definovat hranici. Z tohoto důvodu vznikla řada studií o používání objektů s nepřesnými hranicemi ("broad boundaries" či "fuzzy boundaries") - takováto hranice je definována jako oblast uzavřená mezi dvě ostré (crisp) hranice, které se neprotínají. Vnitřní z těchto hranic definuje oblast, kde je podmínka zcela pravdivá a vnější oblast, kde podmínka už zcela neplatí. Všechny body mezi těmito dvěma hranicemi by měly splňovat podmínku "do určité míry".
Detaily viz (Literatura / Verstraete a kol.).


Literatura

  1. M. J. Egenhofer: Spatial SQL: A Query and Presentation Language. (IEEE Transactions on Knowledge and Data Engineering, 6(1):86--95, 1994)
  2. Open GIS Consortium, Inc.: OpenGIS Simple Features Specification for SQL. (Revision 1.1, 1999)
  3. Cary Ng, Mark Mak: A Survey on Query Languages for Content Based Retrieval.
  4. E. Clementini, P. Di Felice: Spatial Operators. (SIGMOD Records, ACM SIGMOD, 2000)
  5. J. Pokorný: Prostorové objekty a SQL. (GIS Ostrava, 2001)
  6. J. Verstraete, B. Van Der Cruyssen, R. De Caluwe: Assigning membership degrees to points within fuzzy boundaries.
  7. V. Pech: Prostorové SQL: Dotazovací a prezentační jazyk.


Tento článek smí být používán libovolně, za předpokladu, že nebude modifikován a že takto bude učiněno se zmínkou o autorovi a odkazem na stránku http://jt.sf.cz, odkud by měla být dostupná aktuální verse tohoto článku.
Snažím se, aby informace zde uvedené byly pravdivé a pokud možno přesné, nicméně nenesu žádnou odpovědnost za to, že tomu tak opravdu je, ani za jakékoli škody, které by někomu v důsledku případných špatných či nepřesných informací z tohoto článku mohly vzniknout.



Jakékoliv dotazy či připomínky mi můžete poslat mailem.

Zpět na stránku referátů a jiných výtvorů