Folien

Werbung
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
Herunterladen