Upload
vutram
View
215
Download
0
Embed Size (px)
Citation preview
Realisierung eines numerisch robusten Data
Cartridge fur raumliche Daten fur 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 Raumlichen Datentypen 5
2.1 Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2 Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Realm-basierte Modellierung raumlicher Daten 6
3.1 Robuste geometrische Primitive . . . . . . . . . . . . . . . . . . . 73.2 ROSE Algebra Operationen . . . . . . . . . . . . . . . . . . . . . 83.3 Einfugen in den Realm . . . . . . . . . . . . . . . . . . . . . . . . 93.4 Dual Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4 Einfugen der Daten in die Datenbank im Dual-Grid-Format 12
4.1 Das Dual-Grid-Datenbankformat . . . . . . . . . . . . . . . . . . 124.2 Die Hilfsklasse BigFraction . . . . . . . . . . . . . . . . . . . . . . 144.3 Die raumlichen Objekte . . . . . . . . . . . . . . . . . . . . . . . 144.4 Transformation in die Dual-Grid-Darstellung . . . . . . . . . . . . 154.5 Ein Beispiel zum Einfugen in das Dual Grid . . . . . . . . . . . . 18
5 Raumliche 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 Anderungen am Programm . . . . . . . . . . . . . . . . . . . . . . 338.1.1 Anderung des Programmablaufs . . . . . . . . . . . . . . . 338.1.2 Redundante Speicherung von Oracle Spatial Daten . . . . 34
8.2 Grosse 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 beschaftigt sich mit einem neuen Ansatz zur Implementie-rung raumlicher Datenbanken. Sie bezieht sich auf die Arbeit ’Dual Grid: A NewApproach for Robust Spatial Algebra Implemantation’ von Jose Antonio CoteloLema und Ralf Hartmut Guting von der Fernuniversitat Hagen [LG00].
Es handelt sich um einen neuen Ansatz, raumliche Daten so zu speichern,dass geometrische Operationen numerisch robust implementiert werden konnen.D.h. das bei geometrischen Operationen keine Rundungsfehler auftreten konnen.Und deshalb keine topologischen Inkonsistenzen auftreten.
Dieses Verfahren baut auf dem Realm-basierten Ansatz zur Implementierungraumlicher Datenbanken auf[Sch97]. Hier wird ein Gitter als Grundmenge furalle raumlichen 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.
Raumliche Datenbanken stellen eine Alternative zu Geoinformationssystemendar. So werden sie z.B. zum Speichern von geografischen Daten gebraucht. Eskonnen verschiedenen Informationen wie physische oder politische Daten gepei-chert werden. Daraus konnen dann mittels Verschneidungen genaue Informatio-nen uber einen Ort gewonnen werden.
Bei raumlichen 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 konnen 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 geklart werden: Stellen dieAnforderungen an Koordinaten und an die Steigung der Geraden eine große Ein-
3
schrankung dar, gibt es Elemente, die sich nicht darstellen lassen? Ist es moglich,mit der Arithmetik fur große Bruche in angemessener Zeit zu rechnen?
Bei den verwendeten Daten handelt es sich um die ATKIS-Daten der StadtHannover.
In dieser Arbeit wird zunachst der Verwendungszweck raumlicher Daten kurzerlautert. Im dritten Kapitel wird dann die Realm-basierte Methode der Spei-cherung von raumlichen Daten erklart. 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 funften Kapitel wird gezeigt, wie sich eineige raumliche Operatoren aufdem Dual Grid implementieren lassen. Die Laufzeiten dieser Operationen undder Umwandlung wird im sechsten Kapitel beschrieben.
Im letzten Kapitel wird ein Ausblick auf mogliche Erweiterungen und Verbes-serungen des Programms gegeben.
4
Kapitel 2
Raumlichen Datentypen
Mit raumliche 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 Flachen erweitert werden,da diese im Dual-Grid-Ansatz vorgesehen sind.
2.1 Points
Um auf einer Karte Stadte oder bei großerem Maßstab offentliche Gebaude oderStraßenlaternen darzustellen, wird eine Datentyp benotigt, 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 Moglichkeit, dieStraßenlaternen, die nachts ausgehen von denen die weiter leuchten zu trennenund diese Information zusatzlich zu speichern.
2.2 Lines
Neben den Objekten, die sich als Punkt darstellen lassen gibt es auch Straßen,Flusse oder Bahnschienen, die durch Linien oder Linienzuge dargestellt werdenkonnen. Abhangig von der Form des Objektes kann eine gerade Linie, ein zusam-menhangender Linienzug oder aber auch nicht zusammenhangende Linienzugegewahlt werden. D.h. es bestehen wieder die Moglichkeiten, ein einzelnes StuckStraße als Objekt darzustellen oder aber alle Gewasser eines Gebietes zusammen-zufassen.
5
Kapitel 3
Realm-basierte Modellierung
raumlicher Daten
Ein Ansatz, raumliche Daten zu modellieren, stellen Realms dar [Sch97]. Dabeiwerden raumliche Objekte auf einem Gitter dargestellt. Jeder Schnittpunkt zweierGeraden wird auf einen Gitterpunkt gezogen und die Gerade erhalt 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 raumlichen 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 funf Schichten implementiert:
1. Ganzzahl-Arithmetik
2. robuste geometrische Primitive
6
3. Realms, realm-basierte Primitive und Strukturen
4. raumliche Datentypen und raumliche Algebra Primitive
5. ROSE (RObust Spatial Extension) Algebra Operationen
Vereinfachend kann man auch die Schichten drei, vier und funf zu einer Schichtzusammenfassen. Das soll hier passieren. Es werden nur die Schichten eins, zweiund eine erweiterte funfte genauer betrachtet.
Die erste Schicht bildet eine Ganzzahl-Arithmetik fur 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 uber-einstimmen.
• meet: Die zwei Segmente haben genau einen gemeinsamen Endpunkt.
• overlap: Zwei Segmente sind kollinear und haben ein gemeinsames Stuck.
• 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 erfullt, wenn Segment 1 touches Segment 2 oder Segment 2touches Segment 1.
• intersect: Zwei Segmente haben einen gemeinsamen Punkt, aber meet undtouch sind nicht erfullt.
• disjoint: Fur zwei Segmente gilt weder equal, meet, overlap, touch nochintersect.
7
• intersection: Berechnet den Schnittpunkt zweier Segmente und rundet dasErgebnis auf den nachsten Punkt.
In der dritten und vierten Schicht werden die raumlichen Datentypen points,lines und regions erst auf Realms basierend und dann allgemein definiert.
3.2 ROSE Algebra Operationen
In der funften Schicht werden auf den Datentypen points, lines und regions
ROSE Algebra Operationen definiert. Es gibt vier Arten von Operationen:
1. Raumliche Pradikate, die die topologischen Beziehungen zwischen den Ob-jekten beschreiben:
• =
• 6=• inside
• edge inside
• vertex inside
• area disjoint
• edge disjoint
• disjoint: Pruft, ob zwei Objekte disjunkt sind.
• intersects: Pruft, ob zwei Segmente sich schneiden.
• meets
• adjacent
• encloses: Ist true, wenn Regions-Objekt 1 innerhalb eines Lochs vonRegions-Objekt 2 liegt.
• on border of: Pruft, 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. Raumliche Operationen, deren Ergebnisse wieder raumliche 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 ubergebenen Objekte besteht.
• vertices
• contour: Liefert ein Lines-Objekt, das aus den außeren Segmenten desRegions-Objekts besteht.
• interior
3. Raumliche Operatoren, die Zahlen zuruckgeben
• dist
• diameter: Liefert den großten Abstand zwischen zwei Punkten einesRegions-Objekts.
• length: Berechnet die Lange eines Lines-Objekts.
• area: Berechnet die Flache eines Regions-Objekts.
• perimeter: Berechnet den Umfang eines Regions-Objekts.
4. Raumliche Operatoren auf Mengen von raumlichen 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 nfur die Große der Eingabe und k fur die Groß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 Einfugen in den Realm
Beim Einfugen von Segmenten in den Realm kann es allerdings zu Problemenkommen. Schneiden sich zwei Segmente, so ist es moglich, 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 Stucke zerteilt. Diese haben nicht die Form derursprunglichen Segmente sondern fuhren vom Anfangspunkt zum Schnittpunktund von dort zum Endpunkt. Diese Veranderung 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
ursprunglich nicht hatten. Dies kann zu topologischen Inkonsistenzen fuhren. 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 Hulle um das Segment gelegt. Beim Redrawing
10
werden Regeln befolgt, die gewahrleisten, dass das Segment diese Hulle nichtverlasst.
Diesen Aufwand umgeht der Dual-Grid-Ansatz. Er stellt einschrankende For-derungen an die Punkte und Segmente und stellt dadurch sicher, dass ein Redra-wing nicht notig wird.
3.4 Dual Grid
Im Dual Grid sollen Punkte und Segmente dargestellt werden. Komplexere Geo-metrien konnen spater aus diesen zusammengesetzt werden. Es wird ein Werte-bereich fur die Punkte und einer fur die Segmente definiert. Das Paar aus beidenist dann das Dual Grid. Dies ist abhangig von zwei Parametern n und m.
Der Wertebereich fur 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 benoting 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} fur n, m ∈ N
Gs(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.Guting, Dual Grid: A New Approach for Robust Spatial Algebra Implemantati-on). Die Anforderungen stellen auch keine echte Einschrankung dar. Lassen sichObjekte nicht einfugen, so kann man die Parameter n und m erhohen. In diesemFall mussen allerdings alle Objekte neu eingefugt werden.
11
Kapitel 4
Einfugen der Daten in die
Datenbank im Dual-Grid-Format
Das Programm liest Daten aus einer raumlichen Datenbank Daten aus. Es han-delt sich hierbei um Punkte, Linien und Flachen, die aber alle im DatentypMDSYS.SDO Geometry abgelegt sind. Zusatzlich 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 gepruft werden. Gegebe-nenfalls werden die raumlichen Daten angepasst. Fur alle Berechnungen wird eineArithmetik fur Bruchzahlen benotigt.
4.1 Das Dual-Grid-Datenbankformat
Zur Darstellung der raumlichen Objekte werden Oracle-Datentypen definiert[HP98]. In diesem Datenmodell gibt es die Datentypen Punkt, Segment, Pointsund Lines. Ein Punkt besteht aus vier Werten. Fur die x- und die y-Koordinatewerden jeweils Zahler 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-menhangende 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
Raumliche 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 ’gehort 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 ’gehort 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 Bruchen, deren Zahler und Nen-ner sehr große Integerzahlen sind. Die Klasse BigFraction stellt eine solche Zahldar. Zahler 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, kurzen, eine Betrags-funktion und eine Vergleichsmethode zur Verfugung.
4.3 Die raumlichen Objekte
Zu jedem der oben beschriebenen Oracle-Datentypen gibt es eine entsprechen-de Java-Klasse. Diese tragt den selben Namen wie der entsprechende Oracle-Datentyp. Die so erzeugten Klassen enthalten dieselben Daten, wie der Oracle-Datentyp und bieten die dazugehorenden 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 Vectorzuruck. Die Methoden equals(PunktExt a) und lowerThan(PunktExt a) bieten dieMoglichkeit zum Vergleich zweier Objekte. Die Methode onSegment(BigFractionx1, BigFraction y1, BigFraction x2, BigFraction y2) pruft, ob der Punkt auf demdurch Koordinaten ubergebenen Segment liegt.
Die Klasse PunktExt bietet als einzige die Moglichkeit, eine Instanz von ihrzu erzeugen, ohne dass dieses Objekt in der Datenbank existieren muss. Dies ist
14
z.B. beim Einfugen in die Datenbank wichtig. Hier wird getestet, ob der Punktauf schon vorhandenen Segmenten liegt. Diese mussen dann unterteilt werden.
SegmentExt
SegmentExt wird von der Klasse Segmenttype abgeleitet. Weiter stellt sie eineMethode zur Verfugung, die Anfangs- und Endpunkt zuruckgibt. Zur Schnitt-punktberechnung gibt es die Methode testAlign(SegmentExt), die uberpruft, obdas Segment mit dem ubergebenen auf einer Gerade liegt und ein gemeinsamesStuck besitzt. Die Methode getIntersection(SegmentExt) pruft die zwei Segmenteauf allgemeine Schnitte.
PointsExt
Die von Pointstype abgeleitete Klasse PointsExt bietet zur Zeit nur die MethodegetPunkte, die alle zu diesem Objekt gehorenden Punkte zuruckgibt. Es bestehtaber die Moglichkeit, hier Operatoren, die auf Points arbeiten hinzuzufugen (s.LinesExt: Intersection).
LinesExt
Auch in der Klasse LinesExt besteht mit getSegmente oder getPunkt die Moglich-keit, sich alle Segmente, die zum Objekt gehoren, oder deren Anfangs- und End-punkte ausgeben zulassen. Dann ist noch der Operator intersection(LinesExt)implementiert. Dieser berechnet alle Schnittpunkte zwischen diesem und demubergebenen LinesExt.
4.4 Transformation in die Dual-Grid-Darstellung
Fur die Berechnung des neuen Datenformats und das Einfugen in die Datenbankist die Klasse Insert zustandig. Sie liest die vorhandenen Daten aus und pruft, 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 zugehorigen 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 Einfugen der Objekte wird gepruft, ob sie den Dual-Grid-Bedingungen genugen.
Weiterhin wird gepruft, ob die Objekte schon in der Datenbank existieren. Istdies der Fall, so wird nur die Id des Objekts zuruckgegeben.
Gibt es das Objekt noch nicht, so muss gepruft werden, ob das Einfugendie schon vorhandenen Objekte beeinflusst. Liegt ein Punkt auf einem schonvorhandenen Segment, so wird dieses in zwei Segmente unterteilt.
Bei Segmenten gibt es zwei Moglichkeiten 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 eingefugt. 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 konnen.
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 gepruft, ob es zu dieser Objekt-Nummernoch weitere Objekte gibt. Gibt es welche, so werden diese nacheinander abgear-beitet. Sonst wird gepruft, ob es noch weitere Objekt-Nummern gibt. Wenn ja,dann werden diese bearbeitet, sonst ist das Einfugen beendet.
17
4.5 Ein Beispiel zum Einfugen in das Dual Grid
Anhand des folgenden Beispiels wird die Vorgehensweise beim Einfugen 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 benotigt.Die Parameter seien n = 6 und m = 4. Folgende Daten werden als Ausgangsdatenfur 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 eingefugtwerden. 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 uberSegmList hergestellt werden.
Im nachsten 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 gepruft werden, ob die Steigung des Segments den Dual-Grid-Bedingungengenugt. Dies ist der Fall, denn das Segment liegt auf der Geraden y = x+1. Dieselasst 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 gepruft 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 mussen 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 eingefugt. Diese verlaufenvom alten Startpunkt zum Schnittpunkt bzw. vom Schnittpunkt zum Endpunkt.Dabei wird der Punkt (3, 4) eingefugt und erhalt die Id 7.
Dabei verandern 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 konnen danndie neuen Segmente erstellt werden.
Das Feld der Koordinaten sieht hier folgendermaßen aus: (1, 2, 2, 3, 3, 4, 4, 5).Es mussen also nacheinander folgende Segmente eingefugt werden: (1, 2, 2, 3),(2, 3, 3, 4) und (3, 4, 4, 5).
Es wird jeweils gepruft, ob es dieses Segment schon in der Datenbank gibt.Dies ist bei allen drei Segmenten nicht der Fall. Also mussen alle Segmente ein-gefugt werden. Dazu wird gepruft, ob Anfangs- und Endpunkt dem Dual GridBedingungen genugen. Ist dies der Fall, so werden erst die Punkte, falls sie nochnicht existieren, eingefugt. Dann wird das Segment mit Verweisen auf die Punkt-Ids in die Datenbank eingefugt. Außerdem wird in die SegmList ein Eintrag mitder Segment-Id und Lines-Id geschrieben.
Fur das Segment (1, 2, 2, 3) wird der Punkt (1, 2) eingefugt, da er den DualGrid Bedingungen genugt und noch nicht existiert. Er erhalt 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 erhalt 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, mussen keine weiteren Seg-mente bearbeitet werden. Jetzt wird gepruft, ob es noch weitere Objekte mitanderer Objecno gibt, die eingefugt werden sollen. Dies ist auch nicht der Fall,also ist das Einfugen beendet.
22
Kapitel 5
Raumliche Operationen
Raumlliche Operationen erfordern fur gewohnlich einen hohen Rechenaufwand.Um zu prufen, welche Linien sich mit welchen schneiden, muss jede Linie mitjeder auf Schnittpunkte gepruft 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 konnen sich nur in den Endpunktenberuhren. Diese Eigenschaft, die beim Einfugen der Daten sichergestellt wird,
Abbildung 5.1: Segmente treffen nur an Endpunkten aufeinander
ermoglicht jetzt eine schnelle und einfache Ausfuhrung der raumlichen Operatio-nen. Schnitte und ahnliches konnen 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 Einfugen berechnet wurden, konnen sichSegmente jetzt nur noch in ihren Endpunkten schneiden. Das bedeutet fur dieSchnittberechnung, dass nur noch die Punkte aus den Tabellen gelesen werdenmussen, 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 gehoren zu L1 und L2
Im Bild sieht man, dass die Punkte P2 und P3 sowohl zum Lines-Objekt L1als auch zu L2 gehoren. Die anderen Punkte gehoren 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 Ergebnisgroßer als 0, so entspricht das einem true. Das heißt allerdings nicht, dass dasPoints-Objekt vollstandig auf dem Lines-Objekt liegt.
Um eine Aussage daruber zu bekommen, ob das Points-Objekt vollstandigauf 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 fur Regions kann man auch ein common segments furLines definieren. Dieser Operator berechnet fur zwei Lines-Objekte L1 und L2,welche Segmente sowohl zu L1 als auch zu L2 gehoren. Die Ids dieser Segmentewerden dann ausgegeben.
Auch diese Anfrage kann als Join uber Tabellen formuliert werden. Dies liegtdaran, dass jedes Segment nur einmal in der Datenbank gespeichert ist. Die Zu-gehorigkeit zu einem Lines-Objekt wird uber 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 gehort. DiesesSegment wird also als gemeinsames Segment ausgegeben.
26
L1
L2
s1
s2
s3s4
Segment
s1s2s3
s4s2
L1L1L2L2
Lines
L1
Abbildung 5.4: s2 gehort zu L1 und L2
Diese Anfrage liefert die Ids der Segmente, die zu dem Lines-Objekt mit Id =1 und dem mit Id = 2 gehoren:
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 Datensatzen und dem ATKIS-Datensatz von Hannover. Bei den Tests werden jeweils erst die Daten in dieDatenbank eingefugt. Dies passiert sowohl fur das Dual Grid als auch fur 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 eingefugt und auf Schnitte gepruft. Das ersteSegment fuhrt waagerecht von P1 = (1, 2) nach P2 = (2, 2). Es gibt noch weitere99 Segmente, die so gewahlt 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. Fur 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:
– Einfugen ≈ 1.400.000ms
– Schnittberechnung ≈ 14ms
• Oracle Spatial:
– Einfugen ≈ 13.000ms
– Schnittberechnung≈ 38ms
Das Einfugen der Daten dauert im Dual Grid deutlich langer als mit OracleSpatial, aber dafur 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:
– Einfugen ≈ 1.500ms
– On-Operator ≈ 8ms
• Oracle Spatial:
– Einfugen ≈ 300ms
– On-Operator ≈ 14ms
Das Einfugen der Daten dauert naturlich im Dual Grid wieder deutlich langerals bei Oracle Spatial. Aber man sieht auch hier, dass der On-Operator im DualGrid deutlich schneller ist. Hier zeigt das Dual Grid Vorteile, wenn Operatorenhaufiger aufgerufen werden.
6.3 Hannover
Die Zeit zum Einfugen der Hannover-Daten kann nicht vollstandig gemessen wer-den, da nach einiger Zeit ein Oracle-Fehler auftritt. Bei den Testlaufen wurdemaximal 20 Prozent der Daten eingefugt. Das Einfugen von 1705 Points- undLines-Objekten dauerte 5,3 Tage.
6.4 Fazit
Das Einfugen in die Dual Grid Datenbank dauert erheblich langer als in OracleSpatial. Dies liegt einerseits daran, dass sich Datenbankanfragen und Berech-nungen in Java immer abwechseln. Es kommt also zu einem standigen Wechselzwischen Java und Oracle. Andererseits gibt es beim Einfugen sehr viele Schnitt-punktberechnungen, da jedes Objekt mit jedem anderen uberpruft werden muss.
Die raumlichen Operationen dagegen profitieren davon, dass die Schnitteschon beim Einfugen berechnet wurden. Sie mussen 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 Grundzugen des Dual Grid-Ansatzes.Es ware sinnvoll, das Programm um folgende Punkte zu erweitern:
• Arbeiten mit Flachen: Flachen konnen durch die begrenzenden Polygonedargestellt werden. Hierbei kann noch zwischen dem außeren Rand undLochern unterschieden werden.
• Neuer Oracle-Datentyp zur Darstellung der Koordinaten, damit man nichtmehr auf die Lange des Typs number beschrankt ist.
• Erweiterung der Typen Points und Lines: Hier konnen weitere Felder hin-zugefugt werden, in denen zusatzliche Informationen gespeichert werdenkonnen.
31
Literaturverzeichnis
[HP98] U. Hohenstein, V. Plessre: Oracle8 – Effiziente Anwendungsentwicklungmit objektrelationalen Konzepten. dpunkt-Verlag, Heidelberg, 1998.
[LG00] J. A. C. Lema, R. H. Guting: 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 Anderungen am Programm
8.1.1 Anderung des Programmablaufs
Um die Laufzeit des Programms zu verkurzen, wurde der Ablauf des Flussdia-gramms auf Seite 15 verandert. Bisher wurde direkt vor dem Einfugen der Seg-mente gepruft, ob diese den Bedingungen des Dual Grid genugen. Hierbei werdenauch Punkte uberpruft, die schon aufgrund des Dual-Grid-Verfahrens den Bedin-gungen genugen mussen. Wird dieser Test nach vorne gezogen, so werden nur dieursprunglichen Segmente getestet und nicht jedes neu entstandene Teilsegment.So entfallen viele Berechnungen und das Einfugen 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: Geandertes Flussdiagramm
8.1.2 Redundante Speicherung von Oracle Spatial Daten
Ein weiterer Versuch, die Laufzeit zu verkurzen, war das Mitfuhren von redun-danten Daten im Oracle-Spatial-Format. Die Anfragen, die beim Einfugen der
34
Objekte gestellt werden, konnen dann auf diesen Spatial-Daten laufen. Hierbeikann man den in Oracle Spatial implementierten raumlichen Index nutzen.
Das so modifizierte Programm hat aber leider deutlich hohere Laufzeiten, alsdas ursprungliche (. Der Aufwand, die Spatial-Daten zu verwalten, ist groer alsder Nutzen, der durch den raumlichen Index entsteht.
8.2 Grosse der Tabellen
In den Tabellen gibt es insgesamt 38 Points-Objekte und 6307 Lines-Objekte.Ausder Tabelle USER TABLES lasst sich folgender Platzbedarf fur 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 fur das Dual Grid und 2,538MB fur 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. Deshalbkonnen auch keine Abfragen zum Vergleich von Oracle Spatial und Dual Gridgestartet werden.
Die Anfrage, ob es Punkte gibt, die auf Segmenten liegen, dauerte fur dieBahnhofsanlagen im Dual Grid 3,13 s und in der ursprunglichen 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 Moglichkeit, zu prufen, 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 : Brucke-3514: 0/0 (2.45 s) 0 (52.07 s)Grunanlage-2227 : Gartenland-4103: 163/25 (1.45 s) 0 (29.47 s)Brucke-3514 : Bahnstrecke-3205: 23/9 (1.42 s) 0 (23.09 s)Flache-4199 : Gartenland-4103: 182/34 (0.35 s) 0 (21.22 s)Geholz-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)Brucke-3514 : Fahrbahn-3106: 53(1,03 s) 49(31,53 s)Flache-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 Einfugen der Daten braucht duch viele Schnittberechnungen viel Zeit. DasEinfugen 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 beimEinfugen schnell wieder ausgeglichen.
Im Platzbedarf unterscheiden sich die beiden Modelle kaum. Die Abweichungbetragt nur 0,164 MB.
36