4 Räumliche Anfragen 4.1 Entwicklung von SQL 4.2 Anfragen mit „Kern-SQL“ 4.3 Räumliche Anfragen mit „Kern-SQL“ 4.4 Räumliche Erweiterung der Relationenalgebra 4.5 Räumliche Erweiterungen von SQL 4.6 Auswertung räumlicher Anfragen 4.7 Zusammenfassung Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 314 Räumliche Anfragen →Räumliche Anfragen sind spezielle Klasse von Anfragen, die durch räumliche Datenbanksysteme unterstützt werden →Anfragen unterscheiden sich von “Kern-SQL”Anfragen, ermöglichen die Benutzung von geometrischen Datentypen (Point, Line, Polygon) geometrischen Operationen (intersection, length, area) von geometrischen Prädikaten(overlaps, meets, equals) räumliche Anfragesprache SQL Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 geometrische ADTen 315 4.1 Entwicklung von SQL →1970 E. F. Codd: A Relational Model of Data for Large Shared Data Banks. Comm. ACM 13(6): 377-387 →ab 1982 SQL/DS, Oracle, DB2 Kritik: mangelnde Orthogonalität Kritik: fehlende Funktionalität →1986 ANSI SQL Relationen, Attribute, Sichten SELECT ... FROM ... WHERE ... Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 316 Entwicklung von SQL →1987 SQL86 (ISO/IEC 9075:1986) →1989 SQL89 (SQL1) • ≈ SQL86 + eingeschränkte referenzielle Integrität →1992 SQL92 (SQL2) Entry Level • ≈ SQL89 + CHECK (Attribut) Intermediate Level • ⊇ Entry Level + Domänen, CHECK (Relation), CASE, CAST, JOIN, EXCEPT, INTERSECT Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 317 Entwicklung von SQL Full Level • ⊇ Intermediate Level + Assertions, geschachteltes Select, geschachteltes From SELECT SNO, SNAME, STATUS, CITY, PCT, APCT FROM S NATURAL JOIN (SELECT SNO, COUNT(*) AS PCT FROM SP GROUP BY SNO) AS XXX NATURAL JOIN (SELECT CITY, AVG(PCT) AS APCT FROM S NATURAL JOIN (SELECT SNO, COUNT (*) AS PCT FROM SP GROUP BY SNO) AS YYY GROUP BY CITY) AS ZZZ WHERE PCT > APCT; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 318 Entwicklung von SQL →1999/2000 SQL:1999 (SQL3) ≈ SQL92 + Objektorientierung, rekursive Anfragen, Trigger, OLAP, benutzerdefinierbare Typen berechnungsuniverselle, objektorientierte Datenbankprogrammiersprache, deskriptiv und prozedural Core (ca. 180 Features) • ≈ SQL92 Entry Level + Teile von Intermediate und Full Level 9 Packages (ca. 240 Features) • enhanced datetime, enhanced integrity, OLAP, PSM, CLI, basic object support, enhanced object support, trigger, SQL/MM Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 319 Entwicklung von SQL →Beispiel für rekursive Anfrage (SQL:1999) CREATE TABLE mündetIn (Fluss CHAR(25), FlussOderMeer CHAR(25), PRIMARY KEY(Fluss)); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 320 Entwicklung von SQL WITH RECURSIVE mündetIndirektIn (Fluss, FlussOderMeer) AS (SELECT Fluss, FlussOderMeer FROM mündetIn WHERE FlussOderMeer = ’Nordsee’ UNION SELECT mündetIn.Fluss, mündetIn.FlussOderMeer FROM mündetIn AS mi, mündetIndirektIn AS mii WHERE mi.FlussOderMeer = mii.Fluss) SELECT Fluss FROM mündetIndirektIn; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 321 Entwicklung von SQL →Beispiel für Typdefinition (SQL:1999) CREATE TYPE address AS (street VARCHAR(35), city VARCHAR(40), country CHAR(3)); CREATE TYPE USaddress UNDER address AS (state CHAR(2), zip ROW (basic INTEGER, plus4 SMALLINT)) METHOD zipcode() RETURNS VARCHAR(10); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 322 Entwicklung von SQL →SQL/MM Part 3: Spatial Datentypen Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 323 Entwicklung von SQL →SQL/MM Part 3: Spatial Datentypen • ST_Geometry: Basistyp, Subtypen sind 2D-SDTs • ST_Point: Punkt mit zwei Koordinaten • ST_Curve: Linie, Folge von Punkten, auch interpoliert oder geschlossen • ST_LineString: Subtyp von ST_Curve, lineare Interpolation • ST_CircularString: Subtyp von ST_Curve, Interpolation durch Kreisbogen • ST_Surface: Fläche • ST_Polygon: instantiierbarer Subtyp von ST_Surface mit linearen Ringen Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 324 Entwicklung von SQL →SQL/MM Part 3: Spatial einige Methoden • ST_Length() returns double, Länge einer Kurve • ST_IsClosed() returns integer, Kurve geschlossen? • ST_CurveToLine() returns ST_LineString, liefert Linienapproximation einer Kurve • ST_PointN() returns ST_Point, liefert n-ten Punkt eines LineString • ST_Area returns double, liefert Flächeninhalt von Surface • ST_Perimeter returns double, liefert Umfang • ST_Centroid returns ST_Point, liefert Schwerpunkt • ST_ExteriorRing returns ST_Curve, liefert äußeren Begrenzungsring Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 325 Entwicklung von SQL →2003 SQL:2003 Nachfolgestandard von SQL:1999 Multimengen als expliziter Konstrukt (mit zahlreichen Operationen, z.B.: MULTISET UNION, MULTISET EXCEPT, MULTISET INTERSECT, CARDINALITY) Sequenzgeneratoren • CREATE SEQUENCE <Sequenzname> AS <Typname> [START WITH <Wert>] [INCREMENT BY <Wert>] [NO MINVALUE | MINVALUE <Wert>] [NO MAXVALUE | MAXVALUE <Wert>] [NO CYCLE | CYCLE] Basisdatentyp XML für Abbildungen zwischen SQL und XML Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 326 4.2 Anfragen mit „Kern-SQL“ →vereinfachte Syntax von “Kern-Select” Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 327 Anfragen mit „Kern-SQL“ →Anfrage 1: Personalnummer, Namen, Summe von Rest- und Jahresurlaub aller Mitarbeiter, absteigend geordnet nach Summe der Urlaubstage und bei gleicher Summe aufsteigend nach Namen geordnet Mitarbeiter (PersNr, Name, ..., Resturlaub, Jahresurlaub) ↓ Ergebnis (PersNr, Name, expr.) SELECT PersNr, Name, Resturlaub+Jahresurlaub FROM Mitarbeiter WHERE Resturlaub IS NOT NULL AND Jahresurlaub IS NOT NULL ORDER BY 3 DESC, Name ASC Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 328 Anfragen mit „Kern-SQL“ →Anfrage 2: Voraussetzungen des Kurses “Programmieren in Java” Kurs (KursNr, Titel, ...) Voraussetzung (KursNr, VoraussNr) ↓ Ergebnis (Titel) SELECT k2.Titel FROM Kurs k1, Kurs k2, Voraussetzung WHERE k1.Titel = ’Programmieren in Java’ AND k1.KursNr = Voraussetzung.KursNr AND Voraussetzung.VoraussNr = k2.KursNr Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 329 Anfragen mit „Kern-SQL“ →Anfrage 3: Paare von Mitarbeitern (Personalnummer, Nachname), die jeweils an genau den gleichen Kursen teilnehmen Mitarbeiter(PersNr, Name, ...) Teilnehmer(KursNr, PersNr) ↓ Ergebnis (PersNr1, Name1, PersNr2, Name2) Frage nach Gleichheit von Mengen: Welche Personalnummern treten in “Teilnehmer” jeweils mit der gleichen Menge von Kursnummern auf? Mengen A und B sind gleich: ∀ a ∈ A: a ∈ B ∧ ∀ b ∈ B: b ∈ A Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 330 Anfragen mit „Kern-SQL“ kein Allquantor in SQL, daher: / B ∧ ¬ ∃ b ∈ B: b ∈ /A ¬ ∃ a ∈ A: a ∈ SELECT FROM WHERE AND AND AND m1.PersNr, m1.Name, m2.PersNr, m2.Name Mitarbeiter m1, Mitarbeiter m2, Teilnehmer t1, Teilnehmer t2 m1.PersNr = t1.PersNr m2.PersNr = t2.PersNr t1.PersNr < t2.PersNr NOT EXISTS (SELECT * FROM Teilnehmer t3 WHERE t3.KursNr NOT IN (SELECT t4.KursNr FROM Teilnehmer t4 WHERE t4.PersNr = t2.PersNr) AND t1.PersNr = t3.PersNr) AND NOT EXISTS (SELECT * FROM Teilnehmer t5 WHERE t5.KursNr NOT IN (SELECT t6.KursNr FROM Teilnehmer t6 WHERE t6.PersNr = t1.PersNr) AND t2.PersNr = t5.PersNr) ORDER BY m1.PersNr, m2.PersNr Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 331 Anfragen mit „Kern-SQL“ →Anfrage 4: Erstellen einer Liste mit möglichen Gutachtern für einen eingereichten Beitrag (Id = 42). Als Gutachter kommen nur Personen in Betracht, die selbst nicht Koautor des Beitrags sind. Die möglichen Gutachter sollen aufsteigend nach der Anzahl der bereits von ihnen begutachteten Beiträge geordnet werden. Person (EMail, ...) begutachtet (Gutachter, Beitrag, ...) Autoren (Beitrag, Autor) ↓ Ergebnis (EMail, expr.) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 332 Anfragen mit „Kern-SQL“ SELECT * FROM ((SELECT EMail, 0 FROM Person WHERE EMail NOT IN (SELECT Gutachter FROM begutachtet) AND EMail NOT IN (SELECT Autor FROM Autoren WHERE Beitrag = 42)) UNION (SELECT Gutachter, COUNT(*) FROM begutachtet WHERE Gutachter NOT IN (SELECT Autor FROM Autoren WHERE Beitrag = 42) GROUP BY Gutachter)) AS Ertebnis ORDER BY 2; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 333 4.3 Räumliche Anfragen mit “Kern-SQL” →“Kern-SQL” enthält keine geometrischen Datentypen (Point, Line, Polygon) geometrischen Operationen (intersection, length, area) geometrischen Prädikate (overlaps, meets, equals) →müssen bei Bedarf relational modelliert und mit “Kern-Select” ausgedrückt werden →funktioniert ohne Anwendungsprogrammierung nur sehr eingeschränkt Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 334 Räumliche Anfragen mit “Kern-SQL” →relationale Modellierung von Punkten z.B. Id-Attribut und Integer-Attribute X, Y CREATE TABLE Punkte ( Id CHAR(20), X INTEGER, Y INTEGER, PRIMARY KEY (Id)); einfügen von Punkten durch Angabe der entsprechenden Werte INSERT INTO Punkte VALUES ( ’Restaurant’,3540433,5804344); INSERT INTO Punkte VALUES ( ’Kirche’,3540441,5804695); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 335 Räumliche Anfragen mit “Kern-SQL” →Abstandsberechnung zwischen Punkten P1(x1, y1), P2(x2, y2) SELECT SQRT(((p2.X-p1.X)**2)((p2.Y-p1.Y)**2)) FROM Punkte p1, Punkte p2 WHERE p1.Id = ’Restaurant’ AND p2.Id = ’Kirche’; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 ? 336 Räumliche Anfragen mit “Kern-SQL” →relationale Modellierung von Polygonen z.B. als Liste von Punkten Id-Attribut, Listenposition und Integer-Attribute X, Y CREATE TABLE Polygone ( Id CHAR(20), Position INTEGER, X INTEGER, Y INTEGER, PRIMARY KEY (Id,Position)); pro Polygon müssen Werte von Position bei 1 beginnen und dicht liegen (Implementierung von Liste) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 337 Räumliche Anfragen mit “Kern-SQL” →n-ter Punkt eines Polygons (analog: n-ter Punkt eines Linienzuges) SELECT p.X, p.Y FROM Polygone p WHERE p.Id = ’P3’ AND p.Position = 5; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 338 Räumliche Anfragen mit “Kern-SQL” →kleinstes, achsenparalleles Rechteck, das Polygon ganz umschließt (bounding box) genauer: linker unterer, rechter oberer Punkt der bounding box SELECT min(p.X), min(p.Y), max(p.X), max(p.Y) FROM Polygone p WHERE p.Id = ’P3’ Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 339 Räumliche Anfragen mit “Kern-SQL” →Anwendung: Abstand von Gebäuden als Abstand der Mittelpunkte ihrer umschreibenden Rechtecke Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 340 Räumliche Anfragen mit “Kern-SQL” SELECT SQRT(((gebaeude1BboxMittelpunktXgebaeude2BboxMittelpunktX)**2)+ ((gebaeude1BboxMittelpunktYgebaeude2BboxMittelpunktY)**2)) FROM (SELECT (max(p1.X)+min(p1.X))/2 AS gebaeude1BboxMittelpunktX, (max(p1.Y)+min(p1.Y))/2 AS gebaeude1BboxMittelpunktY FROM Polygone p1 WHERE p1.Id = ’Polizei’), (SELECT (max(p2.X)+min(p2.X))/2 AS gebaeude2BboxMittelpunktX, (max(p2.Y)+min(p2.Y))/2 AS gebaeude2BboxMittelpunktY FROM Polygone p2 WHERE p2.Id = ’Parkhaus’); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 341 Räumliche Anfragen mit “Kern-SQL” Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 342 Räumliche Anfragen mit “Kern-SQL” →Umfang von Polygonen Lösung in Pseudocode mit Embedded SQL INT Position, X1, Y1, Xi, Yi, XiMinus1, YiMinus1; REAL Umfang := 0.0; BOOL weiterePunkte := TRUE; EXEC SQL DECLARE Punkt CURSOR FOR SELECT Position, X, Y FROM Polygone WHERE Id = ’P3’ ORDER BY Position; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 343 Räumliche Anfragen mit “Kern-SQL” EXEC SQL OPEN Punkt; EXEC SQL FETCH Punkt INTO :Position, :X1, :Y1; XiMinus1 := X1; YiMinus1 := Y1; WHILE weiterePunkte DO BEGIN EXEC SQL FETCH Punkt INTO :Position, :Xi, :Yi; Umfang := Umfang + SQRT((Xi-XiMinus1)^2+(Yi-YiMinus1)^2); XiMinus1 := Xi; YiMinus1 := Yi; IF SQLCODE = 100 THEN weiterePunkte := FALSE FI END; Umfang := Umfang + SQRT((X1-XiMinus1)^2+(Y1-YiMinus1)^2); PRINT Umfang; EXEC SQL CLOSE Punkt; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 344 Räumliche Anfragen mit “Kern-SQL →Komplexität der Anfragen abhängig von der Modellierung der Geoobjekte →mögliche Modellierung von Polygonen in relationalen Datenbanken in einem topologischen Modell (vgl. Abschnitt 2.3) • Spaghetti-Modell: Polygon als Liste der Stützpunkte • Kantenliste: Polygon als Menge der Kanten (ohne Reihenfolge der Kanten) • Winged Edge: Polygon als Menge der Kanten (mit Reihenfolge der Kanten) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 345 Räumliche Anfragen mit “Kern-SQL →Umfang eines Polygons im Spaghetti-Modell SELECT uid, umfang1 + (SQRT(((p.x – pn.x)**2) +((p.y – pn.y)**2))) AS umfang polygone p, polygone pn, FROM (SELECT p1.id AS uid, SUM(SQRT(((p2.x – p1.x)**2) +((p2.y – p1.y)**2))) AS umfang1 FROM Polygone p1, Polygone p2 WHERE p1.id = p2.id AND p1.position = p2.position-1 AND p1.id = ‘P3‘) WHERE p.id = pn.id AND p.id = uid AND p.position = 1 AND pn.position = (SELECT max(m.position) FROM Polygon m WHERE m.id = pn.id) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 346 Räumliche Anfragen mit “Kern-SQL →Umfang aller Polygone im Spaghetti-Modell SELECT uid, umfang1 + (SQRT(((p.x – pn.x)**2) +((p.y – pn.y)**2))) AS umfang polygone p, polygone pn, FROM (SELECT p1.id AS uid, SUM(SQRT(((p2.x – p1.x)**2) +((p2.y – p1.y)**2))) AS umfang1 FROM Polygone p1, Polygone p2 WHERE p1.id = p2.id AND p1.position = p2.position-1 GROUP BY p1.id ) WHERE p.id = pn.id AND p.id = uid AND p.position = 1 AND pn.position = (SELECT max(m.position) FROM Polygon m WHERE m.id = pn.id) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 347 Räumliche Anfragen mit “Kern-SQL →Umfang eines Polygons in Kantenliste V1 SELECT SUM(SQRT(((end.x – start.x)**2) +((end.y – start.y)**2))) AS umfang FROM Kante k, Knoten start, Knoten end WHERE k.startknoten = start.id AND k.endknoten = end.id AND (k.rechteMasche = ‘P3‘ OR k.linkeMasche = ‘P3‘) KNOTEN V2 V3 V4 V7 V6 V5 id startknoten endrechte knoten Masche y1 E1 V1 V2 P3 x2 y2 E2 V2 V3 P3 V3 x3 y3 E3 V3 V4 P3 V4 x4 y4 E4 V4 V5 P3 V5 x5 y5 E5 V5 V6 P3 V6 x6 y6 E6 V6 V7 P3 V7 x7 y7 E7 V7 V1 id x y V1 x1 V2 KANTE Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 linke Masche P3 348 Räumliche Anfragen mit “Kern-SQL →Umfang aller Polygone in Kantenliste V1 V2 l.polygon, umfangR + umfangL AS umfang V3 (SELECT SUM(SQRT(((end.x – start.x)**2) +((end.y – start.y)**2))) AS umfangR V4 rechteMasche AS polygon V7 V6 V5 FROM Kante k, Knoten start, Knoten end WHERE k.startknoten = start.id AND k.endknoten = end.id KANTE GROUP BY rechteMasche) AS r id start- endrechte linke FULL JOIN knoten knoten Masche Masche (SELECT SUM(SQRT(((end.x – start.x)**2) E1 V1 V2 P3 +((end.y – start.y)**2))) AS umfangL E2 V2 V3 P3 linkeMasche AS polygon E3 V3 V4 P3 FROM Kante k, Knoten start, Knoten end E4 V4 V5 P3 WHERE k.startknoten = start.id E5 V5 V6 P3 AND k.endknoten = end.id E6 V6 V7 P3 GROUP BY linkeMasche) AS l E7 V7 V1 P3 ON l.polygon = r.polygon SELECT FROM Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 349 Räumliche Anfragen mit “Kern-SQL →Umfang eines Polygons im Winged Edge-Modell V1 Anfrage identisch mit der für die Kantenliste linke Masche V2 V3 V4 V7 linker Arm startknoten endknoten rechte Masche E1 V1 V2 P3 E2 E7 E2 V2 V3 P3 E3 E1 E3 V3 V4 P3 E2 E4 E4 V4 V5 P3 E3 E5 E5 V5 V6 P3 E4 E6 E6 V6 V7 P3 E5 E7 E7 V7 V1 Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 E1 linkes Bein V5 id P3 rechter Arm V6 rechtes Bein E6 350 Räumliche Anfragen mit “Kern-SQL →Berechnung der Maschenumringe im Winged Edge Modell Durchlauf im Uhrzeigersinn: V1 • wenn die linke Masche V2 V3 betrachtet wird, ist das nächste Randsegment V4 der rechte Arm V6 • wenn die rechte Masche V7 V5 betrachtet wird, ist das nächste Randsegment das linke Bein einfacher als mit der Kantenliste, da kein Vergleich der Start- bzw. Endpunkte der Linien notwendig nicht mit „Kern-SQL“ möglich FROM Polygon im Spaghetti-Modell trivial: SELECT x, y WHERE id = ‘P3‘ ORDER BY position Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 351 4.4 Räumliche Erweiterungen der Relationenalgebra →Relationenalgebra (relationale Algebra) formale Sprache zur Formulierung von Anfragen auf Relationen eine Anfragesprache heißt relational vollständig, wenn jeder Term der Relationenalgebra mit der Anfragesprache formulierbar ist wenn jeder Term durch genau einen Ausdruck formulierbar, heißt eine Anfragesprache streng relational vollständig Operationen werden auf (Basis-)Relationen angewendet und liefern Relationen (abgeschlossen) es gibt Basisoperationen und abgeleitete Operationen Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 352 Räumliche Erweiterungen der Relationenalgebra →Basisoperationen Projektion πA1,A2,...,Ak(R) πPersNr,Name(Mitarbeiter) Selektion σϕ(R) σResturlaub>10(Mitarbeiter) Kreuzprodukt R×S Kurs × Voraussetzung Vereinigung R∪S πEMail(Person) ∪ πEMail(Institut) Differenz R\S πPersNr(Mitarbeiter)\πPersNr(Teilnehmer) Umbenennung δA←B(R) δName←Nachname(Mitarbeiter) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 353 Räumliche Erweiterungen der Relationenalgebra →abgeleitete Operationen Durchschnitt R ∩ S = R \ (R \ S) πGutachter(begutachtet) ∩ πAutor(Autoren) Verbund R ⋈θ S = σθ(R × S) begutachtet ⋈Gutachter≠Autor Autoren Natürlicher Verbund R⋈S = πA1,...,Ak,C1,...,Cm,B1,...,Bn (σR.C1=S.C1∧...∧R.Cm=S.Cm(R × S) Kurs ⋈ Voraussetzung Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 354 Räumliche Erweiterungen der Relationenalgebra →Beispiel (Anfrage 2): Voraussetzungen des Kurses “Programmieren in Java” Kurs (KursNr, Titel, ...) Voraussetzung (KursNr, VoraussNr) ↓ Ergebnis (Titel) (1) πTitel2(σTitel1=′Programmieren in Java′ (σKursNr1=KursNr3(σKursNr2=VoraussNr (Kurs × Kurs × Voraussetzung)))) (2) πTitel(σKursNr=VoraussNr(Kurs× πVoraussNr(σKursNr1=KursNr2(Voraussetzung× πKursNr(σTitel=′Programmieren in Java′(Kurs)))))) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 355 Räumliche Erweiterungen der Relationenalgebra →Lösung 2 als Operatorbaum Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 356 Räumliche Erweiterungen der Relationenalgebra →als Datentypen der Attribute werden implizit die “gängigen” vorausgesetzt Integer Decimal String mit den üblichen Operatoren wie +,−, ∗, / und Prädikaten wie <,=,>, ≠ →Operatoren und Prädikate können ausschließlich in Qualifikationsformel ϕ der Selektion σ benutzt werden σResturlaub>10(Mitarbeiter) σ(Resturlaub<0.2∗Urlaubsanspruch(Mitarbeiter) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 357 Räumliche Erweiterungen der Relationenalgebra →Anfrageergebnisse sind immer Tupel von unveränderten Attributwerten (keine Verknüpfung durch Operatoren) →Anfrage 1’ ist z.B. nicht formulierbar: Personalnummer, Namen, Summe von Resturlaub und Jahresurlaub aller Mitarbeiter Mitarbeiter (PersNr, Name, ..., Resturlaub, Jahresurlaub) ↓ Ergebnis (PersNr, Name, expr.) πPersNr,Name,Resturlaub+Jahresurlaub(Mitarbeiter) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 358 Räumliche Erweiterungen der Relationenalgebra →Erweiterung typischerweise auf Ebene der Datentypen →dadurch neue Sorten, Operatoren, Prädikate (z.B. analog zu SQL/MM Part 3: Spatial) Point, LineString, Polygon Length, Area, Perimeter, Centroid Equals, Disjoint, Intersects, Overlaps, Touches, Contains →Attribute können nun auch auf räumlichen Datentypen beruhen z.B.: Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 359 Räumliche Erweiterungen der Relationenalgebra Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Flurstück(Id, Grundriss: Polygon) Person(PersNr, Name, Vorname, ...) Eigentümer(PersNr, GebäudeId) →räumliche Operatoren und Prädikate nun auch in Qualifikationsformel ϕ von Selektion σ möglich Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 360 Räumliche Erweiterungen der Relationenalgebra →Anfrage 5: Ids aller Gebäude auf dem Flurstück mit der Id “1222” Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Flurstück(Id, Grundriss: Polygon) πId2(σContains(Grundriss1,Grundriss2) (σId1=′1222′(Flurstueck × Gebaeude))) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 361 Räumliche Erweiterungen der Relationenalgebra →Anfrage 6: Ids von Kirchen, die höchstens 2 km von einem Parkhaus entfernt sind Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) πId1(σDistance(Centroid(Grundriss1),Centroid(Grundriss2))<2000 (σNutzung1=′Kirche′∧Nutzung2=′Parkhaus′ (Gebaeude × Gebaeude))) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 362 Räumliche Erweiterungen der Relationenalgebra →Anfrage 7: Namen von Eigentümern benachbarter Wohngebäude Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Person(PersNr, Name, Vorname, ...) Moog Eigentümer(PersNr, GebäudeId) Lock πName1,Name2 (σPersNr1=PersNr3∧PersNr2=PersNr4 (Person × Person× Kulm Weis (σGebaeudeId1=Id1∧GebaeudeId2=Id2 Grote Kulm (Eigentuemer × Eigentuemer × (πId1,Id2 (σTouches(Grundriss1,Grundriss2) (σId1<Id2(σNutzung1=′wohnen′∧Nutzung2=′wohnen′(Gebaeude × Gebaeude))))))))) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 363 Räumliche Erweiterungen der Relationenalgebra →Anfrage 5’: Flächen aller Gebäude auf dem Flurstück mit der Id “1222” Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Flurstück(Id, Grundriss: Polygon) πArea(Grundriss2)(σContains(Grundriss1,Grundriss2) (σId1=′1222′(Flurstueck × Gebaeude))) →wie in “klassischer” Relationenalgebra keine Operatoren in der Projektionsliste erlaubt Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 364 4.5 Räumliche Erweiterungen von SQL →Erweiterung (wieder) auf Ebene der Datentypen →dadurch neue Sorten, Operatoren, Prädikate →typischerweise Orientierung an Standard →SQL/MM Part 3: Spatial, z.B.: Point, LineString, Polygon Length, Area, Perimeter, Centroid Equals, Disjoint, Intersects, Overlaps, Touches, Contains →Relationen nun mit räumlichen Attributen möglich →Benutzung der räumlichen Datentypen wie der gewohnten Datentypen in “CREATE TABLE”Anweisung, z.B.: Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 365 Räumliche Erweiterungen von SQL CREATE TABLE Gebäude (Id CHAR(25), Nutzung CHAR(25), Grundriss Polygon, PRIMARY KEY(Id)); INSERT INTO Gebäude VALUES ( ’G4211’,’Polizei’,(12125,1333,13430,1560,13260,2497, 14111,2695,14111,2638,16040,3092,15303,6468,13345,5958, 13771,3943,12948,3773,12948,3887,11671,3631)); CREATE TABLE Flurstück (Id CHAR(25), Grundriss Polygon, PRIMARY KEY(Id)); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 366 Räumliche Erweiterungen von SQL →räumliche Operatoren und Prädikate nun in SELECT-Anweisungen überall dort möglich, wo auch die sonst üblichen Operatoren und Prädikate auftreten können Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 367 Räumliche Erweiterungen von SQL →Anfrage 5: Ids aller Gebäude auf dem Flurstück mit der Id “1222” Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Flurstück(Id, Grundriss: Polygon) SELECT FROM WHERE g.Id Gebaeude g, Flurstueck f f.Id = ’1222’ AND Contains(f.Grundriss,g.Grundriss) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 368 Räumliche Erweiterungen von SQL →Anfrage 6: Ids von Kirchen, die höchstens 2 km von einem Parkhaus entfernt sind Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) SELECT FROM WHERE AND AND g1.Id Gebaeude g1, Gebaeude g2 g1.Nutzung = ’Kirche’ g2.Nutzung = ’Parkhaus’ Distance(Centroid(g1.Grundriss), Centroid(g2.Grundriss)) < 2000; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 369 Räumliche Erweiterungen von SQL →Anfrage 7: Namen von Eigentümern benachbarter Wohngebäude Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Person(PersNr, Name, Vorname, ...) Eigentümer(PersNr, GebäudeId) SELECT p1.Name, p2.Name FROM Person p1, Person p2, Gebaeude g1, Gebaeude g2, Eigentuemer e1, Eigentuemer e2 WHERE p1.PersNr = e1.PersNr AND p2.PersNr = e2.PersNr AND e1.GebaeudeId = g1.Id AND e2.GebaeudeId = g2.Id AND g1.Nutzung = ’wohnen’ AND g2.Nutzung = ’wohnen’ AND g1.Id < g2.Id AND Touches(g1.Grundriss,g2.Grundriss); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 370 Räumliche Erweiterungen von SQL →Anfrage 5’: Flächen aller Gebäude auf dem Flurstück mit der Id “1222” Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Flurstück(Id, Grundriss: Polygon) SELECT FROM WHERE Area(g.Grundriss) Gebaeude g, Flurstueck f f.Id = ’1222’ AND Contains(f.Grundriss,g.Grundriss) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 371 Räumliche Erweiterungen von SQL →Anfrage 8: Wieviel Prozent der Fläche der (geplanten) Trasse ’647’ macht der Anteil des Flurstücks ’586’ aus? Flurstück(Id, Grundriss: Polygon) Trasse(Id, Geometrie: Polygon) SELECT FROM WHERE (Area(Intersection (t.Geometrie, f.Grundriss)) / Area(t.Geometrie)) * 100 Trasse t, Flurstueck f t.Id = ’647’ AND f.Id = ’586’; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 372 Räumliche Erweiterungen von SQL →Anfrage 9: Durch welche Flurstücke fließen Bäche? Flurstück (Id, Grundriss: Polygon) Bach(...,Geometrie: Polygon) SELECT FROM WHERE f.Id Flurstueck f, Bach b Intersects (f.Grundriss, b.Geometrie); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 373 Räumliche Erweiterungen von SQL →typische räumliche SQL-Erweiterungen bieten Oracle Spatial Postgres →Oracle Spatial Erweiterung des Oracle-Datenbanksystems ein (sehr spezieller) geometrischer Datentyp: CREATE TYPE sdo_geometry AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY, SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 374 Räumliche Erweiterungen von SQL →mit SDO_GTYPE wird der Geometrietyp kodiert 0 UNKNOWN_GEOMETRY 1 POINT 2 LINESTRING 3 POLYGON 4 Collection 5 MULTIPOINT 6 MULTILINESTRING 7 MULTIPOLYGON Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 375 Räumliche Erweiterungen von SQL →SDO_SRID wird später räumliches Bezugssystem spezifizieren (zurzeit nicht verwendet) →SDO_POINT_TYPE repräsentiert dreidimensionalen Punkt (zurzeit nur zwei Dimensionen unterstützt) →SDO_POINT wird nur verwendet, falls ein Punkt vorliegt und die beiden folgenden Attribute NULL sind (effiziente Kodierung einzelner Punkte) →SDO_ELEM_INFO Zahlen-Array gibt an, wie die Werte in →SDO_ORDINATES zu interpretieren sind Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 376 Räumliche Erweiterungen von SQL →Beispiel: Gebäude-Relation CREATE TABLE Gebäude (Id CHAR(25), Nutzung CHAR(25), Grundriss SDO_GEOMETRY, PRIMARY KEY(Id)); INSERT INTO Gebäude VALUES (’G4211’,’Polizei’, SDO_GEOMETRY(SDO_GTYPE = 2003, SDO_SRID = NULL, SDO_POINT = NULL, SDO_ELEM_INFO = (1,1003,1), SDO_ORDINATES = (12125,1333,13430,1560,13260, 2497,14111,2695,14111,2638,16040,3092,15303, 6468,13345,5958,13771,3943,12948,3773,12948, 3887,11671,3631))); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 377 Räumliche Erweiterungen von SQL →Polygon mit Loch Unterscheidung zwischen inneren und äußeren Polygonring Verbindung der Stützpunkte als Gerade oder als Kreisbogen SDO_GEOMETRY äußerer Polygonring ( 2003, 2-dimensioaus: http://download.oracle.com/docs/ ...5/sdo_objrelschema.htm Gerade NULL, nales Polygon Offset NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5) ) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 378 Räumliche Erweiterungen von SQL →Polygon mit Loch Unterscheidung zwischen inneren und äußeren Polygonring Verbindung der Stützpunkte als Gerade oder als Kreisbogen SDO_GEOMETRY ( 2003, aus: http://download.oracle.com/docs/ innerer ...5/sdo_objrelschema.htm NULL, Polygonring Gerade Offset NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5) ) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 379 Räumliche Erweiterungen von SQL →zusammengesetzte Linie die Verbindung zweier Stützpunkte einer Linie ist eine Gerade oder ein Kreisbogen Kreisbögen werden durch drei Koordinatenpaare kodiert eine zusammengesetzte Linie ent- aus: http://download.oracle.com/docs/... hält sowohl Geraden als auch Bögen als Segmente SDO_GEOMETRY( Zusammengesetzte Linie 2002, 2-dimensioNULL, nale Linie Offset # Segmente NULL, SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10) ) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 380 Räumliche Erweiterungen von SQL →zusammengesetzte Linie die Verbindung zweier Stützpunkte einer Linie ist eine Gerade oder ein Kreisbogen Kreisbögen werden durch drei Koordinatenpaare kodiert eine zusammengestzte Linie ent- aus: http://download.oracle.com/docs/... hält sowohl Geraden als auch Bögen als Segmente SDO_GEOMETRY( Linie Gerade Linie 2002, NULL, Offset Kreisbogen Offset NULL, SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10) ) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 381 Räumliche Erweiterungen von SQL →Collection Sammlung von Geometrien mit verschiedenen Typen SDO_GEOMETRY ( 2004, Punkt Linie Polygon NULL, NULL, SDO_ELEM_INFO_ARRAY (1,1,1, 3,2,1, 7,1003,1), SDO_ORDINATE_ARRAY (12,14, 2,3, 10,7, 5,8, 9,8, 10,13, 5,13, 5,8)) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 382 Räumliche Erweiterungen von SQL →Anfrage 5’: Flächen aller Gebäude auf dem Flurstück mit der Id “1222” Gebäude(Id: String, Nutzung: String, Grundriss: SDO_GEOMETRY) Flurstück(Id: String, Grundriss: SDO_GEOMETRY) SELECT FROM WHERE SDO_GEOM.SDO_Area(g.Grundriss, 0.005) Toleranz: gibt an ab Gebaeude g, Flurstueck f welcher Stelle f.Id = ’1222’ AND gerundet wird SDO_CONTAINS(f.Grundriss, g.Grundriss) =‘TRUE‘ Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 383 Räumliche Erweiterungen von SQL →Anfrage 5’: Flächen aller Gebäude auf dem Flurstück mit der Id “1222” Gebäude(Id: String, Nutzung: String, Grundriss: SDO_GEOMETRY) Flurstück(Id: String, Grundriss: SDO_GEOMETRY) SELECT FROM WHERE SDO_GEOM.SDO_Area(g.Grundriss, 0.005) Gebaeude g, Flurstueck f f.Id = ’1222’ AND SDO_RELATE(f.Grundriss, g.Grundriss, ‘mask=contains‘)=‘TRUE‘ Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 384 Räumliche Erweiterungen von SQL →Postgres Open-Source-Software-Datenbanksystem mit räumlichen Erweiterungen →Datentypen point (float, float) box (point, point) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 385 Räumliche Erweiterungen von SQL lseg (point, point) line (point1, point2, ..., pointn) 2≤n≤124 long line (point1, point2, ..., pointn) 2≤n≤100.000.000 Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 386 Räumliche Erweiterungen von SQL polygon (point1, point2, ..., pointn) 3≤n≤124 long polygon (point1, point2, ..., pointn) 3≤n≤100.000.000 circle (point, float) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 387 Räumliche Erweiterungen von SQL →Prädikate =, <> point×point, lseg×lseg, ..., circle×circle intersects spatial_type×spatial_type inside point×{box, polygon, long polygon, circle} box×{box, polygon, long polygon, circle} lseg×{box, polygon, long polygon, circle} line×{box, polygon, long polygon, circle} long line×{box, polygon, long polygon, circle} polygon×{box, polygon, long polygon, circle} long polygon× {box, polygon, long polygon, circle} circle×{box, polygon, long polygon, circle} Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 388 Räumliche Erweiterungen von SQL →Funktionen Area {box, circle, polygon, long polygon} → float Length {lseg, line, long line} → float Perimeter {box, circle, polygon, long polygon} → float Distance point×point → float Point_x, Point_y point → float Box_ll, Box_ur box → point bbox {box, lseg, line, long line, polygon, long polygon, circle} → box Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 389 Räumliche Erweiterungen von SQL →Beispiel: Gebäude-Relation CREATE TABLE Gebäude (Id CHAR(25), Nutzung CHAR(25), Grundriss Polygon(50), PRIMARY KEY(Id)); INSERT INTO Gebäude VALUES ( ’G4211’,’Polizei’, ((12125,1333),(13430,1560),(13260,2497), (14111,2695),(14111,2638),(16040,3092), (15303,6468),(13345,5958),(13771,3943), (12948,3773),(12948,3887),(11671,3631)) ’); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 390 Räumliche Erweiterungen von SQL →Anfrage 5’: Flächen aller Gebäude auf dem Flurstück mit der Id “1222” Gebäude(Id: String, Nutzung: String, Grundriss: Polygon) Flurstück(Id, Grundriss: Polygon) SELECT FROM WHERE Area(g.Grundriss) Gebaeude g, Flurstueck f f.Id = ’1222’ AND inside(g.Grundriss,f.Grundriss) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 391 Räumliche Erweiterungen von SQL →Abstände zwischen Parkhäusern und Polizeiwachen Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 392 Räumliche Erweiterungen von SQL SELECT g1.Id, g2.Id, Distance ( point ( (Point_X (box_ll (bbox (g1.Grundriss))) + Point_X (box_ur (bbox (g1.Grundriss)))) / 2, (Point_Y (box_ll (bbox (g1.Grundriss))) + Point_Y (box_ur (bbox (g1.Grundriss)))) / 2), point ( (Point_X (box_ll (bbox (g2.Grundriss))) + Point_X (box_ur (bbox (g2.Grundriss)))) / 2, (Point_Y (box_ll (bbox (g2.Grundriss))) + Point_Y (box_ur (bbox (g2.Grundriss)))) / 2)) FROM Gebaeude g1, Gebaeude g2 WHERE g1.Nutzung = ’Parkhaus’ AND g2.Nutzung = ’Polizei’ ORDER BY 1, 3; Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 393 4.6 Auswertung räumlicher Anfragen →räumliche Anfragen werden häufig klassifiziert in Punktanfrage (Point Query) gegeben: Objekt o mit Punktgeometrie gesucht: { oi | contains(oi.Geometrie, o.Geometrie} Rechteckanfrage (Window Query) gegeben: Objekt o mit Rechteckgeometrie gesucht: { oi | intersects(oi.Geometrie, o.Geometrie} Regionsanfrage (Region Query) gegeben: Objekt o mit Polygongeometrie gesucht: { oi | intersects(oi.Geometrie, o.Geometrie} Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 394 Auswertung räumlicher Anfragen räumlicher Verbund (Spatial Join) gegeben: Objektklassen o, o’ gesucht: { oi ∈ o, oj ∈ o’ | θ(oi.Geometrie, oj.Geometrie)} mit θ: =, <>, intersects, inside Beispiele: Anfrage 5’: Flächen aller Gebäude auf dem Flurstück mit der Id “1222” SELECT Area(g.Grundriss) FROM Gebaeude g, Flurstueck f WHERE f.Id = ’1222’ AND inside(g.Grundriss,f.Grundriss) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 395 Auswertung räumlicher Anfragen →Anfrage 9: Durch welche Flurstücke fließen Bäche? Flurstück (Id, Grundriss: Polygon) Bach(...,Geometrie: Polygon) SELECT FROM WHERE f.Id Flurstueck f, Bach b Intersects (f.Grundriss, b.Geometrie); Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 396 Auswertung räumlicher Anfragen →naive Auswertung räumlicher Verbunde (Nested Loop Join) zu ineffizient: gegeben: Objektklassen o, o’ gesucht: { oi ∈ o, oj ∈ o’ | θ(oi.Geometrie, oj.Geometrie)} Treffer := ∅ for all oi ∈ o do begin for all oj ∈ o’ do begin if θ(oi.Geometrie, oj.Geometrie) then Treffer := Treffer ∪ [oi, oj] fi end end Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 397 Auswertung räumlicher Anfragen →bei Anfrage 9 (Durch welche Flurstücke fließen Bäche) mit z.B. 5.000 Flurstückpolygonen und 40 Bachpolygonen 200.000 Vergleiche auf Schnitt, z.B.: intersects((7200,2430,7245,2430,7200,2565,7245,2700,7290,2790, 7335,2880,7470,3105,7560,3240,7515,3375,7470,3600,7425,3780, 7335,3870,7245,3870,7110,3780,6975,3870,6930,3960,6840,4005, 6750,4095,6570,4230,6480,4230,6480,4185,6705,4050,6840,3915, 7020,3780,7110,3735,7245,3780,7335,3780,7425,3645,7470,3375, 7515,3195,7335,2970,7200,2745,7155,2520,7200,2385,7245,2385, 7200,2430),(6975,2565,7065,2835,7245,2835,7875,2790,8190, 2970,8010,3195,7650,3555,7470,3510,7470,3690,7290,3825,7020, 3825,6750,4050,6570,4095,6480,3915,6345,3960,6210,3600,6165, 3420,6165,3240,6210,3015,6300,2655,6345,2610,6840,2610,6975, 2565)) Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 398 Auswertung räumlicher Anfragen →daher Auswertung räumlicher Anfragen zweistufig filtern • Bestimmung möglicher Treffer durch Auswertung auf räumlicher Approximation (geringere Kosten) verfeinern • Auswertung auf exakter Geometrie nur für Objekte des Filterschritts Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 399 Auswertung räumlicher Anfragen →konservative Approximation vollständige Überdeckung des Objekts erkennen von Fehltreffern ¬(θ(KonAppr(oi.Geometrie), KonAppr(oj.Geometrie))) ⇒ ¬(θ(oi.Geometrie, oj.Geometrie)) aus: http://dbs.mathematik.uni-marburg.de/teaching Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 400 Auswertung räumlicher Anfragen →progressive Approximation vollständig im Objekt enthalten erkennen von Treffern θ(ProgAppr(oi.Geometrie), ProgAppr(oj.Geometrie)) ⇒ θ(oi.Geometrie, oj.Geometrie) Berechnung schwierig aus: http://dbs.mathematik.uni-marburg.de/teaching Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 401 Auswertung räumlicher Anfragen →in der Praxis meist konservative Approximation durch minimal umgebendes (achsenparalleles) Rechteck (MUR, bounding box) http://www.sunysb.edu/libmap/ Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 402 Auswertung räumlicher Anfragen →Beispiel (Anfrage 9); Ausgangssituation Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 403 Auswertung räumlicher Anfragen →Beispiel (Anfrage 9); einige Flurstücke und Bäche markiert Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 404 Auswertung räumlicher Anfragen →Beispiel (Anfrage 9); MURs für Flurstücke und Bäche Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 405 Auswertung räumlicher Anfragen →Beispiel (Anfrage 9); überlappende MURs Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 406 Auswertung räumlicher Anfragen →Beispiel (Anfrage 9); überlappende Flurstücke und Bäche Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 407 Auswertung räumlicher Anfragen →Auswertung räumlicher Verbunde mit MUR (etwas) besser: Treffer := ∅ for all oi ∈ o do begin for all oj ∈ o’ do begin if θ(MUR(oi.Geometrie), MUR(oj.Geometrie)) then if θ(oi.Geometrie oj.Geometrie) then Treffer := Treffer ∪ [oi, oj] fi fi end end Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 408 Auswertung räumlicher Anfragen →noch immer |oi| · |oj| MUR-Vergleiche (z.B. 200.000 Vergleiche zwischen 5.000 “FlurstückMURs” und 40 “Bach-MURs”) →zur effizienteren Auswertung räumlicher Anfragen daher Einsatz von räumlichen Indexen aus: http://www.geoinformation.net/ Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 409 4.7 Zusammenfassung →Räumliche Anfragen ermöglichen die Benutzung von geometrischen Datentypen geometrischen Operationen geometrischen Prädikaten →Entwicklung von SQL SQL92 (SQL2), SQL:1999 (SQL3) SQL/MM Part 3: Spatial Datentypen, Methoden →Anfragen mit “Kern-SQL” Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 410 Zusammenfassung →Räumliche Anfragen mit “Kern-SQL” relationale Modellierung von Punkten Abstandsberechnung zwischen Punkten relationale Modellierung von Polygonen n-ter Punkt eines Polygons bounding box Umfang von Polygonen Übung [Umfang von Polygonen, direkt] Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 411 Zusammenfassung →Räumliche Erweiterungen der Relationenalgebra Basisoperationen, abgeleitete Operationen Erweiterung durch neue Sorten, Operatoren, Prädikate einige Anfragen →Räumliche Erweiterungen von SQL einige Anfragen Oracle Spatial Übung [Anfrage 5’ mit Oracle Spatial] Postgres Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 412 Zusammenfassung →Auswertung räumlicher Anfragen Punktanfrage Rechteckanfrage Regionsanfrage räumlicher Verbund zweistufige Auswertung räumlicher Anfragen konservative Approximation progressive Approximation Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 413 Zusammenfassung erfassen GIS präsentieren Anfragen in RDBen verwalten analysieren Auswertung von Anfragen räumliche Erweiterungen SQL Relationale Algebra Approximationen Spatial Databases und GISe, Kap.4 / K.N., S.T. / SomSem 2009 414