of 37/37
Realisierung eines numerisch robusten Data Cartridge f¨ ur r¨ aumliche Daten f¨ ur Oracle 9i auf Basis der ROSE-Algebra Studienarbeit von Nora Ripperda Betreut von Prof. Dr. Udo Lipeck Dipl. Math. Carsten Kleiner 11. November 2002

Realisierung eines numerisch robusten Data Cartridge f ur ... · Realisierung eines numerisch robusten Data Cartridge f ur r aumlic he Daten f ur Oracle 9i auf Basis der ROSE-Algebra

  • View
    215

  • Download
    0

Embed Size (px)

Text of Realisierung eines numerisch robusten Data Cartridge f ur ... · Realisierung eines numerisch...

  • Realisierung eines numerisch robusten Data

    Cartridge für räumliche Daten für Oracle 9i auf

    Basis der ROSE-Algebra

    Studienarbeit vonNora RipperdaBetreut von

    Prof. Dr. Udo LipeckDipl. Math. Carsten Kleiner

    11. November 2002

  • Inhaltsverzeichnis

    1 Einleitung 3

    2 Räumlichen Datentypen 5

    2.1 Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2 Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    3 Realm-basierte Modellierung räumlicher Daten 6

    3.1 Robuste geometrische Primitive . . . . . . . . . . . . . . . . . . . 73.2 ROSE Algebra Operationen . . . . . . . . . . . . . . . . . . . . . 83.3 Einfügen in den Realm . . . . . . . . . . . . . . . . . . . . . . . . 93.4 Dual Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    4 Einfügen der Daten in die Datenbank im Dual-Grid-Format 12

    4.1 Das Dual-Grid-Datenbankformat . . . . . . . . . . . . . . . . . . 124.2 Die Hilfsklasse BigFraction . . . . . . . . . . . . . . . . . . . . . . 144.3 Die räumlichen Objekte . . . . . . . . . . . . . . . . . . . . . . . 144.4 Transformation in die Dual-Grid-Darstellung . . . . . . . . . . . . 154.5 Ein Beispiel zum Einfügen in das Dual Grid . . . . . . . . . . . . 18

    5 Räumliche Operationen 23

    5.1 Schnitt von Segmenten . . . . . . . . . . . . . . . . . . . . . . . . 245.2 Punkte auf Lines-Objekten . . . . . . . . . . . . . . . . . . . . . . 255.3 Gemeinsame Segmente . . . . . . . . . . . . . . . . . . . . . . . . 26

    6 Tests: Vergleich mit Oracle Spatial 28

    6.1 Test1: Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . 286.2 Test2: On . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296.3 Hannover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306.4 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    7 Ausblick 31

    1

  • 8 Anhang zur Studienarbeit 33

    8.1 Änderungen am Programm . . . . . . . . . . . . . . . . . . . . . . 338.1.1 Änderung des Programmablaufs . . . . . . . . . . . . . . . 338.1.2 Redundante Speicherung von Oracle Spatial Daten . . . . 34

    8.2 Grösse der Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . 358.3 Testanfragen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    8.3.1 Punkte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358.3.2 Gemeinsame Segmente . . . . . . . . . . . . . . . . . . . . 368.3.3 Schnittpunkte . . . . . . . . . . . . . . . . . . . . . . . . . 36

    8.4 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    2

  • Kapitel 1

    Einleitung

    Diese Studienarbeit beschäftigt sich mit einem neuen Ansatz zur Implementie-rung räumlicher Datenbanken. Sie bezieht sich auf die Arbeit ’Dual Grid: A NewApproach for Robust Spatial Algebra Implemantation’ von Jose Antonio CoteloLema und Ralf Hartmut Güting von der Fernuniversität Hagen [LG00].

    Es handelt sich um einen neuen Ansatz, räumliche Daten so zu speichern,dass geometrische Operationen numerisch robust implementiert werden können.D.h. das bei geometrischen Operationen keine Rundungsfehler auftreten können.Und deshalb keine topologischen Inkonsistenzen auftreten.

    Dieses Verfahren baut auf dem Realm-basierten Ansatz zur Implementierungräumlicher Datenbanken auf[Sch97]. Hier wird ein Gitter als Grundmenge füralle räumlichen Objekte hergenommen. Auf diesem Gitter wird eine Ganzzahl-Arithmetik definiert. Und jeder Schnittpunkt zweier Geraden wird wieder aufeinen Gitterpunkt geschoben.

    Der Dual-Grid-Ansatz arbeitet mit einer Bruch-Arithmetik und stellt gewisseForderungen an die Koordinaten der Punkte und die Steigung der Geraden. Somitstellt man sicher, dass alle Schnittpunkte wieder auf dem Gitter liegen.

    Räumliche Datenbanken stellen eine Alternative zu Geoinformationssystemendar. So werden sie z.B. zum Speichern von geografischen Daten gebraucht. Eskönnen verschiedenen Informationen wie physische oder politische Daten gepei-chert werden. Daraus können dann mittels Verschneidungen genaue Informatio-nen über einen Ort gewonnen werden.

    Bei räumlichen Datenbanken gibt es oft Anfragen, die z.B. nach Schnitten vonLinien fragen. Hier tritt dann schnell das Problem der Rechenungenauigkeit derRechner auf. Aufgrund von Rundungsfehlern können in Anfrageergebnissen In-konsistenzen auftreten. Es kann also passieren, dass der Schnittpunkt der StreckenS1 und S2 nicht auf S1 oder S2 liegt. Um diesem Problem aus dem Weg zu gehen,arbeitet der Dual-Grid-Anzatz mit großen Bruchzahlen.

    In dieser Arbeit soll zuerst einmal die praktische Machbarkeit dieses neu-en Ansatzes getestet werden. Folgende Fragen sollen geklärt werden: Stellen dieAnforderungen an Koordinaten und an die Steigung der Geraden eine große Ein-

    3

  • schränkung dar, gibt es Elemente, die sich nicht darstellen lassen? Ist es möglich,mit der Arithmetik für große Brüche in angemessener Zeit zu rechnen?

    Bei den verwendeten Daten handelt es sich um die ATKIS-Daten der StadtHannover.

    In dieser Arbeit wird zunächst der Verwendungszweck räumlicher Daten kurzerläutert. Im dritten Kapitel wird dann die Realm-basierte Methode der Spei-cherung von räumlichen Daten erklärt. Diese wird dann zur Dual-Grid-Methodeabgewandelt.

    Das vierte Kapitel beschreibt den Aufbau des Datenbankformats. Im zwei-ten Teil ist die Vorgehensweise der Umwandlung der Originaldaten in das Dual-Grid-Format beschrieben. Anhand eines Beispiels wird das Verfahren noch einmaldeutlich gemacht.

    Im fünften Kapitel wird gezeigt, wie sich eineige räumliche Operatoren aufdem Dual Grid implementieren lassen. Die Laufzeiten dieser Operationen undder Umwandlung wird im sechsten Kapitel beschrieben.

    Im letzten Kapitel wird ein Ausblick auf mögliche Erweiterungen und Verbes-serungen des Programms gegeben.

    4

  • Kapitel 2

    Räumlichen Datentypen

    Mit räumliche Daten sind in diesem Fall zweidimensionale Daten gemeint, wieman sie z.B. auf Karten findet. Außerdem werden hier erst einmal nur Punkteund Strecken behandelt. Das Programm kann aber auf Flächen erweitert werden,da diese im Dual-Grid-Ansatz vorgesehen sind.

    2.1 Points

    Um auf einer Karte Städte oder bei größerem Maßstab öffentliche Gebäude oderStraßenlaternen darzustellen, wird eine Datentyp benötigt, der Punkte darstellt.Der hier verwendete Datentyp Points kann einen oder mehrere Punkte darstellen.Es kann also sowohl das Rathaus einer Stadt dargestellt werden, als auch einObjekt, das alle Straßenlaternen zusammenfaßt. Da in Points auch noch eineZusatzinformation gespeichert werden kann, besteht sogar die Möglichkeit, dieStraßenlaternen, die nachts ausgehen von denen die weiter leuchten zu trennenund diese Information zusätzlich zu speichern.

    2.2 Lines

    Neben den Objekten, die sich als Punkt darstellen lassen gibt es auch Straßen,Flüsse oder Bahnschienen, die durch Linien oder Linienzüge dargestellt werdenkönnen. Abhängig von der Form des Objektes kann eine gerade Linie, ein zusam-menhängender Linienzug oder aber auch nicht zusammenhängende Linienzügegewählt werden. D.h. es bestehen wieder die Möglichkeiten, ein einzelnes StückStraße als Objekt darzustellen oder aber alle Gewässer eines Gebietes zusammen-zufassen.

    5

  • Kapitel 3

    Realm-basierte Modellierung

    räumlicher Daten

    Ein Ansatz, räumliche Daten zu modellieren, stellen Realms dar [Sch97]. Dabeiwerden räumliche Objekte auf einem Gitter dargestellt. Jeder Schnittpunkt zweierGeraden wird auf einen Gitterpunkt gezogen und die Gerade erhält einen Knickan dieser Stelle. So ist sichergestellt, dass der Schnittpunkt auf der Geraden liegt.

    Der Datenraum wird als N × N - Gitter dargestellt, wobeiN = {0, 1, ..., n − 1} ⊆ N ist. Die räumlichen Objekte sind Punkte ausPN := N × N und Segmente aus SN := PN × PN . Jeder Punkt und die Endender Segmente liegen also auf dem Gitter.

    Abbildung 3.1: Segment und Punkte auf dem Realm

    Realm basierte Datentypen werden in fünf Schichten implementiert:

    1. Ganzzahl-Arithmetik

    2. robuste geometrische Primitive

    6

  • 3. Realms, realm-basierte Primitive und Strukturen

    4. räumliche Datentypen und räumliche Algebra Primitive

    5. ROSE (RObust Spatial Extension) Algebra Operationen

    Vereinfachend kann man auch die Schichten drei, vier und fünf zu einer Schichtzusammenfassen. Das soll hier passieren. Es werden nur die Schichten eins, zweiund eine erweiterte fünfte genauer betrachtet.

    Die erste Schicht bildet eine Ganzzahl-Arithmetik für Zahlen aus dem Intervall[−2n3, 2n3]. Hier sind neben den Grundrechenarten der Modulo-Operator undVergleichsoperatoren definiert.

    3.1 Robuste geometrische Primitive

    Die zweite Schicht ist die der robusten geometrischen Primitive. Es gibt Objektevon den Typen Punkt und Segment.

    Auf den Punkten und Segmenten lassen sich folgende Operationen definieren:

    • equal: Zwei Segmente heißen gleich, wenn sie in beiden Endpunkten über-einstimmen.

    • meet: Die zwei Segmente haben genau einen gemeinsamen Endpunkt.

    • overlap: Zwei Segmente sind kollinear und haben ein gemeinsames Stück.

    • aligned: Zwei Segmente sind kollinear, haben aber keinen gemeinsamen Ab-schnitt.

    • parallel: Zwei Segmente haben die gleiche Steigung.

    • on: Ein Punkt liegt auf einem Endpunkt eines Segmentes.

    • in: Ein Punkt liegt auf dem Segment, aber nicht auf den Endpunkten.

    • touches: Ein Endpunkt des ersten Segments liegt auf dem zweiten Segment;die Segmente sind nicht kollinear (sonst overlap).

    • touch: Dies ist erfüllt, wenn Segment 1 touches Segment 2 oder Segment 2touches Segment 1.

    • intersect: Zwei Segmente haben einen gemeinsamen Punkt, aber meet undtouch sind nicht erfüllt.

    • disjoint: Für zwei Segmente gilt weder equal, meet, overlap, touch nochintersect.

    7

  • • intersection: Berechnet den Schnittpunkt zweier Segmente und rundet dasErgebnis auf den nächsten Punkt.

    In der dritten und vierten Schicht werden die räumlichen Datentypen points,lines und regions erst auf Realms basierend und dann allgemein definiert.

    3.2 ROSE Algebra Operationen

    In der fünften Schicht werden auf den Datentypen points, lines und regionsROSE Algebra Operationen definiert. Es gibt vier Arten von Operationen:

    1. Räumliche Prädikate, die die topologischen Beziehungen zwischen den Ob-jekten beschreiben:

    • =• 6=• inside• edge inside• vertex inside• area disjoint• edge disjoint• disjoint: Prüft, ob zwei Objekte disjunkt sind.• intersects: Prüft, ob zwei Segmente sich schneiden.• meets• adjacent• encloses: Ist true, wenn Regions-Objekt 1 innerhalb eines Lochs von

    Regions-Objekt 2 liegt.

    • on border of: Prüft, ob alle Punkte eines Point-Objekts auf einem Regions-Objekt liegen.

    • border in common: Ist true, wenn zwei Objekte mindestens ein gemein-sames Randsegment besitzen.

    2. Räumliche Operationen, deren Ergebnisse wieder räumliche Datentypensind:

    • intersection: Liefert den Schnitt zweier Objekte.• plus: Bildet die Vereinigung von zwei Objekten.• minus: Liefert das erste Objekt ohne die Elemente des zweiten.

    8

  • • common border: Erzeugt ein neues Objekt, welches aus den gemeinsa-men Randelementen der übergebenen Objekte besteht.

    • vertices• contour: Liefert ein Lines-Objekt, das aus den äußeren Segmenten des

    Regions-Objekts besteht.

    • interior

    3. Räumliche Operatoren, die Zahlen zurückgeben

    • dist• diameter: Liefert den größten Abstand zwischen zwei Punkten eines

    Regions-Objekts.

    • length: Berechnet die Länge eines Lines-Objekts.• area: Berechnet die Fläche eines Regions-Objekts.• perimeter: Berechnet den Umfang eines Regions-Objekts.

    4. Räumliche Operatoren auf Mengen von räumlichen Objekten

    • sum• closest: Liefert die Objekte die am dichtesten an diesem Objekt liegen.• decompose• overlay• fusion

    Hier sind noch einige Laufzeiten der Operationen angegeben. Hierbei steht nfür die Größe der Eingabe und k für die Größe des Ergebnisses.

    • O(n): =, 6=, disjoint bei Points und Lines, intersects und meets bei Lines,on border of und border in common.

    • O(n·log n): disjoint, intersects, plus, minus und inside bei Regions, edge inside,vertex inside, area disjoint und edge disjoint.

    • O(n + k · log k): intersection, plus und minus bei Points und Lines, com-mon border und vertices.

    3.3 Einfügen in den Realm

    Beim Einfügen von Segmenten in den Realm kann es allerdings zu Problemenkommen. Schneiden sich zwei Segmente, so ist es möglich, dass der Schnittpunktnicht auf einem Gitterpunkt liegt. Dieser Punkt ist also im Realm-Modell nicht

    9

  • darstellbar. Um dennoch eine Darstellung der zwei Segmente zu erhalten, wer-den die Segmente jeweils in zwei Stücke zerteilt. Diese haben nicht die Form derursprünglichen Segmente sondern führen vom Anfangspunkt zum Schnittpunktund von dort zum Endpunkt. Diese Veränderung der Segmente wird Redrawinggenannt. Beim Redrawing werden Segmente zertrennt und erhalten Ecken, die sie

    Abbildung 3.2: Schnitt zweier Segmente vor und nach dem Redrawing

    ursprünglich nicht hatten. Dies kann zu topologischen Inkonsistenzen führen. Soliegen z.B. Punkte, die vorher nicht auf dem Segment lagen nach dem Redrawingauf dem Segment. Oder ein Punkt, der vor dem Redrawing unterhalb des Seg-ments lag, liegt jetzt oberhalb. Diese Problematik kann durch spezielle Verfahren

    vor dem Redrawing

    nach dem Redrawing

    Abbildung 3.3: Punkte und Segmente beim Redrawing

    behoben werden. Dabei wird eine Hülle um das Segment gelegt. Beim Redrawing

    10

  • werden Regeln befolgt, die gewährleisten, dass das Segment diese Hülle nichtverlässt.

    Diesen Aufwand umgeht der Dual-Grid-Ansatz. Er stellt einschränkende For-derungen an die Punkte und Segmente und stellt dadurch sicher, dass ein Redra-wing nicht nötig wird.

    3.4 Dual Grid

    Im Dual Grid sollen Punkte und Segmente dargestellt werden. Komplexere Geo-metrien können später aus diesen zusammengesetzt werden. Es wird ein Werte-bereich für die Punkte und einer für die Segmente definiert. Das Paar aus beidenist dann das Dual Grid. Dies ist abhängig von zwei Parametern n und m.

    Der Wertebereich für die Punkte Gp ist ein Paar aus zwei Bruchzahlen. Seg-mente aus Gs werden durch ihren Anfangs- und Endpunkt dargestellt. Diesebeiden Punkte sind aus Gp.

    Damit sichergestellt ist, dass kein Redrawing benöting wird, werden folgendeAnforderungen an Gp und Gs gestellt. Sie werden folgendermaßen definiert.

    Gp(n, m) := {(x, y) | x, y ∈ Coord(n, m)},

    wobeiCoord(n, m) := {x ∈ Q | x = num

    den, num, den ∈ Z,

    | num |< 2n, 0 < den < 2m} für n, m ∈ NGs(n, m) ist defniniert als die Menge aller Segmente S = (Pa, Pb) mit Pa, Pb ∈Gp(n, m), so dass es eine Darstellung der Geraden durch Pa und Pb von folgenderForm gibt:

    A · x + B · y = C mit A, B, C ∈ Z

    und | A |, | B |<√

    2m−1 und | C |< 2n−1

    √2m−1

    .

    Dies stellt sicher, dass jeder nichtleere Schnitt zweier Geraden aus Gs wieder eineGerade aus Gs oder ein Punkt aus Gp ist (Beweis siehe J.A. Cotelo Lema, R.H.Güting, Dual Grid: A New Approach for Robust Spatial Algebra Implemantati-on). Die Anforderungen stellen auch keine echte Einschränkung dar. Lassen sichObjekte nicht einfügen, so kann man die Parameter n und m erhöhen. In diesemFall müssen allerdings alle Objekte neu eingefügt werden.

    11

  • Kapitel 4

    Einfügen der Daten in die

    Datenbank im Dual-Grid-Format

    Das Programm liest Daten aus einer räumlichen Datenbank Daten aus. Es han-delt sich hierbei um Punkte, Linien und Flächen, die aber alle im DatentypMDSYS.SDO Geometry abgelegt sind. Zusätzlich besitzt jedes Objekt eine Ob-jektnummer. Alle Objekte mit derselben Objektnummer werden einem Objektim Dual Grid zugeordnet.

    Aus den MDSYS.SDO Geometry Daten werden der Typ und die Koordina-ten des Objekts ermittelt und in die Dual-Grid-Tabellen geschrieben. Dazu mussallerdings vorher auf Schnitte mit anderen Segmenten geprüft werden. Gegebe-nenfalls werden die räumlichen Daten angepasst. Für alle Berechnungen wird eineArithmetik für Bruchzahlen benötigt.

    4.1 Das Dual-Grid-Datenbankformat

    Zur Darstellung der räumlichen Objekte werden Oracle-Datentypen definiert[HP98]. In diesem Datenmodell gibt es die Datentypen Punkt, Segment, Pointsund Lines. Ein Punkt besteht aus vier Werten. Für die x- und die y-Koordinatewerden jeweils Zähler und Nenner gespeichert. Ein Segment wird durch die Idsder beiden Punkte dargestellt. Die Objekte Points und Lines besteht aus einerId und dem Namen des Objekts. Sie stellen eine nicht notwedigerweise zusam-menhängende Menge von Punkten bzw. Segmenten dar.

    12

  • segmentType punktType pointsType linesType

    name namexDen

    yNum

    yDen

    ididpunkt1 number(5)

    punkt2 number(5)

    xNum number

    number

    number

    number

    number(5)

    varchar2(20) varchar2(20)

    number(5)

    Abbildung 4.1: Oracle-Datentypen

    Räumliche Daten basieren auf Punkten. Diese werden in der Tabelle Punk-te mit den Attributen id und pkt (als punktTyp) gespeichert. Eine Menge vonPunkten wird durch die Relation ’gehört zu’ einem Tupel aus der Tabelle Pointszugeordnet.

    Die Linien werden in der Tabelle Segmente gespeichert. Es gibt die Attributeid und segm (als segmentTyp). Im segmentTyp stehen zwei Punkt-Ids. In derTabelle Lines gibt es das Attribut lns (als linesTyp). Dies wird durch die Relation’besteht aus’ einer Menge von Segmenten zugeordnet.

    Die Relationen ’gehört zu’ und ’besteht aus’ werden in den Tabellen pointListund segmList realisiert.

    id number(5)

    Punktegehört

    zu Points

    pts pointsTypepkt punktType

    Segmente

    id number(5) segm segmentType

    Lines

    lns linesType

    besteht aus

    0..11..*

    1..* 1

    Abbildung 4.2: ER-Diagramm

    13

  • Es gibt also die sechs Tabellen:

    • Punkte(id number, pkt punktType)

    • Points(pts pointsType)

    • PointList(punktId number, pointsId number)

    • Segmente(id number, segm segmentType)

    • Lines(lns linesType)

    • SegmList(segmId number, linesId number)

    4.2 Die Hilfsklasse BigFraction

    Der Dual-Grid-Ansatz fordert das Rechnen mit Brüchen, deren Zähler und Nen-ner sehr große Integerzahlen sind. Die Klasse BigFraction stellt eine solche Zahldar. Zähler und Nenner sind Instanzen der Klasse java.math.BigInteger, die ei-ne beliebig große ganze Zahl darstellt. BigFraction stellt neben den get- undset-Methoden die vier Grundrechenarten sowie negieren, kürzen, eine Betrags-funktion und eine Vergleichsmethode zur Verfügung.

    4.3 Die räumlichen Objekte

    Zu jedem der oben beschriebenen Oracle-Datentypen gibt es eine entsprechen-de Java-Klasse. Diese trägt den selben Namen wie der entsprechende Oracle-Datentyp. Die so erzeugten Klassen enthalten dieselben Daten, wie der Oracle-Datentyp und bieten die dazugehörenden get- und set-Methoden. Falls im Oracle-Datentyp Member-Funktionen existieren, werden auch diese an die Java-Klasseweitergegeben. Von diesen Klassen werden dann folgende Klassen abgeleitet, dieerweiterte Funktionen besitzen.

    PunktExt

    Von der Klasse Punkttype wird die Klasse PunktExt abgeleitet. Sie wird um fol-gende Methoden erweitert: Die statische Methode sort(PunktExt a, PunktExt b)sortiert zwei Punkte nach (x,y)-Sortierung und gibt sie geordnet in einem Vectorzurück. Die Methoden equals(PunktExt a) und lowerThan(PunktExt a) bieten dieMöglichkeit zum Vergleich zweier Objekte. Die Methode onSegment(BigFractionx1, BigFraction y1, BigFraction x2, BigFraction y2) prüft, ob der Punkt auf demdurch Koordinaten übergebenen Segment liegt.

    Die Klasse PunktExt bietet als einzige die Möglichkeit, eine Instanz von ihrzu erzeugen, ohne dass dieses Objekt in der Datenbank existieren muss. Dies ist

    14

  • z.B. beim Einfügen in die Datenbank wichtig. Hier wird getestet, ob der Punktauf schon vorhandenen Segmenten liegt. Diese müssen dann unterteilt werden.

    SegmentExt

    SegmentExt wird von der Klasse Segmenttype abgeleitet. Weiter stellt sie eineMethode zur Verfügung, die Anfangs- und Endpunkt zurückgibt. Zur Schnitt-punktberechnung gibt es die Methode testAlign(SegmentExt), die überprüft, obdas Segment mit dem übergebenen auf einer Gerade liegt und ein gemeinsamesStück besitzt. Die Methode getIntersection(SegmentExt) prüft die zwei Segmenteauf allgemeine Schnitte.

    PointsExt

    Die von Pointstype abgeleitete Klasse PointsExt bietet zur Zeit nur die MethodegetPunkte, die alle zu diesem Objekt gehörenden Punkte zurückgibt. Es bestehtaber die Möglichkeit, hier Operatoren, die auf Points arbeiten hinzuzufügen (s.LinesExt: Intersection).

    LinesExt

    Auch in der Klasse LinesExt besteht mit getSegmente oder getPunkt die Möglich-keit, sich alle Segmente, die zum Objekt gehören, oder deren Anfangs- und End-punkte ausgeben zulassen. Dann ist noch der Operator intersection(LinesExt)implementiert. Dieser berechnet alle Schnittpunkte zwischen diesem und demübergebenen LinesExt.

    4.4 Transformation in die Dual-Grid-Darstellung

    Für die Berechnung des neuen Datenformats und das Einfügen in die Datenbankist die Klasse Insert zuständig. Sie liest die vorhandenen Daten aus und prüft, obPunkte auf Segmenten liegen, berechnet Schnittpunkte zwischen Segmenten undtrennt dann gegebenenfalls die Segmente in Teilsegmente auf.

    Zur genauen Vorgehensweise des Programms ist hier ein Flussdiagramm derUmwandlung dargestellt.

    15

  • Schreibe alle verschiedenen

    Objectno in ON

    Lese alle Objektezu Objectno

    SDO_GTYPE= 1nach P = (x,y)

    Schreibe SDO_POINT

    Genügt P denDG−Bedingungen

    Gibt es Pschon in DB

    Lese id und fügesie zu PId

    Füge Punkt in DBein und füge id zu Pid

    UnterteileSegment

    Füge Point−Objekt einund trage dies mit allen

    Elementen aus PIdin diePointList ein

    Gibt es nochObjekte zu

    dieser Objectno

    Gibt es nochElemente in ON

    SchreibeSDO_ORDINATES

    nach (x0,y0, ... xn,yn)

    x2 = xi+1, y2 = yi+1x1 = xi, y1 = yi

    Segment von (x1,y1)nach (x2,y2)

    Füge Anfangs− undEndpunkt zu SP

    x2 = SP[j+2], y2 = SP[j+3]Setze x1 = SP[j], y1 = SP[j+1]

    Genügt dieSteigunngdem DG

    Gibt esdas Segment (x1,y1),(x2,y2)

    schon

    genügen(x1,y1) und (x2,y2) den

    DG−Bedingungenid lesen

    Segment einfügen

    Segment−Id undLines−Id in die

    SegmList eintragen

    Istj < |SP|−2

    Isti < n−2

    Gibt es nochObjekte zu

    dieser Objectno

    Gibt es nochElemente in ON

    Gibt esSchnittpunkte mit

    anderen Segmentenoder Punkten

    Liegt P auf einemSegment

    ja nein

    Fehler

    ja

    ja

    ja

    ja

    nein

    nein

    nein

    nein

    Ende

    janein

    Füge Lines−Objekt ein

    i := 0

    Fehlernein

    ja

    nein

    j := 0

    neinja

    Fehler

    nein

    ja

    i += 2

    nein

    ja

    j += 2

    ja

    nein

    ja

    Ende

    ja

    nein

    nein

    ja

    Anfangs− und Endpunkt

    und füge alleSchnittpunkte und

    zu SP hinzu

    Teile geschnittene Segmente

    Abbildung 4.3: Flussdiagramm

    16

  • Als erstes werden alle verschiedenen Objekt-Nummern gelesen. Objekte mitderselben Nummer werden im Dual Grid zu einem Objekt zusammengefasst. Zuden Objekt-Nummern werden dann alle zugehörigen Objekte gelesen.

    Anhand des SDO GTYPE wird festgestellt, ob es sich um ein Points- oderLines-Objekt handelt. Je nach Objektart werden jetzt SDO POINT oder SDO OR-DIANTES gelesen. Vor dem Einfügen der Objekte wird geprüft, ob sie den Dual-Grid-Bedingungen genügen.

    Weiterhin wird geprüft, ob die Objekte schon in der Datenbank existieren. Istdies der Fall, so wird nur die Id des Objekts zurückgegeben.

    Gibt es das Objekt noch nicht, so muss geprüft werden, ob das Einfügendie schon vorhandenen Objekte beeinflusst. Liegt ein Punkt auf einem schonvorhandenen Segment, so wird dieses in zwei Segmente unterteilt.

    Bei Segmenten gibt es zwei Möglichkeiten der Beeinflussung. Ein schon vor-handener Punkt kann auf diesem Segment liegen oder es kann eine Schnittsitua-tion mit einem anderen Segment auftreten. Im ersten Fall werden statt des einenSegments zwei eingefügt. Ein Segment vom Anfangs- zum Schnittpunkt und einsvom Schnitt- zum Endpunkt. Im zweiten Fall muss sowohl das neue als auch dasschon vorhandene Segment in mehrere geteilt werden. Hierbei ist zu beachten,dass in verschiedenen Schnittsituationen verschiedene Unterteilungen notwendigsein können.

    S1

    S2 S1

    S1S2

    S2

    Abbildung 4.4: Verschiedene Schnittsituationen

    Im kollinearen Fall darf das mittlere Segment nur einmal in der Datenbankstehen.

    Ist ein Objekt abgearbeitet, so wird geprüft, ob es zu dieser Objekt-Nummernoch weitere Objekte gibt. Gibt es welche, so werden diese nacheinander abgear-beitet. Sonst wird geprüft, ob es noch weitere Objekt-Nummern gibt. Wenn ja,dann werden diese bearbeitet, sonst ist das Einfügen beendet.

    17

  • 4.5 Ein Beispiel zum Einfügen in das Dual Grid

    Anhand des folgenden Beispiels wird die Vorgehensweise beim Einfügen von Da-ten in die Dual Grid Tabellen dargestellt. Vereinfachend wird hier das AttributObjectgeometry nur durch SDO GTYPE und SDO POINT bzw. SDO GTYPEund SDO ORDINATES dargestellt. Die anderen Daten werden nicht benötigt.Die Parameter seien n = 6 und m = 4. Folgende Daten werden als Ausgangsdatenfür das Beispiel verwendet.

    P1

    L1

    L2

    objectno objectgeometry

    L1 (2, (1, 2, 4, 5))

    L2

    1

    2

    3

    1 2 3 40

    0

    4

    5

    Abbildung 4.5: Ausgangsdaten des Beispiels

    L1 ist noch im Oracle-Spatial-Format und soll in das Dual Grid eingefügtwerden. P1 und L2 sind schon im Dual Grid Format gespeichert. Die Tabellensehen folgendermaßen aus:

    Points:

    PTS(ID, NAME)

    POINTSTYPE(1, ’P1’)

    PointList:

    PUNKTID POINTSID

    1 1

    18

  • Punkte:

    ID PKT(XNUM, XDEN, YNUM, YDEN)

    2 PUNKTTYPE(3, 1, 1, 1)3 PUNKTTYPE(4, 1, 3, 1)4 PUNKTTYPE(1, 1, 4, 1)5 PUNKTTYPE(1, 1, 5, 1)6 PUNKTTYPE(2, 1, 5, 1)1 PUNKTTYPE(2, 1, 3, 1)

    SegmList:

    SEGMID LINESID

    2 13 11 1

    Segmente:

    ID SEGM(PUNKT1, PUNKT2)

    2 SEGMENTTYPE(4, 5)3 SEGMENTTYPE(6, 3)1 SEGMENTTYPE(2, 3)

    Lines:

    LNS(ID, NAME)

    LINESTYPE(1, ’L2’)

    Als erstes werden alle Objectno aus der Tabelle gelesen. Dies liefert hier nurL1. Dann werden alle Objekte mit der Objectno L1 gelesen. Auch hier erhaltenwir nur das Tupel (L1, (2, (1, 2, 4, 5))).

    Aus diesem Tupel wird der SDO GTYPE extrahiert und mit 1 verglichen. Esgilt aber SDO GTYPE = 2, also handelt es sich um ein oder mehrere Segmente.

    Es wird nun ein Lines-Objekt in die Datenbank eingetragen. Dies bestehtvorerst nur aus einer Id, die fortlaufend vergeben wird, und einem Namen, dieserentspricht der Objectno. Eine Verbindung zu den Segmenten muss erst noch überSegmList hergestellt werden.

    Im nächsten Schritt werden die Koordinaten der einzelnen Segmente ausSDO ORDINATES gelesen. Dies sind hier (1, 2, 4, 5). Es wird also das Segmentvon (1, 2) nach (4, 5) betrachtet.

    Es muss geprüft werden, ob die Steigung des Segments den Dual-Grid-Bedingungengenügt. Dies ist der Fall, denn das Segment liegt auf der Geraden y = x+1. Dieselässt sich darstellen durch

    Ax + By = C mit A=-1, B=1 und C=1. Und es ist

    | A |=| B |= 1 <√

    24−1 und | C |< 26−1

    √24−1

    .

    19

  • Jetzt muss geprüft werden, ob das Segment andere Segmente schneidet, oder obPunkte auf ihm liegen. Dazu werden alle Punkte gelesen, die in dem von Anfangs-und Endpunkt aufgespannten Rechteck liegen. Und es werden die Segmente gele-sen, die in dieses Rechteck hineinragen. Hier im Beispiel erhalten wir alle Punkteund Segmente, die schon in der Datenbank stehen. Schnittberechnungen ergeben,dass der Punkt mit id 1 und das Segment mit id 3 das neue Segment schneiden.

    Die Segmente, die das neue Segment schneiden müssen unterteilt werden, alsowird hier das Segment mit id 3 im Schnittpunkt (3, 4) unterteilt. Dazu wird dasalte Segment aus der Datenbank entfernt und zwei neue eingefügt. Diese verlaufenvom alten Startpunkt zum Schnittpunkt bzw. vom Schnittpunkt zum Endpunkt.Dabei wird der Punkt (3, 4) eingefügt und erhält die Id 7.

    Dabei verändern sich die Tabellen Punkte, Segmente und SegmentList. Siesehen nach diesem Schritt folgendermaßen aus:

    Punkte:

    ID PKT(XNUM, XDEN, YNUM, YDEN)

    2 PUNKTTYPE(3, 1, 1, 1)3 PUNKTTYPE(4, 1, 3, 1)4 PUNKTTYPE(1, 1, 4, 1)5 PUNKTTYPE(1, 1, 5, 1)6 PUNKTTYPE(2, 1, 5, 1)7 PUNKTTYPE(3, 1, 4, 1)1 PUNKTTYPE(2, 1, 3, 1)

    Segmente:

    ID SEGM(PUNKT1, PUNKT2)

    2 SEGMENTTYPE(4, 5)5 SEGMENTTYPE(7, 3)4 SEGMENTTYPE(6, 7)1 SEGMENTTYPE(2, 3)

    SegmList:

    SEGMID LINESID

    2 15 14 11 1

    Damit auch das neue Segment in mehrere geteilt wird werden alle Schnittpunktein einem Feld gespeichert. Hier werden Anfangs-, Endpunkt, Schnittpunkte undalle Punkte, die auf dem Segment liegen gespeichert. Diese Punkte werden dann

    20

  • erst nach x-Koordinate, dann nach y-Koordinate sortiert. Hieraus können danndie neuen Segmente erstellt werden.

    Das Feld der Koordinaten sieht hier folgendermaßen aus: (1, 2, 2, 3, 3, 4, 4, 5).Es müssen also nacheinander folgende Segmente eingefügt werden: (1, 2, 2, 3),(2, 3, 3, 4) und (3, 4, 4, 5).

    Es wird jeweils geprüft, ob es dieses Segment schon in der Datenbank gibt.Dies ist bei allen drei Segmenten nicht der Fall. Also müssen alle Segmente ein-gefügt werden. Dazu wird geprüft, ob Anfangs- und Endpunkt dem Dual GridBedingungen genügen. Ist dies der Fall, so werden erst die Punkte, falls sie nochnicht existieren, eingefügt. Dann wird das Segment mit Verweisen auf die Punkt-Ids in die Datenbank eingefügt. Außerdem wird in die SegmList ein Eintrag mitder Segment-Id und Lines-Id geschrieben.

    Für das Segment (1, 2, 2, 3) wird der Punkt (1, 2) eingefügt, da er den DualGrid Bedingungen genügt und noch nicht existiert. Er erhält die Id 8. Den Punkt(2, 3) gibt es schon in der Datenbank, es wird die Id 1 gelesen. Nun wird einSegment mit den Verweisen auf die Punkte 8 und 1 in die Datenbank geschrieben.Dies Segment erhält die Id 6. Und es wird in die SegmList ein Eintrag mit Lines-IdL1 und Segment-Id 6 geschrieben. Die Segmente (2, 3, 3, 4) und (3, 4, 4, 5) werdenauf gleiche Weise bearbeitet.

    Ist dies geschehen, so sehen die Tabellen folgendermaßen aus:

    Points:

    PTS(ID, NAME)

    POINTSTYPE(1, ’P1’)

    PointList:

    PUNKTID POINTSID

    1 1

    Punkte:

    ID PKT(XNUM, XDEN, YNUM, YDEN)

    2 PUNKTTYPE(3, 1, 1, 1)3 PUNKTTYPE(4, 1, 3, 1)4 PUNKTTYPE(1, 1, 4, 1)5 PUNKTTYPE(1, 1, 5, 1)6 PUNKTTYPE(2, 1, 5, 1)7 PUNKTTYPE(3, 1, 4, 1)1 PUNKTTYPE(2, 1, 3, 1)8 PUNKTTYPE(1, 1, 2, 1)9 PUNKTTYPE(4, 1, 5, 1)

    SegmentList:

    SEGMID LINESID

    2 15 14 16 27 28 21 1

    21

  • Segmente:

    ID SEGM(PUNKT1, PUNKT2)

    2 SEGMENTTYPE(4, 5)5 SEGMENTTYPE(7, 3)4 SEGMENTTYPE(6, 7)1 SEGMENTTYPE(2, 3)6 SEGMENTTYPE(8, 1)7 SEGMENTTYPE(1, 7)8 SEGMENTTYPE(7, 9)

    Lines:

    LNS(ID, NAME)

    LINESTYPE(1, ’L2’)LINESTYPE(2, ’L1’)

    Da es keine weiteren Objekte mit Objectno L1 gibt, müssen keine weiteren Seg-mente bearbeitet werden. Jetzt wird geprüft, ob es noch weitere Objekte mitanderer Objecno gibt, die eingefügt werden sollen. Dies ist auch nicht der Fall,also ist das Einfügen beendet.

    22

  • Kapitel 5

    Räumliche Operationen

    Räumlliche Operationen erfordern für gewöhnlich einen hohen Rechenaufwand.Um zu prüfen, welche Linien sich mit welchen schneiden, muss jede Linie mitjeder auf Schnittpunkte geprüft werden. Dazu sind dann geometrische Operatio-nen notwendig. Bei den Daten im Dual Grid sind bereits alle Schnitte berechnetworden. Diese werden in der Datenstruktur festgehalten. Die einzelnen Segmentehaben keine echten Schnittpunkte mehr. Sie können sich nur in den Endpunktenberühren. Diese Eigenschaft, die beim Einfügen der Daten sichergestellt wird,

    Abbildung 5.1: Segmente treffen nur an Endpunkten aufeinander

    ermöglicht jetzt eine schnelle und einfache Ausführung der räumlichen Operatio-nen. Schnitte und ähnliches können durch Joins auf Tabellen realisiert werden.Wie diese aussehen wird im jeweiligen Abschnitt besprochen.

    23

  • 5.1 Schnitt von Segmenten

    Den Schnitt von Segmenten berechnet der Operator Intersection(Lines1, Lines2).Dieser ist in der Klasse LinesExt implementiert. Er kann aber auch als Abfragein SQLPLUS gestartet werden.

    Da alle Schnittpunkte schon beim Einfügen berechnet wurden, können sichSegmente jetzt nur noch in ihren Endpunkten schneiden. Das bedeutet für dieSchnittberechnung, dass nur noch die Punkte aus den Tabellen gelesen werdenmüssen, die Anfangs- oder Endpunkt von jeweils mindestens einem Segment ausLines1 und Lines2 sind.

    L2L1

    P1

    P2

    P3

    P4

    P5P6

    P7

    P8

    Abbildung 5.2: P2 und P3 gehören zu L1 und L2

    Im Bild sieht man, dass die Punkte P2 und P3 sowohl zum Lines-Objekt L1als auch zu L2 gehören. Die anderen Punkte gehören entweder zu L1 oder zu L2.Die gesuchte Schnittmenge besteht also aus P2 und P3.

    Durch folgende Anfrage werden die Ids der Punkte ausgegeben, die den Schnittder Lines-Objekte 1 und 2 bilden:

    select distinct l1.pkt

    from (select p.id pkt

    from punkte p, segmente s, lines l, segmList sl

    where l.lns.id = 1

    and sl.segmId = s.id

    and sl.linesId = l.lns.id

    and (s.segm.punkt1 = p.id

    or s.segm.punkt2 = p.id)) l1,

    (select p.id pkt

    from punkte p, segmente s, lines l, segmList sl

    where l.lns.id = 2

    24

  • and sl.segmId = s.id

    and sl.linesId = l.lns.id

    and (s.segm.punkt1 = p.id

    or s.segm.punkt2 = p.id)) l2

    where l1.pkt = l2.pkt;

    5.2 Punkte auf Lines-Objekten

    Der Operator on(Points, Lines) zeigt an, ob ein Points-Objekt auf einem Lines-Object liegt. Es wird die Anzahl der Punkte, die auf dem Lines-Objekt liegen,ausgegeben. Ist das Ergebnis 0, so entspricht dies einem false. Ist das Ergebnisgrößer als 0, so entspricht das einem true. Das heißt allerdings nicht, dass dasPoints-Objekt vollständig auf dem Lines-Objekt liegt.

    Um eine Aussage darüber zu bekommen, ob das Points-Objekt vollständigauf dem Lines-Objekt liegt, muss man die Anzahl der Punkte auf dem Objektmit der Gesamtanzahl der Punkte vergleichen. Dies tut die zweite SQL-Anfrage.Hier gilt jedoch, dass eine 0 true bedeutet. Dann ist die Anzahl der Punkte gleichder Anzahl der Punkte auf dem Lines-Objekt. Alle von 0 verschiedenen Zahlenbedeuten false.

    Die Frage, ob ein Punkt auf einem Lines-Objekt liegt, ist im Dual Grid gleich-bedeutend mit der Frage, ob ein Punkt Anfangs- oder Endpunkt von Segmentendes Lines-Objekts ist.

    P1

    L1

    s1

    s2

    s3

    s4

    Abbildung 5.3: P1 ist Anfangs- bzw. Endpunkt von s2 bzw. s1

    Im Bild kann man sehen, dass P1 auf L1 liegt. Es gilt P1 ist Anfangspunktvon s2 und Endpunkt von s1.

    25

  • Diese Anfrage gibt die Anzahl der Punkte von dem Points-Objekt mit id = 1aus, die auf dem Lines-Objekt mit id = 1 liegen:

    select count(punkt.i)

    from (select p.id i from punkte p, pointList pl

    where pl.pointsId = 1

    and pl.punktId = p.id) punkt,

    (select distinct p.id i

    from punkte p, segmente s, segmList sl

    where sl.linesId = 1

    and sl.segmId = s.id

    and (s.segm.punkt1 = p.id

    or s.segm.punkt2 = p.id)) segmPunkt

    where punkt.i = segmPunkt.i;

    Diese Anfrage gibt an, ob das Points-Objekt mit id = 1 auf dem Lines-Objektmit id = 1 liegt (0 = true , sonst false):

    select count(punkt.i) - count(pointList.punktid)

    from (select p.id i from punkte p, pointList pl

    where pl.pointsId = 1

    and pl.punktId = p.id) punkt,

    (select distinct p.id i

    from punkte p, segmente s, segmList sl

    where sl.linesId = 1

    and sl.segmId = s.id

    and (s.segm.punkt1 = p.id

    or s.segm.punkt2 = p.id)) segmPunkt, pointList

    where punkt.i = segmPunkt.i

    and pointList.pointsId = 1;

    5.3 Gemeinsame Segmente

    Analog zu common border für Regions kann man auch ein common segments fürLines definieren. Dieser Operator berechnet für zwei Lines-Objekte L1 und L2,welche Segmente sowohl zu L1 als auch zu L2 gehören. Die Ids dieser Segmentewerden dann ausgegeben.

    Auch diese Anfrage kann als Join über Tabellen formuliert werden. Dies liegtdaran, dass jedes Segment nur einmal in der Datenbank gespeichert ist. Die Zu-gehörigkeit zu einem Lines-Objekt wird über die Tabelle SegmList festgestellt. Eswerden also die Segmente ausgegeben, die in der SegmList sowohl einen Eintragmit sem ersten als auch mit dem zweiten Lines-Objekt haben.

    Im Bild ist zu sehen, dass s2 sowohl zu L1 als auch zu L2 gehört. DiesesSegment wird also als gemeinsames Segment ausgegeben.

    26

  • L1

    L2

    s1

    s2

    s3s4

    Segment

    s1s2s3

    s4s2

    L1L1L2L2

    Lines

    L1

    Abbildung 5.4: s2 gehört zu L1 und L2

    Diese Anfrage liefert die Ids der Segmente, die zu dem Lines-Objekt mit Id =1 und dem mit Id = 2 gehören:

    select distinct l1.sid

    from (select s.id sid

    from segmente s, segmList sl

    where sl.linesid = 1

    and sl.segmId = s.id) l1,

    (select s.id sid

    from segmente s, segmList sl

    where sl.linesid = 2

    and sl.segmId = s.id) l2

    where l1.sid = l2.sid;

    27

  • Kapitel 6

    Tests: Vergleich mit Oracle

    Spatial

    Getestet wurde das Programm mit zwei kleinen Datensätzen und dem ATKIS-Datensatz von Hannover. Bei den Tests werden jeweils erst die Daten in dieDatenbank eingefügt. Dies passiert sowohl für das Dual Grid als auch für dieOracle Spatial Daten mit einem Java-Programm. Die zu testenden Operationenwerden dann direkt mit SQL getestet. Es wird in SQLPLUS eine entsprechendeAnfrage an die Datenbank gestellt.

    6.1 Test1: Intersection

    Im ersten Test werden Segmente eingefügt und auf Schnitte geprüft. Das ersteSegment führt waagerecht von P1 = (1, 2) nach P2 = (2, 2). Es gibt noch weitere99 Segmente, die so gewählt sind, dass jedes das erste einmal schneidet undmit den anderen Segmenten nur den Anfangspunkt gemeinsam hat. Die genaueAnordnung wird im Bild deutlich.

    Abbildung 6.1: Test 1

    28

  • Die Oracle Spatial Daten weden in eine Tabelle Test1 mit den AttributenObjectno varchar2 und ObjectGeometry MDSYS.SDO Geometry. Für die Geo-metrie ist ein Spatial-Index angelegt. Es werden Werte im Bereich [0,100] miteiner Genauigkeit von 0.0001 zugelassen.

    Es ergaben sich folgende Zeiten:

    • Dual Grid:

    – Einfügen ≈ 1.400.000ms– Schnittberechnung ≈ 14ms

    • Oracle Spatial:

    – Einfügen ≈ 13.000ms– Schnittberechnung≈ 38ms

    Das Einfügen der Daten dauert im Dual Grid deutlich länger als mit OracleSpatial, aber dafür braucht die Schnittberechnung deutlich weniger Zeit.

    6.2 Test2: On

    Auf einem zweiten Datensatz wird der Operator on getestet. Bei den Daten han-delt es sich um ein Lines-Objekt und ein Points-Objekt. Im Bild sieht man die geo-metrische Anordnung. Die Punkte p1,...,p5 bilden zusammen ein Points-Objekt.

    L1p1

    p2

    p3

    p4

    p5

    Abbildung 6.2: Test 2

    Die Oracle Spatial Daten werden in die Tabelle Test2 geschrieben. Diese istwie die Tabelle aus Test1 aufgebaut und mit demselben Index versehen.

    Es ergaben sich folgende Zeiten:

    29

  • • Dual Grid:

    – Einfügen ≈ 1.500ms– On-Operator ≈ 8ms

    • Oracle Spatial:

    – Einfügen ≈ 300ms– On-Operator ≈ 14ms

    Das Einfügen der Daten dauert natürlich im Dual Grid wieder deutlich längerals bei Oracle Spatial. Aber man sieht auch hier, dass der On-Operator im DualGrid deutlich schneller ist. Hier zeigt das Dual Grid Vorteile, wenn Operatorenhäufiger aufgerufen werden.

    6.3 Hannover

    Die Zeit zum Einfügen der Hannover-Daten kann nicht vollständig gemessen wer-den, da nach einiger Zeit ein Oracle-Fehler auftritt. Bei den Testläufen wurdemaximal 20 Prozent der Daten eingefügt. Das Einfügen von 1705 Points- undLines-Objekten dauerte 5,3 Tage.

    6.4 Fazit

    Das Einfügen in die Dual Grid Datenbank dauert erheblich länger als in OracleSpatial. Dies liegt einerseits daran, dass sich Datenbankanfragen und Berech-nungen in Java immer abwechseln. Es kommt also zu einem ständigen Wechselzwischen Java und Oracle. Andererseits gibt es beim Einfügen sehr viele Schnitt-punktberechnungen, da jedes Objekt mit jedem anderen überprüft werden muss.

    Die räumlichen Operationen dagegen profitieren davon, dass die Schnitteschon beim Einfügen berechnet wurden. Sie müssen keine Schnitte mehr berech-nen, da alle Informationen schon in der Datenbank gespeichert sind. Hier zeigtsich deshalb ein deutlicher Zeitvorteil.

    30

  • Kapitel 7

    Ausblick

    Die Studienarbeit befasst sich nur mit den Grundzügen des Dual Grid-Ansatzes.Es wäre sinnvoll, das Programm um folgende Punkte zu erweitern:

    • Arbeiten mit Flächen: Flächen können durch die begrenzenden Polygonedargestellt werden. Hierbei kann noch zwischen dem äußeren Rand undLöchern unterschieden werden.

    • Neuer Oracle-Datentyp zur Darstellung der Koordinaten, damit man nichtmehr auf die Länge des Typs number beschränkt ist.

    • Erweiterung der Typen Points und Lines: Hier können weitere Felder hin-zugefügt werden, in denen zusätzliche Informationen gespeichert werdenkönnen.

    31

  • Literaturverzeichnis

    [HP98] U. Hohenstein, V. Plessre: Oracle8 – Effiziente Anwendungsentwicklungmit objektrelationalen Konzepten. dpunkt-Verlag, Heidelberg, 1998.

    [LG00] J. A. C. Lema, R. H. Güting: Dual Grid: A New Approach for RobustSpatial Algebra Implementation. Informatik-Bericht 268, Fernuni Hagen,2000.

    [Sch97] M. Schneider: Spatial Data Types for Database Systems – Finite Re-solution Geometry for Geographic Information Systems. LNCS 1288,Springer-Verlag, Berlin, 1997.

    32

  • Kapitel 8

    Anhang zur Studienarbeit

    8.1 Änderungen am Programm

    8.1.1 Änderung des Programmablaufs

    Um die Laufzeit des Programms zu verkürzen, wurde der Ablauf des Flussdia-gramms auf Seite 15 verändert. Bisher wurde direkt vor dem Einfügen der Seg-mente geprüft, ob diese den Bedingungen des Dual Grid genügen. Hierbei werdenauch Punkte überprüft, die schon aufgrund des Dual-Grid-Verfahrens den Bedin-gungen genügen müssen. Wird dieser Test nach vorne gezogen, so werden nur dieursprünglichen Segmente getestet und nicht jedes neu entstandene Teilsegment.So entfallen viele Berechnungen und das Einfügen aller Segmente dauert jetzt 22Stunden.

    33

  • Füge Anfangs− undEndpunkt zu SP

    x2 = SP[j+2], y2 = SP[j+3]Setze x1 = SP[j], y1 = SP[j+1]

    Gibt esdas Segment (x1,y1),(x2,y2)

    schon

    id lesen

    Gibt esSchnittpunkte mit

    anderen Segmentenoder Punkten

    SchreibeSDO_ORDINATES

    nach (x0,y0, ... xn,yn)

    Genügen diePunkte

    dem DG

    x2 = xi+1, y2 = yi+1x1 = xi, y1 = yi

    Segment von (x1,y1)nach (x2,y2)

    Isti < n−2

    Segment einfügen

    Segment−Id undLines−Id in die

    SegmList eintragen

    Istj < |SP|−2

    Genügt dieSteigunngdem DG

    i := 0

    nein

    j := 0

    neinja

    j += 2

    ja

    Anfangs− und Endpunkt

    und füge alleSchnittpunkte und

    zu SP hinzu

    Teile geschnittene Segmente

    ja

    nein

    Fehler

    i += 2 ja nein

    ja

    neinFehler

    nein

    Abbildung 8.1: Geändertes Flussdiagramm

    8.1.2 Redundante Speicherung von Oracle Spatial Daten

    Ein weiterer Versuch, die Laufzeit zu verkürzen, war das Mitführen von redun-danten Daten im Oracle-Spatial-Format. Die Anfragen, die beim Einfügen der

    34

  • Objekte gestellt werden, können dann auf diesen Spatial-Daten laufen. Hierbeikann man den in Oracle Spatial implementierten räumlichen Index nutzen.

    Das so modifizierte Programm hat aber leider deutlich höhere Laufzeiten, alsdas ursprüngliche (. Der Aufwand, die Spatial-Daten zu verwalten, ist gröer alsder Nutzen, der durch den räumlichen Index entsteht.

    8.2 Grösse der Tabellen

    In den Tabellen gibt es insgesamt 38 Points-Objekte und 6307 Lines-Objekte.Ausder Tabelle USER TABLES lässt sich folgender Platzbedarf für die einzelnenTabellen ablesen:

    punkte: 31287 x 30 Bytessegmente: 35581 x 19 Bytespoints: 38 x 21 Byteslines: 6307 x 23 BytespointList: 38 x 11 BytessegmList: 89380 x 12 Bytes

    hannover: 11184 x 238 Bytes

    Daraus ergibt sich ein Platzbedarf von 2,702 MB für das Dual Grid und 2,538MB für Oracle Spatial.

    8.3 Testanfragen

    8.3.1 Punkte

    In den Daten von Hannover gibt es 38 Punkte. Hierbei handelt es sich um Bahn-hofsanlagen, Gemeindenamen und Wohnplatznamen. Keine zwei dieser Punkteliegen aufeinander und es liegt auch kein Punkt auf einem Lines-Objekt. Deshalbkönnen auch keine Abfragen zum Vergleich von Oracle Spatial und Dual Gridgestartet werden.

    Die Anfrage, ob es Punkte gibt, die auf Segmenten liegen, dauerte für dieBahnhofsanlagen im Dual Grid 3,13 s und in der ursprünglichen Tabelle mitOracle Spatial Daten 3 min 29,06 s. Hierbei besteht im DualGrid allerdings derVorteil, dass die Points- und Lines-Objekte schon getrennt gespeichert sind. Diesist in der Hannover-Tabelle nicht der Fall. Bei den Gemeindenamen waren dieZeiten: 3,37 s und 41,99 s. Und bei Wohnplatznamen: 3,96 s und 34 min 41,21 s.

    35

  • 8.3.2 Gemeinsame Segmente

    Diese Anfrage berechnet die Anzahl der gemeinsamen Segmente (bzw. die Anzahlder Lines-Objekte, die gemeinsame Segmente besitzen) von zwei Objektarten.Auch hier gibt es wieder Unterschiede zu Oracle Spatial. Denn dort gibt es nurdie Möglichkeit, zu prüfen, ob ein ganzes Lines-Objekt auf einem anderen liegt.Die Ergebnismenge ist also kleiner als die im Dual Grid.

    Bahnhofsanlage-3501 : Bahnstrecke-3205: 536/45 (0.39 s) 26 (19.11 s)Fahrbahn-3106 : Brücke-3514: 0/0 (2.45 s) 0 (52.07 s)Grünanlage-2227 : Gartenland-4103: 163/25 (1.45 s) 0 (29.47 s)Brücke-3514 : Bahnstrecke-3205: 23/9 (1.42 s) 0 (23.09 s)Fläche-4199 : Gartenland-4103: 182/34 (0.35 s) 0 (21.22 s)Gehölz-4108 : Graben-5103: 0/0 (0.26 s) 0 ( 2.22 s)

    8.3.3 Schnittpunkte

    Diese Anfrage berechnet die Anzahl aller Schnittpunkte zwischen zwei verschie-denen Objektarten. Hier treten bei Oracle aufgrund der in der Studienarbeitbeschriebenen Ungenauigkeiten geringere Zahlen als im Dual Grid auf. Die Lauf-zeiten werden in der folgenden Tabelle angegeben:

    Bahnstrecke-3205 : Fahrbahn-3106: 34(5,07 s) 34(23,87 s)Brücke-3514 : Fahrbahn-3106: 53(1,03 s) 49(31,53 s)Fläche-4199 : Gartenland-4103: 211(0,95 s) 62(11,95 s)Wald-4107 : Weg-3102: 263(0,79 s) 116(10,52 s)Ackerland-4101 : Bahnstrecke-3205: 0(0,84 s) 0(2,75 s)

    8.4 Fazit

    Das Einfügen der Daten braucht duch viele Schnittberechnungen viel Zeit. DasEinfügen der Hannover-Tabelle mit 6345 Objekten dauert ca. 22 Stunden. Vorteilezeigt das Dual Grid bei Anfragen. Diese sind deutlich schneller als die Anfragenauf Oracle Spatial-Daten. Stellt man viele Anfragen, so wird der Aufwand beimEinfügen schnell wieder ausgeglichen.

    Im Platzbedarf unterscheiden sich die beiden Modelle kaum. Die Abweichungbeträgt nur 0,164 MB.

    36