16.11.2014 Aufrufe

Tabelle wird für jede geometrische Instanz eine eigene Zeile ...

Tabelle wird für jede geometrische Instanz eine eigene Zeile ...

Tabelle wird für jede geometrische Instanz eine eigene Zeile ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Tabelle</strong> <strong>wird</strong> für <strong>jede</strong> <strong>geometrische</strong> <strong>Instanz</strong> <strong>eine</strong> <strong>eigene</strong> <strong>Zeile</strong> angelegt. Das Spatial<br />

zugrunde liegende Datenmodell ist hierarchisch aufgebaut und besteht aus Elementen,<br />

Geometrien und Layern. Räumliche Daten werden als Layer abgespeichert, die<br />

aus Geometrien zusammengesetzt sind, die wiederum aus Elementen bestehen.<br />

Der Objekttyp SDO GEOMETRY ist in Spatial wie in Abbildung 9 definiert:<br />

CREATE TYPE sdo geometry AS OBJECT (<br />

SDO GTYPE NUMBER,<br />

SDO SRID NUMBER,<br />

SDO POINT SDO POINT TYPE,<br />

SDO ELEM INFO MDSYS.SDO ELEM INFO ARRAY,<br />

SDO ORDINATES MDSYS.SDO ORDINATE ARRAY);<br />

Abbildung 9: Deklaration von MDSYS.SDO GEOMETRY<br />

Das erste Attribut SDO GTYPE ist ein numerischer Wert, der den Typ der Geometrie<br />

angibt. Möglichen Attributwerte und ihre Bedeutung sind der <strong>Tabelle</strong> aus Abbildung<br />

10 zu entnehmen (d steht für die Zahl der Dimensionen; Oracle 8i unterstützt bisher<br />

nur höchstens zweidimensionale Objekte). Der Geometrietyp Collection kann<br />

Wert Geometrieart Beschreibung<br />

d000 UNKNOWN GEOMETRY <strong>wird</strong> ignoriert<br />

d001 POINT Punkt<br />

d002 LINESTRING Streckenzug<br />

d003 POLYGON Polygon mit oder ohne Loch<br />

d004 Collection heterogene Sammlung von Elementen<br />

d005 MULTIPOINT mehrere Punkte<br />

d006 MULTILINESTRING mehrere Streckenzüge<br />

d007 MULTIPOLYGON mehrere disjunkte Polygone<br />

Abbildung 10: Mögliche Werte für SDO GTYPE<br />

in Oracle 8i zusätzlich zu den primitiven elementaren Figuren noch aus 2-D Arc-<br />

Line-Strings (durch Kreisbögen zusammengesetzte Streckenzüge), 2-D Arc-Polygons<br />

(durch Kreisbögen zusammengesetzte Polygone), 2-D Circles (Kreise) sowie 2-D Optimized<br />

Rectangles (Rechtecke) zusammengesetzt sein.<br />

Das Attribut SDO SRID ist für zukünftige Zwecke reserviert. Es soll als Fremdschlüssel<br />

für <strong>eine</strong> Referenztabelle von räumlichen Bezugssystemen dienen. Das Attribut<br />

SDO POINT ist ein Objekttyp mit drei numerischen Attributen X, Y und Z. Sind die<br />

beiden folgenden Attribute SDO ELEM INFO und SDO ORDINATES beide null und ist<br />

dieser Wert ungleich null gesetzt, so werden die Werte von X und Y als Koordinaten<br />

<strong>eine</strong>r Punktgeometrie aufgefasst. Ist <strong>eine</strong>s der beiden folgenden Attribute nicht null,<br />

so <strong>wird</strong> dieser Wert von Spatial ignoriert.<br />

Das Attribut SDO ELEM INFO ist ein Array von Zahlen, dessen Grösse variiert. Die<br />

in diesem Array angegebenen Werte bestimmen die Interpretation der Werte des<br />

Attributs SDO ORDINATES. DieGrösse dieses Arrays ist ein Vielfaches von 3, da für<br />

<strong>jede</strong>s Element der Geometrie, die abgespeichert <strong>wird</strong>, drei Zahlen in diesem Attribut<br />

angegeben werden müssen. Diese drei Zahlen sind:<br />

16


1. SDO STARTING OFFSET bestimmt den Offset des ersten Punktes <strong>eine</strong>s Elementes<br />

in SDO ORDINATES relativ zum Anfang. Der erste Punkt im Array hat den<br />

Offset 1.<br />

2. SDO ETYPE bestimmt den Typ des Elementes. Ist dieser durch SDO GTYPE bereits<br />

festgelegt, so <strong>wird</strong> hier redundante Information abgespeichert. Ist allerdings<br />

in SDO GTYPE angegeben, dass <strong>eine</strong> heterogene Menge an <strong>geometrische</strong>n<br />

Elementen vorliegt, so spezifiziert dieser Wert den genauen Typ der einzelnen<br />

Elemente. Erlaubt sind Werte von 1 bis 5. Die Werte 1, 2 und 3 stehen wie<br />

in Abbildung 10 für einfache Elemente. Die Werte 4 und 5 repräsentieren zusammengesetzte<br />

Elemente. Für diese hat das Attribut SDO ETYPE mindestens<br />

einmal drei Werte als header und anschliessend je drei Werte für <strong>jede</strong>s der<br />

einfachen Elemente. Ein Beispiel findet sich in Abbildung 11.<br />

3. SDO INTERPRETATION ist ein von SDO ETYPE abhängiger Wert. Ist in SDO ETYPE<br />

angegeben, dass es sich um ein zusammengesetztes Element handelt, so gibt<br />

dieser Wert die Anzahl der Untertypen an, aus denen das Element besteht. Hat<br />

SDO ETYPE <strong>eine</strong>n der Werte 1, 2 oder 3, so bestimmt SDO INTERPRETATION,wie<br />

die Werte in SDO ORDINATES zu diesem Element zu interpretieren sind. Beispielsweise<br />

<strong>wird</strong> für ein durch SDO ETYPE als Polygon definiertes Objekt durch<br />

SDO INTERPRETATION bestimmt, ob die einzelnen Punkte in SDO ORDINATES<br />

durch Geraden oder Kreisbögen miteinander verbunden werden.<br />

Eine vollständige Beschreibung der Kombinationsmöglichkeiten und Werte der Attributefindetsichin[Ora99b].<br />

Das letzte Attribut SDO ORDINATES ist ein Array variabler Länge von Zahlen, die<br />

die Koordinaten der Eckpunkte der einzelnen Elemente bestimmen, aus denen das<br />

Geometrieobjekt besteht. Die Werte in diesem Array sind immer nach Dimensionen<br />

geordnet. Bisher unterstützt Oracle 8i allerdings nur zweidimensionale Objekte. Die<br />

Koordinaten der Elemente werden in diesem Array direkt nacheinander ohne bestimmte<br />

Trenn- oder Steuerungszeichen aufgelistet. Abbildung 11 zeigt ein Beispiel<br />

für das Anlegen <strong>eine</strong>s <strong>geometrische</strong>n Objektes vom Objekttyp SDO GEOMETRY.<br />

6<br />

5<br />

4<br />

3<br />

2<br />

1<br />

y<br />

(2,6) (5,6)<br />

(1,5)<br />

(6,5)<br />

(3,4) (4,4)<br />

(3,3) (4,3)<br />

(1,2) (6,2)<br />

(2,1) (5,1)<br />

x<br />

1 2 3 4 5 6<br />

SDO_GEOMETRY column = (<br />

SDO_GTYPE = 3<br />

SDO_SRID = NULL<br />

SDO_POINT = NULL<br />

SDO_ELEM_INFO = (1,3,1, 19,3,1)<br />

SDO_ORDINATES = (1,2 , 2,1 , 5,1 , 6,2 , 6,5 ,<br />

5,6 , 2,6 , 1,5 , 1,2 ,<br />

3,3 , 4,3 , 4,4 , 3,4 , 3,3 ) )<br />

Abbildung 11: Polygon mit Loch (Inselpolygon)<br />

Das erzeugte Objekt kann nun in der Spalte <strong>eine</strong>r <strong>Tabelle</strong> abgelegt werden, die vom<br />

Typ MDSYS.SDO GEOMETRY ist. Die Definition <strong>eine</strong>r <strong>Tabelle</strong> mit <strong>eine</strong>m räumlichen<br />

17


Attribut folgt der üblichen Syntax von create table (Ein Beispiel steht in Abbildung<br />

12). Ist <strong>eine</strong> solche <strong>Tabelle</strong> angelegt worden, so muss in <strong>eine</strong>r weiteren, vom System<br />

CREATE TABLE country (<br />

name VARCHAR2(50),<br />

shape MDSYS.SDO GEOMETRY);<br />

Abbildung 12: Defintion <strong>eine</strong>r <strong>Tabelle</strong> mit räumlichem Attribut in Oracle 8i-Spatial<br />

angelegten Sicht, ein Eintrag für diese <strong>Tabelle</strong> und ihr räumliches Attribut vorgenommen<br />

werden, um Anfragen an und Operationen auf den <strong>geometrische</strong>n Daten<br />

durchführen zu können. Diese Sicht enthält Metadaten über <strong>Tabelle</strong>n mit Attributen<br />

vom Typ MDSYS.SDO GEOMETRY und <strong>wird</strong> mit USER SDO GEOM METADATA bezeichnet.<br />

Dieser Name ist fest vorgegeben. Die Sicht enthält die <strong>Zeile</strong>n <strong>eine</strong>r globalen Relation,<br />

die dem Benutzer zugeordnet sind. Es gibt auch die Sichten ALL SDO GEOM -<br />

METADATA sowie DBA SDO GEOM METADATA. Der Aufbau dieser Relation ist in Abbildung<br />

13 angegeben. Für <strong>jede</strong> Relation mit räumlichen Daten muss in dieser Relati-<br />

CREATE TABLE mdsys.sdo geom metadata (<br />

table name VARCHAR2(30),<br />

column name VARCHAR2(30),<br />

diminfo MDSYS.SDO DIM ARRAY,<br />

srid NUMBER);<br />

INSERT INTO user sdo geom metadata VALUES (’country’,’shape’,<br />

MDSYS.SDO DIM ARRAY(MDSYS.SDO DIM ELEMENT(’X’,357000000,357300000,1),<br />

MDSYS.SDO DIM ELEMENT(’Y’,576350000,576665000,1)),NULL);<br />

Abbildung 13: Metadatentabelle für räumliche Attribute<br />

on ein Tupel angelegt werden. Dabei gibt DIMINFO den Koordinatenbereich der räumlichen<br />

Informationen an. Dieses Attribut ist vom Objekttyp SDO DIM ARRAY, derals<br />

VARRAY(4) of SDO DIM ELEMENT definiert ist. Der Aufbau der Informationen über<br />

<strong>eine</strong> einzelne Dimension ist in Abbildung 14 angegeben. Dabei gibt SDO DIMNAME<br />

CREATE TYPE sdo dim element AS OBJECT (<br />

sdo dimname VARCHAR2(64),<br />

sdo lb NUMBER NOT NULL,<br />

sdo ub NUMBER NOT NULL,<br />

sdo tolerance NUMBER NOT NULL);<br />

Abbildung 14: Definition der Dimensionselemente<br />

den Namen und SDO LB bzw. SDO UB die untere bzw. obere Grenze der Koordinaten<br />

bezüglich der Dimension an. Die Toleranz bestimmt, um welchen Wert sich Koordinaten<br />

maximal unterscheiden dürfen, damit sie von Spatial noch als gleich angesehen<br />

werden.<br />

Die Reihenfolge der Dimensionen im DIMINFO-Array muss mit der Reihenfolge der<br />

Koordinaten in SDO ORDINATES übereinstimmen. Es sind hier auch mehr Dimensio-<br />

18


nen möglich, die Methoden von Spatial unterstützen allerdings nur zweidimensionale<br />

Daten.<br />

4.1.2 Anfragemodell<br />

Spatial benutzt ein Zwei-Ebenen-Anfrage-Modell (two-tier query model), um räumlicheAnfragenzubearbeiten(sieheAbb.15).Eineräumliche<br />

Anfrage <strong>wird</strong> dabei in<br />

zwei Operationen (Primärfilter und Sekundärfilter) aufgeteilt. Aufgabe des Primärfilters<br />

ist es, aus der Gesamtmenge der <strong>geometrische</strong>n Daten in möglichst kurzer<br />

Zeit <strong>eine</strong> Teilmenge (Kandidatenmenge) herauszufiltern, die als Eingabe an den Sekundärfilter<br />

übergeben <strong>wird</strong>. Diese indexbasierte Primärfilter-Operation benutzt als<br />

Eingabe approximierte Geometrieinformationen, um den Rechenaufwand zu verringern.<br />

Das Ergebnis der Operation des Primärfilters ist <strong>eine</strong> Obermenge des exakten<br />

Resultats. Der Sekundärfilter führt anschliessend exakte und daher meist teure Operationen<br />

auf der vom Primärfilter übergebenen Kandidatenmenge aus und liefert die<br />

exakte Ergebnismenge der Anfrage.<br />

Menge<br />

<strong>geometrische</strong>r<br />

Daten<br />

Menge<br />

an<br />

Kandidaten<br />

Primärfilter<br />

Sekundärfilter<br />

exakte<br />

Ergebnismenge<br />

Enthält mindestens<br />

die Menge des exakten<br />

Ergebnisses<br />

Abbildung 15: two-tier query model<br />

Ein wesentlicher Faktor für die Bearbeitungszeit räumlicher Anfragen ist die Selektivität<br />

des Primärfilters, da die Zeit, die Primärfilter-Operationen im Vergleich zu<br />

den Sekundärfilter-Operationen benötigen, sehr gering ist. Es ist also ein Optimum<br />

zwischen den gegenläufigen Faktoren Laufzeit und Grösse der ermittelten Kandidatenmenge<br />

(relaitv zum Endergebnis der Anfrage) zu bestimmen. Durch Indexe auf<br />

den <strong>geometrische</strong>n Daten erhofft man sich <strong>eine</strong> gute Approximation des Optimums.<br />

4.1.3 Indexe für räumliche Daten<br />

Die Güte <strong>eine</strong>s Index hängt auch von den zu erwartenden Anfragen ab. Typische<br />

Anfragen, für deren Bearbeitung räumliche Indexe benötigt werden, sind:<br />

• Bereichsanfragen (window-query): Welche Objekte liegen in <strong>eine</strong>m bestimmten<br />

Bereich ?<br />

• Räumlicher Verbund (spatial join): In welcher räumlichen Beziehung stehen Objekte<br />

zueinander ?<br />

19


In Oracle 8i werden beide Anfragearten durch den gleichen Index unterstützt. Die<br />

Einträge des räumlichen Index sind allerdings nicht mehrdimensional, sondern angeordnete<br />

Integer-Werte. Dies bedeutet, dass den integer-wertigen Indexeinträgen<br />

Teilflächen des gesamten Raumes (Kacheln) zugeordnet werden.<br />

Bei der Erstellung <strong>eine</strong>s räumlichen Index mit Oracle 8i <strong>wird</strong> der Koordinatenraum,<br />

der alle Geometrien enthält, in kl<strong>eine</strong>re Teilflächen zerlegt, die den Raum partitionieren.<br />

Dieser Zerlegungsprozess <strong>wird</strong> als tessellation bezeichnet. In <strong>eine</strong>m ersten<br />

Schritt <strong>wird</strong> der gesamte Koordinatenraum entlang der Seitenhalbierenden in vier<br />

gleich grosse Kacheln zerlegt. Spatial bietet zwei mögliche Vorgehensweisen an:<br />

• Festes Indexieren (Fixed Indexing): alle Kacheln haben gleiche Grösse und Form<br />

• Hybrides Indexieren (Hybrid Indexing): Grösse und Form der Kacheln variieren<br />

an den Rändern der Geometrien<br />

Beim festen Indexieren <strong>wird</strong> der erste Schritt mit den entstandenen kl<strong>eine</strong>ren Kacheln<br />

wiederholt, bis ein Abbruchkriterium erfüllt ist. Das Ergebnis ist <strong>eine</strong> Zerlegung<br />

des Koordinatenraumes in Kacheln, die alle dieselbe Grösse und Form haben<br />

(siehe Abb. 16). Im Index <strong>wird</strong> für <strong>jede</strong> Kachel abgespeichert, welche Geometrien aus<br />

2 3<br />

22<br />

23<br />

20 21<br />

32 33<br />

30 31<br />

0 1<br />

02 03 12 13<br />

00 01<br />

10 11<br />

Abbildung 16: Zerlegung <strong>eine</strong>r Fläche und Zuordnung des z-Codes<br />

der Datentabelle sie schneiden.<br />

Beim hybriden Indexieren <strong>wird</strong> zunächst der Prozess des festen Indexierens durchgeführt;<br />

zusätzlich <strong>wird</strong> aber noch <strong>eine</strong> zweite Zerlegung vorgenommen, die immer<br />

nur diejenigen Kacheln weiter teilt, die den Rand <strong>eine</strong>r Geometrie schneiden (siehe<br />

Abbildung 17). Auch dies <strong>wird</strong> wiederholt, bis ein Abbruchkriterium erfüllt ist. Der<br />

Vorteil dieser Methode ist <strong>eine</strong> nahezu unveränderte Rechenzeit gegenüber dem festen<br />

Indexieren, aber <strong>eine</strong> wesentlich genauere Approximation der Geometrien, was<br />

den Rechenaufwand für die nachfolgenden Methoden verringert.<br />

Mögliche Abbruchkriterien des Zerlegungsprozesses sind beispielsweise die Grösse<br />

der Kacheln oder <strong>eine</strong> maximale Anzahl von Kacheln, die für die Überdeckung <strong>eine</strong>r<br />

Geometrie verwendet werden.<br />

Für die Indexerstellung und Indexverwaltung bietet Oracle 8i-Spatial die üblichen<br />

SQL-Kommandos an. Der Typ des räumlichen Index ist MDSYS.SPATIAL INDEX. Das<br />

Anlegen <strong>eine</strong>s räumlichen Index erfolgt wie in Abbildung 18. Die zu übergebenden<br />

Parameter bestimmen die Größe der bei der Indexierung erzeugten Kacheln und die<br />

Art der Indexierung. Entscheidend hierfür sind die Werte der Parameter SDO LEVEL<br />

20


1. Teilung<br />

2. Teilung<br />

3. Teilung<br />

4. Teilung<br />

Abbildung 17: Variable Kachelgröße bei hybrider Indexierung<br />

CREATE INDEX idx country shape ON country(shape)<br />

INDEXTYPE IS mdsys.spatial index PARAMETERS (’sdo level=6, sdo numtiles=25’);<br />

Abbildung 18: Anlegen <strong>eine</strong>s räumlichen Index<br />

für die Anzahl der Teilungen beim fixed indexing und SDO NUMTILES für die Anzahl<br />

der Kacheln pro Geometrie bei der hybriden Indexierung.<br />

Für die Bestimmung dieser Werte bietet Oracle 8i Spatial einige Hilfsmethoden an,<br />

die in [Ora99b] genauer beschrieben sind. Hier <strong>wird</strong> als ein Beispiel die Methode<br />

SDO TUNE.ESTIMATE TILING LEVEL vorgestellt:<br />

SDO TUNE.ESTIMATE TILING LEVEL(, ,<br />

, )<br />

Diese Methode schätzt <strong>eine</strong>n Wert für SDO LEVEL, der bei der Erstellung <strong>eine</strong>s räumlichen<br />

Index auf der angegebenen Spalte der genannten <strong>Tabelle</strong> benutzt werden kann.<br />

Der dritte Parameter gibt die maximale Anzahl an Kacheln an, die bei der Indexerzeugung<br />

gebildet werden dürfen, die Schätzart bestimmt das der Schätzung zugrunde<br />

liegende Modell. Es kann die Kachelungstiefe dabei entweder basierend auf<br />

der Layer-Grösse, der Grösse des tatsächlich räumlich belegten Bereiches oder der<br />

durchschnittlichen Grösse <strong>eine</strong>s räumlichen Objekts geschätzt werden. Der durch<br />

diese Methode ermittelte Wert für die Kachelungstiefe ist allerdings nur ein Schätzwert<br />

und sollte in der Praxis als Ausgangspunkt dienen, um <strong>eine</strong>n endgültigen Wert<br />

zu bestimmen, der leicht von diesem Wert abweichen kann.<br />

In der neuesten Version (Oracle 8.1.6) werden die Indexinformationen automatisch<br />

in globale Indextabellen eingetragen. Auf diese Indextabellen erhält der Benutzer<br />

mithilfe der Sichten USER SDO INDEX METADATA, ALL SDO INDEX METADATA und<br />

DBA SDO INDEX METADATA lesenden Zugriff. Diese Sichten haben alle den gleichen<br />

Aufbau und unterscheiden sich je nach Nutzerzugriffsberechtigung lediglich in der<br />

Anzahl der zur Verfügung gestellten Informationen. Für <strong>jede</strong>n Index findet man hier<br />

Informationen wie Name der <strong>Tabelle</strong> mit Indexinformationen, Kachelungstiefe des<br />

Index, Speicherparameter und den Namen der indexierten Spalte.<br />

Jede der räumlichen Indextabellen besitzt wiederum die Spalten SDO CODE (Kodierung<br />

<strong>eine</strong>r Kachel), SDO ROWID (ROWID des die Kachel schneidenden Objekts in der<br />

Geometrietabelle), SDO STATUS (gibt an, ob die Kachel im Inneren oder auf dem<br />

21


Rand der Geometrie liegt) sowie SDO GROUPCODE (Verf<strong>eine</strong>rung der Kodierung für<br />

hybride Indexe). Details können in [Ora99f] nachgelesen werden. In früheren Oracle-<br />

Versionen waren diese Informationen nicht für den Benutzer zugänglich.<br />

4.1.4 Operationen von Oracle 8i Spatial<br />

In diesem Unterabschnitt werden kurz die von Spatial zur Verfügung gestellten<br />

räumlichen Operatoren und Funktionen vorgestellt.<br />

Geometrische Funktionen des objektrelationalen Modells<br />

Die <strong>geometrische</strong>n Funktionen bilden den Kern der von Spatial für die Verwaltung<br />

<strong>geometrische</strong>r Daten zur Verfügung gestellten Methoden. Im Einzelnen sind dies:<br />

SDO GEOM.SDO AREA(, )<br />

Berechnet die Fläche <strong>eine</strong>r zweidimensionalen Geometrie. Dabei bestimmt Geometrie<br />

das zu untersuchende Objekt vom Typ MDSYS.SDO GEOMETRY und Dimfeld das<br />

zugehörige Array mit den Dimensionsinformationen. Dieses <strong>wird</strong> üblicherweise aus<br />

der <strong>Tabelle</strong> SDO GEOM METADATA ausgelesen.<br />

SDO GEOM.SDO LENGTH(, )<br />

Berechnet die Länge bzw. den Umfang <strong>eine</strong>r Geometrie. Die Parameter entsprechen<br />

denen der Methode SDO GEOM.SDO AREA()<br />

SDO GEOM.RELATE(, , , , )<br />

Untersucht die zwei gegebenen Geometrien mit ihren Dimfeldern, um ihre räumliche<br />

Beziehung zueinander zu bestimmen. Mithilfe der Maske können dieser Methode<br />

verschiedene räumliche Beziehungen übergeben werden, die getestet werden sollen.<br />

Möglich sind ANYINTERACT, CONTAINS, COVEREDBY, COVERS, DISJOINT, EQUAL, IN-<br />

SIDE, OVERLAPBDYDISJOINT 2 ,OVERLAPBDYINTERSECTund TOUCH.<br />

SDO GEOM.SDO BUFFER(, , )<br />

Liefert ein Polygon vom Typ MDSYS.SDO GEOMETRY zurück, das aus der übergebenen<br />

Geometrie zuzüglich dem übergebenen Abstand darum berechnet <strong>wird</strong>.<br />

SDO GEOM.SDO CENTROID(, )<br />

Berechnet den Schwerpunkt des übergebenen Polygons; für alle anderen Geometriearten<br />

<strong>wird</strong> NULL zurückgegeben.<br />

SDO GEOM.SDO CONVEXHULL(, )<br />

Gibt ein Polygon als Geometrieobjekt zurück, das die konvexe Hülle der übergebenen<br />

Geometrie beschreibt, d. h. das kleinste einfache Polygon, das die Geometrie enthält.<br />

SDO GEOM.SDO POLY DIFFERENCE(, , , )<br />

Berechnet die Differenz (A\B) derübergebenen Polygone und liefert das Ergebnis<br />

dieser Differenzbildung zurück (vom Typ MDSYS.SDO GEOMETRY).<br />

2 Es liegt kein Druckfehler vor: die Abkürzung steht für overlapping-and-boundary-disjoint,<br />

d. h. überlappend ohne Schnitt der Ränder<br />

22


SDO GEOM.SDO POLY INTERSECTION(, , , )<br />

Berechnet den Durchschnitt zweier Polygone und gibt diesen zurück.<br />

SDO GEOM.SDO POLY UNION(, , , )<br />

Berechnet die Vereinigung zweier Polygone und gibt diese zurück.<br />

SDO GEOM.SDO POLY XOR(, , , )<br />

Berechnet die symmetrische Differenz zweier Polygone und gibt diese zurück.<br />

SDO GEOM.SDO DIFFERENCE(, , , )<br />

Neuere Version von SDO POLY DIFFERENCE für allgem<strong>eine</strong> räumliche Objekte.<br />

SDO GEOM.SDO INTERSECTION(, , , )<br />

Neuere Version von SDO POLY INTERSECTION für allgem<strong>eine</strong> räumliche Objekte.<br />

SDO GEOM.SDO XOR(, , , )<br />

Neuere Version von SDO POLY XOR für allgem<strong>eine</strong> räumliche Objekte.<br />

SDO GEOM.SDO UNION(, , , )<br />

Neuere Version von SDO POLY UNION für allgem<strong>eine</strong> räumliche Objekte.<br />

SDO GEOM.SDO DISTANCE(, , , )<br />

Berechnet den kürzesten Abstand zweier allgem<strong>eine</strong>r Geometrien. Der kürzeste Abstand<br />

ist dabei das Minimum über alle AbständevonjezweiPunktenaufdemRand<br />

der beiden Geometrien.<br />

SDO GEOM.SDO POINTONSURFACE(, )<br />

Berechnet ein punktförmiges Geometrieobjekt, das garantiert auf der Oberfläche der<br />

übergebenen Geometrie liegt.<br />

SDO GEOM.VALIDATE GEOMETRY (, )<br />

Überprüft die Gültigkeit der übergebenen Geometrie durch Vergleich mit der Typdefinition.<br />

Rückgabewert ist entweder true, falls die Geometrie ihrer Definition entspricht,<br />

false, falls die Geometrie fehlerbehaftet ist, Spatial den Fehler aber nicht<br />

bestimmen kann oder <strong>eine</strong> Fehlernummer, falls Spatial den Fehlertyp erkennt.<br />

SDO GEOM.VALIDATE LAYER(, , ,<br />

)<br />

Überprüft alle Geometrien <strong>eine</strong>r <strong>Tabelle</strong> mit der Spalte vom Typ MDSYS.SDO GEOME-<br />

TRY und schreibt das Ergebnis dieser Überprüfung in die Ergebnistabelle. Die Ausgangstabelle<br />

muss die angegebene Primärschlüsselspalte besitzen.<br />

SDO GEOM.WITHIN DISTANCE(, , , , )<br />

Überprüft, ob zwei Geometrien innerhalb <strong>eine</strong>s bestimmten Abstandes voneinander<br />

liegen und liefert im positiven Fall true zurück. Ist der Abstand der Geometrien<br />

größer als angegeben, ist der Rückgabewert false.<br />

Weitere Details und ausführlichere Beschreibungen zu allen Funktionen findet man<br />

in [Ora99b].<br />

23


Räumliche Operatoren<br />

Räumliche Operatoren unterscheiden sich von den räumlichen Funktionen durch die<br />

Art ihrer Rückgabewerte. Sie liefern im Gegensatz zu den differenzierten Werten der<br />

Funktionen lediglich true oder false zurück. Sie können daher in where-Klauseln <strong>eine</strong>s<br />

select-Statements als Filter eingesetzt werden, um die Anzahl der aufwendigeren<br />

Funktionsaufrufe zu reduzieren. In Oracle 8i-Spatial existieren vier räumliche Operatoren:<br />

SDO FILTER(, , )<br />

Dieser Operator <strong>wird</strong> eingesetzt, um <strong>eine</strong> Kandidatenmenge von räumlichen Objekten<br />

für weitere Untersuchungen zu identifizieren. Basierend auf dem räumlichen<br />

Index überprüft dieser Operator, ob die übergebenen Geometrien gemeinsame Kacheln<br />

besitzen. Ist dies der Fall, so <strong>wird</strong> true zurückgeliefert, andernfalls false.<br />

SDO RELATE(, , )<br />

Mit diesem Operator <strong>wird</strong> getestet, ob die übergebenen Geometrie-Objekte in <strong>eine</strong>r<br />

bestimmten räumlichen Beziehung zueinander stehen. Die zu untersuchende Beziehung<br />

<strong>wird</strong> als Parameter angegeben. Beziehungen, die überprüft werden können,<br />

entsprechen denen der Funktion SDO GEOM.RELATE(). Dieser Operator liefert true<br />

zurück, falls die angegebene Beziehung zwischen den Objekten besteht, andernfalls<br />

false. Er bestimmt im Gegensatz zu SDO FILTER() kein approximiertes, sondern das<br />

exakte Ergebnis.<br />

SDO WITHIN DISTANCE(., , )<br />

Dieser Operator überprüft, ob der Abstand zweier Objekte kl<strong>eine</strong>r als ein vorgegebener<br />

Wert ist. Die erste Geometrie muss aus <strong>eine</strong>r räumlich indexierten <strong>Tabelle</strong><br />

stammen, die zweite kann ein beliebiges Objekt vom Typ MDSYS.SDO GEOMETRY<br />

sein.IstderAbstandkl<strong>eine</strong>ralsdervorgegebeneWert,soistderRückgabewert true,<br />

andernfalls false.<br />

SDO NN(., , )<br />

Berechnet die n nächsten Nachbarn von aus der als erstes Argument<br />

angegebenen <strong>Tabelle</strong>nspalte. Das erste Argument muss <strong>eine</strong> <strong>Tabelle</strong>nspalte vom Typ<br />

MDSYS.SDO GEOMETRY sein, das zweite <strong>eine</strong> feste Geometrie. Der Operator kann<br />

nur in der where-Klausel <strong>eine</strong>r Anfrage verwendet werden und mit = ’TRUE’ abgefragt<br />

werden. Der Parameter sdo num res spezifiziert, wieviele nächste Nachbarn<br />

gefunden werden sollen.<br />

DetailszuallenOperatoreninsbesondere<strong>eine</strong>ausführliche Beschreibung der Parameter<br />

findet man in [Ora99b].<br />

Beispiele für die Verwendung der Funktionen und Operatoren in Anfragen:<br />

1. Gib alle Länder mit ihrem Namen und ihrer Fläche aus:<br />

SELECT c.name, SDO GEOM.SDO AREA(c.shape, m.diminfo) as flaeche<br />

FROM country c, user sdo geom metadata m<br />

WHERE m.table name = ’COUNTRY’ AND m.column name = ’SHAPE’;<br />

24


2. Vereinige die BRD und die DDR:<br />

INSERT INTO country VALUES (’Deutschland’,MDSYS.SDO GEOMETRY(<br />

SELECT SDO GEOM.SDO UNION(c1.shape,m.diminfo,c2.shape,m.diminfo)<br />

FROM country c1, user sdo geom metadata m, country c2<br />

WHERE m.table name = ’COUNTRY’ AND m.column name = ’SHAPE’<br />

AND c1.name = ’BRD’ AND c2.name = ’DDR’));<br />

3. Welche Länder mit K grenzen an Länder mit R ?<br />

SELECT c.name, d.name<br />

FROM country c, country d<br />

WHERE SDO RELATE(c.shape, d.shape, ’mask=TOUCHOVERLAPBDYINTERSECT,<br />

querytype=JOIN’) = ’TRUE’<br />

AND c.name like ’K%’ AND d.name like ’R%’;<br />

4. Ermittle die drei Hannover am nächsten liegenden Länder (ausser Deutschland):<br />

SELECT c.name<br />

FROM country c<br />

WHERE SDO NN(c.shape,mdsys.sdo geometry(2001, NULL,<br />

mdsys.sdo point type(hannover x,hannover y,NULL), NULL, NULL),<br />

’sdo num res=4’) = ’TRUE’<br />

AND c.name not like ’Deutschland’;<br />

4.1.5 Anfrageoptimierung<br />

In der einschlägigen Dokumentation finden sich k<strong>eine</strong> Hinweise, dass spezielle Statistiken<br />

sowie Selektivitäts- und Kostenschätzungen verwendet werden. Tests haben<br />

diese Vermutung erhärtet, da der Optimierer dazu neigt, den räumlichen Index nur<br />

bei sehr kl<strong>eine</strong>n Selektivitäten zu verwenden.<br />

4.2 Benutzerdefiniertes Data Cartridge für räumliche Daten<br />

In diesem Abschnitt <strong>wird</strong> das Ergebnis <strong>eine</strong>r Studienarbeit ([Klo99]) vorgestellt. Es<br />

wurden nur Teile <strong>eine</strong>s Data Cartridge implementiert, da das Ziel der Studienarbeit<br />

die Implementierung <strong>eine</strong>s speziellen räumlichen Index (R ∗ -Baum) war. Es werden<br />

daher k<strong>eine</strong> speziellen räumlichen Funktionen oder Operatoren (außer den direkt<br />

index-unterstützten) angeboten. Außerdem ist <strong>eine</strong> Statistikberechnung sowie Selektivitäts-<br />

und Kostenschätzung noch nicht implementiert.<br />

4.2.1 Objekttypen für räumliche Daten<br />

Es werden Objekttypen für zweidimensionale Punkte und Rechtecke deklariert. Die<br />

Definition der Typrümpfe (create type body) ist hier nicht abgedruckt. Sie steht online<br />

zur Verfügung. Der Objekttyp point dient lediglich als Hilfstyp für die beiden Eckpunkte<br />

<strong>eine</strong>s Rechtecks. Er stellt daher auch nur die üblichen get- und set-Methoden<br />

zur Verfügung. Der Objekttyp Rect hat zwei Attribute zur Aufnahme des linken unterern<br />

bzw. rechten oberen Endpunkts. Es werden Methoden zur Berechnung von<br />

räumlichen Beziehungen zwischen zwei Rechtecken sowie einige zur Berechnung erforderlicher<br />

Eigenschaften <strong>eine</strong>s Rechtecks zur Verfügung gestellt. Hierbei können<br />

25

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!