Prostorová data v SQL V rámci předmětu: Dotazovací jazyky I Matematicko-fyzikální fakulta Univerzita Karlova v Praze
Zdroje S. Shekhar a S. Chawla, Spatial Databases: A Tour, Prentice Hall, 2003 (ISBN 013-017480-7) K. Stolze, SQL/MM Spatial: The Standard to Manage Spatial Data in Relational Database Systems http://msdn.microsoft.com http://www.oracle.com http://dev.mysql.com
Obsah Motivace a předpoklady OGIS SQL/MM Datové typy Operace Příklady Datové typy Operace Příklady Schéma Realita Závěr
Motivace a předpoklady Relační algebra a SQL/92 pracují pouze s jednoduchými datovými typy (číslo, datum, řetězec...) Snaha opustit náhradní řešení tohoto nedostatku (blob, uložení mimo databázi) Zavedení abstrakce na vyšší úrovni blíže k našemu chápání prostoru Umožněno příchodem složených uživatelských datových typů
The open GIS GIS = geografický informační systém (pracuje s daty, která mají prostorový vztah k povrchu Země) OGIS konsorcium bylo vytvořeno ve snaze formulovat standard pro práci s GIS daty OGIS model pro prostorová data může být začleněn do různých programovacích jazyků (C, Java, SQL...) Hierarchická struktura datových typů a operací nad nimi
OGIS datové typy
OGIS - operace Rozděleny do tří kategorií: Základní operace, které se dají aplikovat na všechny typy Operace zkoumající topologický vztah objektů Obecné operace pro prostorovou analýzu
OGIS základní operace SpatialReference vrací systém souřadnic dané geometrie Envelope vrací minimální obdélník představující okraje geometrie Export vrací geometrii reprezentovanou jiným způsobem IsEmpty vrací TRUE, pokud je geometrie prázdná množina IsSimple vrací TRUE, pokud je geometrie jednoduchá (neprotínající sama sebe) Boundary vrací okraj geometrie...
OGIS topologické operace Vrací TRUE, pokud: Equal je okraj i vnitřní část dvou geometrií prostorově shodná Disjoint se okraj ani vnitřní část dvou geometrií neprotínají Intersect dvě geometrie nejsou disjunktní Touch se okraje dvou geometrií protínají, ale jejich vnitřní části ne Cross se vnitřní část povrchu protíná s křivkou Within se vnitřní část první geometrie neprotíná s oblastí ležící mimo druhou geometrii Contains jedna geometrie obsahuje druhou geometrii Overlap vnitřní části geometrií mají neprázdný průnik...
OGIS obecné operace pro prostorovou analýzu Distance vrací nejkratší vzdálenost dvou geometrií Buffer vrací geometrii, která obsahuje všechny body, které jsou vzdáleny od dané geometrie méně než daná hodnota ConvexHull vrací konvexní obal dané geometrie Intersection vrací geometrický průnik dvou geometrií Union vrací geometrické sjednocení dvou geometrií Difference vrací část geometrie, která se neprotíná s jinou danou geometií SymmDiff vrací části daných geometrií, které se navzájem neprotínají...
OGIS příklady (I) CREATE TABLE country ( name VARCHAR(30), cont VARCHAR(30), pop INTEGER, GDP NUMBER, shape Polygon ); CREATE TABLE river ( name VARCHAR(30), origin VARCHAR(30), length Number, shape LineString ); CREATE TABLE city ( name VARCHAR(30), country VARCHAR(30), pop INTEGER, shape Point );
OGIS příklady (II) Nalezení všech sousedů USA: SELECT c1.name AS Neighbors of USA FROM country c1, country c2 WHERE Touch(c1.shape, c2.shape) AND c2.name = 'USA' Seznam států seřazený podle počtu sousedů SELECT c1.name, Count(c2.name) FROM country c1, country c2 WHERE Touch(c1.shape, c2.shape) GROUP BY c1.name ORDER BY Count(c2.name)
OGIS příklady (III) Seznam řek a jejich délek v jednotlivých státech, kterými protékají: SELECT r.name, c.name, Length(Intersection(r.shape, c.shape)) FROM river r, country c WHERE Cross(r.shape, c.shape) Která města mohou být zásobována vodou z řeky St. Lawrence, je-li to možné pouze do vzálenosti 300 km: SELECT c.name FROM city c, river r WHERE Overlap(c.shape, Buffer(r.shape, 300)) AND r.name = 'St. Lawrence'
SQL/MM ISO/IEC 13249 SQL/MM je snaha o standardizaci multimédií (texty, obrázky, prostorová data...) Part 3: Spatial [ISO02c] část SQL/MM, která je mezinárodním standardem definujícím jak prostřednictvím SQL ukládat, načítat a zpracovávat prostorová data Vychází z OGIS, ale interpretuje data v obecnější rovině, ne jen jako GIS
SQL/MM datové typy I
SQL/MM datové typy II
SQL/MM datové typy III
SQL/MM operace Dělí se do čtyř skupin: Konverze mezi geometriemi a externími formáty Získávání vlastností geometrií Porovnávání vzhledem k prostorovému vztahu geometrií Tvorba nových geometrií z existujících
SQL/MM konverzní operace Tři typy pro externí reprezentaci geometrií: Textová (WKT well-known text representation) Binární (WKB well-known binary representation) Geografické XML (GML geography markup language) Každý typ, který není abstraktní, poskytuje konstruktor umožňující jej vytvořit z WKT a WKB Druhá možnost a jediná pro GML je využít funkcí tvaru ST_{Line, Point,...}From{Text, WKB, GML} Pro konverzi geometrií na daný formát se využívají funkce ST_AsText, ST_AsBinary, ST_AsGML
SQL/MM operace získávání vlastností ST_Boundary vrací okraj geometrie ST_IsValid test zda je geometrie správně definovaná (např. neuzavřený mnohoúhelník) ST_IsEmpty test zda je geometrie prázdná množina ST_X vrací X-ovou souřadnici bodu ST_IsRing test zda je křivka kruh (uzavřená a prostá) ST_Length vrací délku pro LineString nebo MultiLineString
SQL/MM porovnávací operace ST_Equals test zda jsou geometrie shodné ST_Disjoint test zda mají geometrie prázdný průnik ST_Intersects, ST_Crosses, ST_Overlaps test zda se vnitřní části geometrií protínají ST_Touches test zda se okraje geometrií dotýkají, ale jejich vnitřní části mají prázdný průnik ST_Within, ST_Contains test zda je jedna geometrie celá uvnitř jiné ST_Distance vrací vzdálenost mezi geometriemi
SQL/MM tvorba nových geometrií ST_Buffer vrací geometrii obsahující body, které mají menší než zadanou vzdálenost ST_ConvexHull vrací konvexní obal geometrie ST_Difference, ST_Intersection, ST_Union vrací geometrii odpovídající množinovým operacím rozdíl, průnik a sjednocení geometrií
SQL/MM příklady (Pojišťovna I) CREATE TABLE rivers ( name water_amount river_line flood_zones VARCHAR(30) PRIMARY KEY, DOUBLE PRECISION, ST_LineString, ST_MultiPolygon ) CREATE TABLE buildings ( customer_name street city zip ground_plot VARCHAR(50) PRIMARY KEY, VARCHAR(50), VARCHAR(20), VARCHAR(10), ST_Polygon )
SQL/MM příklady (Pojišťovna II) Rozšíření záplavové zóny o 2 km u řeky FLOOD: UPDATE SET rivers flood_zones = flood_zones.st_buffer(2, 'KILOMETER') WHERE name = 'FLOOD' Nalezení zákazníků jejichž domy leží v záplavových oblastech: SELECT FROM WHERE customer_name, street, city, zip buildings AS b, rivers AS r b.ground_plot.st_within(r.flood_zones)=1
SQL/MM příklady (Banka I) CREATE TABLE customers ( customer_id INTEGER PRIMARY KEY, name VARCHAR(20), street VARCHAR(25), city VARCHAR(10), state VARCHAR(2), zip VARCHAR(5), type VARCHAR(10), location ST_POINT ); CREATE TABLE branch_id name street state location ); branches ( INTEGER PRIMARY KEY, VARCHAR(12), manager VARCHAR(20), city VARCHAR(2), zip ST_Point, zone VARCHAR(20), VARCHAR(10), VARCHAR(5), ST_Polygon
SQL/MM příklady (Banka II) CREATE TABLE accounts ( account_id INTEGER PRIMARY KEY, routing_no INTEGER NOT NULL, customer_id INTEGER NOT NULL, branch_id INTEGER NOT NULL, type VARCHAR(10) NOT NULL, balance DECIMAL(14, 2) NOT NULL, CONSTRAINT fk_customers FOREIGN KEY(customer_id) REFERENCES customers(customer_id), CONSTRAINT fk_branches FOREIGN KEY(branch_id) REFERENCES branches(branch_id) );
SQL/MM příklady (Banka III) Seznam zákazníků s více než 10 000 na účtu žijící dále než 20 mil od jejich pobočky: SELECT DISTINCT c.customer_id, c.name FROM customers AS c JOIN accounts AS a ON (c.customer_id = a.customer_id) WHERE a.balance > 10000 AND a.location.st_distance( ( SELECT b.location FROM branches AS b WHERE b.branch_id = a.branch_id), 'MILES') > 20
SQL/MM příklady (Banka IV) Nalezení překryvu polí působnosti jednotlivých poboček: SELECT FROM b1.branch_id, b2.branch_id, b1.zone.st_overlaps(b2.zone).st_astext() branches AS b1 JOIN branches AS b2 ON (b1.branch_id < b2.branch_id) WHERE b1.zone.st_overlaps(b2.zone).st_isempty()=0
SQL/MM příklady (Banka V) Nalezení zákazníků žijících méně než 10 mil od pobočky, která nespravuje jejich účty: SELECT FROM WHERE c.name, c.phone, b.branch_id branches AS b, customers AS c b.location.st_buffer(10, 'MILES').ST_Contains(c.location) = 1 AND NOT EXISTS ( SELECT 1 FROM accounts AS a WHERE a.customer_id = c.customer_id AND a.branch_id = b.branch_id )
SQL/MM schéma SQL/MM definuje informační schéma, aby bylo možné zjistit, které vlastnosti jsou podporovány Tvoří jej čtyři pohledy: ST_GEOMETRY_COLUMNS obsahuje všechny sloupce mající za typ některý z podtypů ST_Geometry ST_SPATIAL_REFERENCE_SYSTEMS obsahuje dostupné systémy souřadnic ST_UNITS_OF_MEASURE obsahuje dostupné jednotky, pro které lze pokládat dotazy ST_SIZINGS obsahuje meta-proměnné a jejich hodnoty (např. maximální možnou délku WKT řetězce)
Realita MS SQL Server, Oracle Database, MySQL... většina systémů poskytuje podporu pro práci s prostorovými daty, ale různé implementují různé podmnožiny standardů. Často s odchylkami například v názvech a běžnou praxí také je, že jsou až součástí rozšíření samotné databáze.
Závěr OGIS doporučení pro práci s prostorovými daty. SQL/MM standard pro práci s multimédii pomocí SQL, Part 3: Spatial se zaměřuje na prostorová data a přejímá myšlenky OGIS. Při používání konkrétní databáze je třeba ověřit dostupnost jednotlivých funkcí.