Institut für Kartographie und Geoinformation

Werbung
Rheinische Friedrich-Wilhelms-Universität Bonn
Landwirtschaftliche Fakultät
Institut für Kartographie und Geoinformation
Diplomarbeit
Implementierung eines 3D-Stadtmodells
in eine objekt-relationale Datenbank
am Beispiel von Oracle Spatial
vorgelegt im Juli 2003 von
Markus Reuter
Betreuer:
Prof. Dr. Lutz Plümer
Dr. Gerhard Gröger
Erklärung
Hiermit erkläre ich, dass ich diese Diplomarbeit selbständig angefertigt und keine
anderen als die angegebenen Quellen und Hilfsmittel benutzt sowie Zitate kenntlich
gemacht habe.
Bonn, Juli 2003
(Markus Reuter)
- leer -
- leer-
Danksagung
Für die fachliche Hilfe bedanke ich mich bei Gerd, Thomas, Thorsten und Björn. Besonderer
Dank gilt Herrn Prof. Dr. Lutz Plümer, der mir diese Arbeit ermöglicht hat und mich intensiv
unterstützte. Ich danke meinen Eltern, die mir dieses Studium ermöglichten und meinem Patenonkel Dr. Hansludwig Hagen, der mir in wissenschaftlicher Hinsicht immer ein Vorbild
gewesen ist. Meiner Freundin Jutta möchte ich für die letzten 9 Jahre mit ihr danken.
Inhaltsverzeichnis
1 Einleitung
8
2 3D-Repräsentation und Datenbankaspekte
10
2.1 Boundary Representation (B-Rep) ......................................................................... 10
2.2 Contructive Solid Geometry (CSG) ....................................................................... 11
2.3 Umsetzung von 3D-Stadtmodellen ........................................................................ 12
2.3.1 3D VECTOR MAPS ................................................................................... 14
2.3.2 SOMAS .......................................................................................................16
2.4 Virtual Reality Modeling Language (VRML) ....................................................... 17
2.5 Datenbanken...........................................................................................................19
2.5.1 Relationales Schema ................................................................................... 20
2.5.2 Objekt-relationales Schema.........................................................................21
2.5.3 Nested tables ...............................................................................................24
2.5.4 Structured Query Language (SQL) .............................................................25
2.5.5 Java-Schnittstelle.........................................................................................29
3 Implementierung des Datenmodells
32
3.1 Modell „Regengeld“............................................................................................... 32
3.1.1 Primitive ......................................................................................................33
3.1.2 Rekursive Aggregation................................................................................35
3.1.3 Integritätsbedingungen ................................................................................39
3.2 Objekt-Relationale Umsetzung .............................................................................. 40
3.2.1 Geometrisch-topologisches Modell............................................................. 40
3.2.2 Rekursive Aggregation................................................................................42
3.2.3 Erstellung des Datenmodells mit SQL ........................................................ 45
4 Eignung von Oracle Spatial
49
4.1 Konzept ..................................................................................................................49
4.1.1 Räumliche Datentypen ................................................................................ 49
4.1.2 Räumlicher Index ........................................................................................53
4.1.3 Räumliche Operatoren................................................................................. 55
INHALTSVERZEICHNIS
7
4.1.4 Räumliche Funktionen ................................................................................ 58
4.2 3D-Fähigkeiten.......................................................................................................59
4.3 Geometriebeispiel...................................................................................................62
4.4 Polyeder-Representation ........................................................................................ 63
4.5 Oracle Spatial Java Library .................................................................................... 65
4.6 Beurteilung .............................................................................................................67
5 Datenaustausch
71
5.1 Import .....................................................................................................................71
5.1.1 Daten der T-Mobile Deutschland GmbH .................................................... 71
5.1.2 VRML .........................................................................................................73
5.1.3 Probleme und Verbesserungen.................................................................... 74
5.2 Erstellung von Spatial-Objekten ............................................................................ 75
5.3 Export .....................................................................................................................79
5.3.1 Geometrisch-topologisches Modell............................................................. 79
5.3.2 Spatial-Layer ...............................................................................................81
6 Analyse
82
6.1 Speicherplatzbedarf................................................................................................ 83
6.2 Import .....................................................................................................................84
6.3 Export .....................................................................................................................84
6.3.1 Topologie-Query .........................................................................................85
6.3.1 Spatial-Query ..............................................................................................90
6.4 Beurteilung .............................................................................................................91
7 Schluss & Ausblick
94
Anhang
97
Literaturverzeichnis
108
Kapitel 1
Einleitung
Dreidimensionale Stadtmodelle gewinnen in vielen Gebieten zunehmend an Bedeutung. Dazu
gehören neben der einfachen Visualisierung vor allem die Stadt- und Raumplanung, Vermessung, mobile Telekommunikation und das Facility Management. Im Umweltbereich ermöglichen 3D-Stadtmodelle die Simulation von Lärm- und Abgasausbreitungen oder Klimaveränderungen. Die Verwaltung, interoperable Nutzung und Visualisierung der dabei zu berücksichtigenden großen Datenmengen erfordert leistungsfähige Systeme und Standards. Kommerzielle Geoinformationssysteme (GIS) stellen dies zur Zeit nicht zur Verfügung. Professionelle Datenbanksysteme, wie z.B. Oracle, verfügen aber mittlerweile über räumliche Erweiterungen und sind bestens geeignet für die Verwaltung von großen Datenmengen.
Momentan existieren für 3D-Stadtmodelle noch keine geeigneten Standards. In der Geodateninitiative (GDI) NRW gibt es aber Diskussionen und Entwürfe, die an bestehende Standards
der ISO TC2111 und des Open GIS Consortiums2 für die allgemeine Repräsentation von 3DObjekten angelehnt sind.
Insbesondere setzt sich hier die Special Interest Group 3D (SIG 3D) innerhalb der GDI NRW
mit genau diesen Fragen der Modellierung, Speicherung, Erstellung, Nutzung, Visualisierung
und Vermarktung von 3D-Stadt- und Regionalmodellen auseinander. Ihr Ziel ist die Entwicklung von offenen Standards für die Modellierung und Visualisierung von 3D-Geobasisdaten
sowie die Spezifikation der entsprechenden Basisdienste für den Zugriff auf die raumbezogenen Objekte. Dass Städte und Unternehmen eine solche nachhaltige Lösung benötigen, um
Investitionen zu sichern und zu amortisieren, zeigt sich an einer langen Liste von derzeit über
70 Teilnehmern in der SIG 3D, die aus Wirtschaft, Wissenschaft und den öffentlichen Verwaltungen kommen.
Am Institut für Geoinformation und Kartographie der Universität Bonn wurde in einem Kooperationsprojekt mit dem Institut für Photogrammetrie für die Stadt Wuppertal ein 3DStadtmodell entwickelt („Regengeld“), welches sich an den Entwürfen der GDI NRW orientiert und dort auch breite Unterstützung findet. Der Kern dieses Datenmodells wird durch die
geometrisch-topologische Modellierung von 0-, 1-, 2-, und 3-dimensionalen Primitiven gebildet. Diese bauen aufeinander auf und realisieren ein Knoten-, Kanten-, Flächen- und Volumenmodell. Dabei werden Volumen durch ihre Randflächen (Boundary Representation, siehe
[Fol95]) beschrieben. Flächen lassen sich durch ihre Kanten beschreiben, die einen Anfangsund Endknoten besitzen. Koordinaten werden hier immer nur Knotenobjekten
1
: http://www.isotc211.org
: http://www.opengis.org
3
: http://www.gdi-nrw.org
2
8
EINLEITUNG
9
zugeordnet. Das Modell wird in Kapitel 3 genauer beschrieben, es ist Ausgangspunkt für diese Arbeit.
3D-Stadtmodelle werden ständig aktualisiert, was einerseits bedeutet, dass mehrere Benutzer
auf das gleiche Modell zugreifen müssen und andererseits die Daten sich permanent ändern.
Die Menge dieser Daten wird permanent wachsen und relativ bald sind dann Größenordnungen von mehreren Millionen Objekten erreicht und spätestens hier wird der Einsatz von skalierbaren und ausfallsicheren Systemen unabdingbar. Um diesen Umständen gerecht zu werden, ist es nötig, auf eine leistungsstarke Datenbank wie die der Firma Oracle zurückzugreifen. Neben der Tatsache, dass sich die Oracle-Datenbank bereits im GIS-Sektor etablieren
konnte, ist vor allem die räumliche Erweiterung „Spatial“ von Interesse, über die bisher aber
noch kaum Untersuchungen bezüglich ihrer 3D-Fähigkeiten existieren.
Ziel dieser Arbeit ist also die Entwicklung einer Datenbank, welche 3D-Objekte im Sinne des
oben genannten geometrisch-topologischen Modells speichern kann und zusätzlich raumbezogene Anfragen mit Hilfe von Oracle Spatial bearbeitet. Für den Datenaustausch und die
Visualisierung bietet sich die Beschreibungssprache VRML [Klo98] an. Sie dient der Darstellung von 3D-Welten speziell im Internet und beherrscht ebenfalls die Randflächendarstellung
von 3D-Objekten. Zur Evaluation dieser Datenbank stehen reale Daten der T-Mobile
Deutschland GmbH zur Verfügung. Besonderes Augenmerk soll der Abbildung von rekursiven Entwurfsmustern gelten. Ebenso soll die Frage geklärt werden, in wie weit sich Oracle
Spatial für räumliche Anfragen nutzen lässt und wie groß deren Effizienz ist.
Die Arbeit gliedert sich wie folgt:
Zu Anfang werden die wichtigsten Grundlagen vermittelt, die zum Verständnis dieses Themas beitragen. Danach wird die Entwicklung des objekt-relationalen Datenbankschemas zur
Repräsentation von 3D-Objekten beschrieben. Kapitel vier befasst sich mit der räumlichen
Erweiterung Spatial und untersucht deren 3D-Fähigkeiten. Kapitel fünf widmet sich den
Werkzeugen für den Datenaustausch, deren Implementierung einen großen Teil der Zeit für
diese Arbeit ausgemacht haben. Im sechsten Kapitel wird die Effizienz der Datenbank untersucht, an die sich eine kritische Beurteilung zusammen mit einem Ausblick anschließt, in dem
Verbesserungsmöglichkeiten und Vorschläge für weitere Untersuchungen aufgezeigt werden.
10
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
Kapitel 2
3D-Repräsentation und Datenbankaspekte
Die hier vorgestellten Technologien und Konzepte dienen als Grundlage für die anschließenden Kapitel. Dazu gehören Darstellungsformen von 3D-Objekten, die Umsetzung von 3DStadtmodellen, aber auch das Datenformat VRML, mit dem 3D-Welten beispielsweise im
Internet repräsentiert werden können. Unter der Überschrift „Datenbanken“ befindet sich ein
kurzer Abriss über die Unterschiede zwischen relationalen und objekt-relationalen Datenbank-Schemata sowie eine kurze Einweisung in die Sprache SQL, die der Datenbankabfrage
dient. Der letzte Teil bezieht sich auf die Schnittstelle zwischen Java und der Datenbank.
Die Abschnitte 2.1 und 2.2 enthalten die beiden gängigsten Repräsentationsmöglichkeiten von
3D-Objekten. Der Schwerpunkt soll hier auf der Boundary Representation liegen, an welches
alle in dieser Arbeit vorgestellten Datenmodelle angelehnt sind.
2.1 Boundary Representation (B-Rep)
(a)
(b)
(c)
Abbildung 2.1: B-Rep: (a) geschlossenes Objekt (Körper); (b) einhüllende Flächen; (c)
Punkte und Kanten [Män88]
Das als Boundary-Representation (B-Rep) bezeichnete Darstellungsmodell kommt aus der
Computergrafik und definiert räumliche Objekte mit Hilfe der sie begrenzenden Flächenelemente. Ein Körper besteht demnach aus mehreren Flächen, die jeweils zueinander benachbart
sind und somit das Objekt lückenlos umschließen. Diese Flächen wiederum setzen sich aus
mehreren Kanten zusammen, welche durch jeweils zwei Knoten festgelegt sind. Ein
2.1. BOUNDARY REPRESENTATION (B-REP)
11
Knoten kann Anfangs- oder Endpunkt beliebig vieler Kanten sein. Seine 3D-Koordinaten
werden jedoch nur einmal gespeichert, wodurch Redundanzen vermieden werden.
Diese Art der Objekt-Modellierung ist nicht nur im GIS-Sektor mittlerweile weit verbreitet,
sie findet auch Anwendung in der Virtual Reality Modeling Language (VRML) und ist QuasiStandard bei 3D-Computerspielen.
Vorteile der Boundary Representation:
Objekte sind eindeutig, zwei verschiedene B-Rep’s können nicht das gleiche Objekt
darstellen
Die Topologie des Objektes wird erfasst
Realistische Darstellung durch Verwendung von gekrümmten Flächen (Splines)
Den Flächen des Objekts können direkt Texturen zugeordnet werden
Innenliegende, nicht sichtbare Flächen werden eliminiert, wodurch Sichtbarkeitsprobleme vermieden werden
Nachteile:
Änderungen eines Objektes und speziell das Zusammenführen (Aggregation) mehrerer
Objekte ist sehr aufwändig
Die Vielzahl von Flächen erfordert hohen Rechen- und Speicheraufwand
2.2 Constructive Solid Geometry (CSG)
Die CSG-Darstellung, welche eher aus dem Bereich Maschinenbau und CAD kommt, ist eine
Alternative zur Boundary-Representation, spielt aber in dieser Arbeit eine untergeordnete
Rolle. Hier werden einfache 3D-Primitive wie Quader, Pyramiden, Zylinder, etc. durch Addition, Subtraktion, Vereinigung oder Durchschnittsbildung zu komplexen Objekten zusammengesetzt. Gekrümmte Formen wie Kugel, Zylinder oder Kegel sind in diesem Modell ebenfalls darstellbar. Zur Beschreibung eines komplexen Objekts bedarf es also nur mehrerer
Grundkörper und deren Transformationsparameter. Die Aggregation erweist sich als besonders einfach: Komplexe, zusammengesetzte Objekte werden als neue Primitive definiert, was
zu einem minimalen Satz von Formparametern für Objekte eines Typs führt. Dieser Vorgang
wird „Primitive Instancing“ [Fra02] genannt.
Abbildung 2.2: CSG: Zusammensetzung eines komplexen Objekt aus Grundkörpern
12
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
Vorteile der Contructive Solid Geometry:
Simple Konstruktion
Geringe Anzahl von zu speichernden Informationen
Nachteile der Contructive Solid Geometry:
Topologie nicht optimal (Schnittkanten bei der Verschmelzung von Objekten)
Eingeschränkter Formenschatz
Objekte werden nicht explizit repräsentiert
Texturen können keinen Flächen zugeordnet werden
Zur Visualisierung müssen erst die Oberflächen ermittelt werden
Abbildung 2.3: Zwei verschiedene CSG-Bäume zeigen das gleiche Gebäude aus
Abbildung 2.2 ( ∪ = Vereinigungsmenge)
2.3 Umsetzung von 3D-Stadtmodellen
3D-Stadtmodelle besitzen sehr viele Einsatzgebiete. Aber nicht jedes Modell ist für alle Anwendungen geeignet.
Einige Beispiele:
Zur Visualisierung eines neuen Bauvorhabens erstellt man ein 3D-Modell der Umgebung einschließlich des geplanten Neubaus. Entscheidungsträger können sich dann anhand einer virtuellen Tour durch das 3D-Modell vorab ein Bild davon machen, wie der geplante Eingriff später aussehen wird, ohne in der Realität auch nur ein Stein zu bewegen.
Ein Mobilfunkunternehmen möchte die Standorte seiner Sendemasten genau bestimmen. Da
sich die Funksignale in alle Richtungen ausbreiten, muss er wissen, wie hoch die Gebäude in
der Umgebung der Sendemasten sind, um Absorptionen und Reflexionen der Signale genau
bestimmen zu können.
2.3. UMSETZUNG VON 3D-STADTMODELLEN
13
Für die richtige Bemessung von Regenwasserabfluss muss der Stadt oder der Kommune ein
3D-Modell zur Verfügung stehen, welches Gebäude in einem höheren Detaillierungsgrad,
also insbesondere auch mit Dachformen und –überständen, beinhaltet.
Diese drei genannten Anwendungen besitzen vollkommen unterschiedliche Genauigkeitsanforderungen. Im Fall der virtuellen Tour durch die Stadt müssen hochauflösende Texturen
vorhanden sein, die Genauigkeit der Objekte sollte im Dezimeterbereich liegen, was also terrestrische Meßmethoden voraussetzt. Bei einem solchen Modell sind nur wenige Arbeitsschritte automatisiert.
Für den Mobilfunkanbieter zählt nicht die Visualisierung, er muss in dem Modell rechnen
können. Seine Daten umfassen Millionen Häuser und Dutzende Städte. Genauigkeitsanforderungen im Meterbereich ermöglichen die Modellierung der Gebäude mittels photogrammetrischer Auswerteverfahren. Der Grad der Automatisierung ist hier sehr groß. Die Stadt oder
Kommune erhält ihre Daten auf ähnliche Weise, allerdings ist die Datengewinnung hier etwas
aufwändiger. Die Häuser werden ebenfalls unter Zuhilfenahme photogrammetrischer Auswerteverfahren abgeleitet. Die hier erforderlichen höheren Genauigkeiten können aber durchaus
noch eingehalten werden. Das Besondere ist hier jedoch der Verschnitt der photogrammetrisch ermittelten Häuser mit den Daten der Automatisierten Liegenschaftskarte (ALK). Aus
der Differenz zwischen dem Grundriss des Hauses aus den ALK-Daten und dem Umriss des
photogrammetrisch abgeleiteten Hauses können Dachüberstände ermittelt werden.
2.3.1 3D vector maps
Alle Ansätze, 3D-Stadtmodelle zu entwickeln und diese in Datenbankschemata umzusetzen,
basieren auf dem Ansatz der Boundary Representation. Sie alle haben ein Modell gemein, in
dem Objekte durch Punkte, Kanten und Flächen dargestellt werden. Der erste Ansatz von Molenaar [Mol92], [Rik94] liegt bereits über ein Jahrzehnt zurück. Er führt neben NODE, ARC
und FACE ein „Zwischen-Element“ ein, um m:n Relationen zu vermeiden. Im zweidimensionalen kann eine Kante nur Teil von maximal zwei Flächen sein, im dreidimensionalen kann
eine Fläche aber um eine Kante rotieren, so dass m Kanten in n Flächen vorkommen können.
Das Zwischen-Element EDGE ist geometrisch gesehen wieder ein ARC, allerdings kommt eine
EDGE immer nur in einem FACE vor und besitzt lediglich einen Verweis auf einen existierenden ARC und zusätzlich die Umlaufrichtung, welche der ARC im FACE besitzt (Abbildung
2.4).
Durch dieses Festlegen der Umlaufrichtung kann mit der „3-Fingerregel der rechten Hand“
die Ober- und Unterseite einer Fläche bestimmt werden. Das Zwischen-Element erfordert
Restriktionen, wie z.B. dass Flächen sich nicht schneiden dürfen oder dass sich Flächen nur
an Ihren Rändern berühren dürfen. Diese Restriktionen gelten aber prinzipiell in allen Flächenbegrenzungs-Modellen und stellen somit keinen Nachteil dar.
14
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
Abbildung 2.4: Richtung von EDGE und ARC [Mol92]
POINTOBJ
-PID
-PCLASS
-NID
LINEOBJ
SURFACE
-LID
-LCLASS
-BID
-BCLASS
NODEONF
BODYOBJ
-BID
-BCLASS
ARCPOFL
-NID
-NISONF
-ARCID
-APARTOFL
ARCONF
-ARCID
-AISONF
NODEINB
ARCINB
-NID
-NISINB
NODE
-NID
-XC
-YC
-ZC
-ARCID
-AISNINB
ARC
EDGE
-ARCID
-ARCBEG
-ARCEND
-FID
-ENOSEQ
-ARCID
-FORBACK
FACE
-FID
-FPARTOFS
-BIDLEFT
-BIDRIGHT
-TEXTUREREF
Abbildung 2.5: Formal data structure (FDS) for 3D vector maps [Mol92]
In Abbildung 2.5 wird deutlich, dass ein FACE zu zwei verschiedenen BODIES gehören
kann, in der Abbildung dargestellt durch die Beziehung BIDLEFT und BIDRIGHT. Wenn
ein FACE nur zu einem BODY gehört, haben BIDLEFT und BIDRIGHT den gleichen Wert.
Damit eine Fläche auch einzeln im Raum sein kann, ohne zu einem Körper zu gehören, wird
2.3. UMSETZUNG VON 3D-STADTMODELLEN
15
der Raum der Vollständigkeit halber ebenfalls als BODY betrachtet. In diesem Fall wäre FACE
dann auch nicht „part of“ einer SURFACE, die ja die Oberfläche eines Körpers im Sinne der
Boundary Representation darstellt. Im Gegensatz zur Boundary Representation werden Flächen, die im Innern eines Körpers liegen, in diesem Modell nicht ausgeschlossen. Die Darstellung ist somit nicht mehr eindeutig.
Für dieses Modell stellt Molenaar zwölf Konventionen auf, die im Prinzip auf alle anderen
3D-Modelle übertragbar sind, wie auch auf das Modell, welches in Kapitel 3 vorgestellt wird.
1. Jedes elementare Objekt sollte zu einer eigenen Klasse gehören. Das Klassensystem
sollte vollständig und ausschließlich sein.
2. Ein elementares Objekt einer Klasse sollte von nur einem Geometrie-Typ sein.
3. Bei der Analyse eines 3D-Modells als Graph sollten alle geometriebeschreibenden
Punkte als Knoten des Graphs behandelt werden.
4. Kanten werden geometrisch als gerade Linien dargestellt.
5. Jedes Knotenpaar kann nur durch eine Kante mit einander verbunden werden. Sie dürfen zusätzlich aber über eine Kette von Kanten mit einander verbunden sein.
6. Zwei Kanten dürfen sich nicht schneiden. Falls das doch der Fall sein sollte, müssen
sie durch vier Kanten, die sich in einem neuen Punkt schneiden, ersetzt werden.
7. Flächen sollen planar sein (In einer Ebene liegen).
8. Flächen können topologisch nur durch ihre Kanten zu einander in Beziehung gesetzt
werden.
9. Kanten einer Fläche müssen eine eindeutige Orientierung besitzen, um links, rechts,
oben und unten auf einer Fläche bestimmen zu können.
10. Eine Kante kann eine Fläche nur über einen Knoten berühren oder durchstoßen.
11.
-
Ein Knoten repräsentiert höchstens ein Punkt-Objekt
Eine Kante repräsentiert höchstens ein Linien-Objekt
Eine Fläche besitzt höchstens einen Körper auf der Oberseite
Eine Fläche besitzt höchstens einen Körper auf der Unterseite
12.
-
-
Ein Punkt-Objekt wird von einem Knoten repräsentiert
Ein Linien-Objekt wird durch eine Kette von Bögen dargestellt und besitzt einen Anfangs-Knoten, einen End-Knoten, keine Schleifen und keine Äste
Ein Oberflächen-Element darf höchstens einen äußeren Kantenring besitzen
und mehrere Innenringe, die jedoch nicht in einander verschachtelt sein dürfen
16
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
2.3.2 SOMAS
An der ETH Zürich wird derzeit ein 3D Vektor-GIS Prototyp namens SOMAS (Solid Object
Management System) [Pfu02] entwickelt. Der Schwerpunkt dieses Projekts liegt in der Entwicklung eines geeigneten geometrischen und thematischen Datenmodells mit dem 3D und
4D Analysefunktionen zusammen mit einem optimalen Datenmanagement (Speicherung und
Zugriff) zur Verfügung stehen.
Abbildung 2.6: Relationales Datenmodell von SOMAS [Pfu02b]
Die Daten werden bei SOMAS ebenfalls in einer relationalen Datenbank (Oracle 8i) gespeichert, über ein Interface können 3D-Daten angezeigt und abgefragt werden. Die Modellierung
(Abbildung 2.6) ist im Gegensatz zu Molenaar etwas allgemeiner und speziell auf die Repräsentation von 3D-Stadtmodellen ausgerichtet. Vier Klassen, Point_Entity, Line_Entity, Polygon_Entity und Solid_Entity stellen die vier Grundelemente
dar. Direkt abgeleitet aus diesen Klassen werden die Objekte Vertex, Edge, Face und
Solid. An dieser Stelle sei nur kurz erwähnt, dass trotz der Verwendung der Begriffe Klassen und Objekte, die Daten lediglich in relationalen Tabellen abgelegt sind. Für jede dieser
Klassen von Grundelementen existiert eine Tabelle, in der alle Elemente seines Typs gespeichert sind. Die Attribute sind somit Spaltenelemente. M:n Beziehungen zwischen den Grundelementen werden mit weiteren Tabellen realisiert, in deren Spalten die ID’s von zwei in Beziehung zu einander stehenden Objekten gespeichert werden (Siehe hierzu Abschnitt 2.5 Da-
2.3. UMSETZUNG VON 3D-STADTMODELLEN
17
tenbanken). Die Tabelle Loop stellt den Zusammenhang zwischen Edge und Face her. Ein
Loop besteht aus n Edge’s und ein Face hat genau einen Loop als Außenring sowie 0 bis
n Loop’s als Innenringe.
Dem Benutzer stehen dann 3D-Algorithmen zur Verfügung, die auf die Koordinaten aus der
Tabelle Vertex zugreifen können.
2.4 Virtual Reality Modeling Language (VRML)
Die Beschreibungssprache für virtuelle 3D Welten VRML existiert seit Dezember 1995 in der
Version 1.0 und seit März 1998 in der Version 2.0. Basierend auf XML-Technologie wird in
naher Zukunft Extensible 3D (X3D) der abwärtskompatible Nachfolger von VRML sein.
VRML ist eine Szenen beschreibende Sprache (SDL) und besitzt einen objektorientierten Ansatz, um die Konstellation von 3D-Objekten in einer Szene zu beschreiben. Dabei können 3DObjekte wie bei der CSG-Darstellung aus Primitiven bestehen, genauso ist aber auch die Darstellung der Objekte durch die Boundary Representation möglich. Eine VRML-Datei besteht
aus einer Liste von Knoten, nicht zu verwechseln mit den Knoten der 3D-Modellierung. Diese
Knoten lassen sich in drei grundlegende Kategorien unterteilen: Gruppenknoten, Kindknoten
und Objektknoten (Abbildung 2.7). Wie der Name bereits sagt, fassen Gruppenknoten andere
Knoten zusammen, wobei letztere wiederum aus beiden Kategorien stammen können. Durch
die Kombination verschiedener Knoten in einer Datei entsteht eine hierarchische Struktur, die
als sogenannter Scene Graph bezeichnet wird. Eine VRML-Datei enthält somit genau einen
Scene Graph.
Abbildung 2.7: Hierarchische Objektstruktur in VRML-Dokumenten [Klo98]
Das Zusammenspiel dieser vielen Knoten gestaltet sich derart, dass auf der höchsten Ebene
die Gruppenknoten stehen, die alle untergeordneten (Kind)-Knoten manipulieren. Innerhalb
der einzelnen Kindknoten befinden sich spezifische Objektknoten (sie dienen der Erzeugung
und Gestaltung der geometrischen Objekte), die ausschließlich in der definierten Umgebung
18
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
vorkommen und wiederum von dieser beeinflusst werden. Veränderungen im Gruppenknoten
pflanzen sich somit bis zu den Objektknoten fort.
Das Beispiel in Abbildung 2.8 zeigt einen Gruppenknoten mit zwei Kindknoten. Der erste
Kindknoten ist ein Text, während der zweite eine Fläche darstellt, deren Geometrie durch
einen Koordinatensatz und einem dazugehörigen Index repräsentiert wird. Die Reihenfolge
der Koordinatentrippel ist nicht von Bedeutung, die Reihenfolge der Indizes aber sehr wohl.
DEF Objekt1 Group {
children [
Transform {
translation 733.79 996.27 122.8
rotation 0 0 0 0
children [
Shape {
geometry Text {
S
string ["Objekt 1"]
}
}
]
}
DEF Flaeche1 Shape {
appearance Appearance {
material Material {diffuseColor 0.5 1 0.5}
}
geometry IndexedFaceSet {
solid FALSE
convex TRUE
coord Coordinate { point [
733.79 996.27 122.8, 743.93 972.67 122.7, 743.93
972.67 133.1,
733.79 996.27 133.1
]
}
coordIndex[0, 1, 2, 3, -1
]
}
}
]
}
Abbildung 2.8: Beispiel für VRML-Szenegraph mit Gruppen- und Kindknoten. Aus
der Datenbank per VRML-Export generiert.
2.4. VIRTUAL REALITY MODELING LANGUAGE
19
Erläuterung des Beispiels:
Typen werden groß, Eigenschaften und Attribute klein geschrieben.
Mit DEF gibt man den Knoten Namen.
Transform ist ein spezieller Gruppenknoten, so dass sich die translation und
rotation nur auf den darunter liegenden Kindknoten (mit dem Text) auswirkt.
Shape ist ein Kindknoten, seine geometrie ist vom Typ Text und dieser enthält
den String „Objekt1“
Der Kindknoten Fläche1 vom Typ Shape besitzt zwei Eigenschaften,
appearance und geometry.
appearance besitzt u.a. die Eigenschaft material, die wiederum das Attribut
diffusecolor besitzt.
Die Eigenschaft geometry des Kindknoten ist vom Typ Indexfaceset. Dieser
Typ entspricht einem planaren Polygon auf das man direkt Texturen aufbringen kann.
Die Eigenschaften solid und convex sind für die Visualisierung notwendig,
Coordinate und CoordIndex beschreiben das Polygon.
Zu CoordIndex:
Die Reihenfolge der Koordinaten in Coordinate ist unbedeutend. Das Polygon muss jedoch aus einem geschlossen Linienzug bestehen und seine Knotenpunkte rechts herum laufen,
um die beiden Seiten einer Fläche eindeutig zuordnen zu können (vgl. Abschnitt 2.3.1). Um
dies zu erreichen, werden in der Zeile mit den Koordinatenindizes CoordIndex die Punkte
in der rechts umher laufenden Reihenfolge eingetragen. Dabei ist 0 das Koordinatentrippel an
der Stelle 0 in der Koordinatenzeile, 1, 2 und 3 analog die Punkte an den Stellen 1, 2 und 3.
Mit –1 wird das Ende des Polygons markiert und automatisch geschlossen. Andere Programme benötigen hier nochmals die erste Koordinate.
2.5 Datenbanken
Eine Datenbank ist nur eine Sammlung von Daten. Ein Datenbankmanagementsystem
(DBMS) wird auch gerne als Datenbank bezeichnet, ist aber in Wirklichkeit ein Programmsystem, dass eine Datenbank für mehrere Nutzer zur gleichzeitigen Benutzung so zur Verfügung stellt, dass kein Nutzer den Datenbestand schädigen kann [Ull88] .
DBMS können nach ihrem typischen Datenmodell unterschieden werden:
Hierarchische Datenbanken
Relationale Datenbanken
Objektorientierte Datenbanken
Graphische Datenbanken
Das von in dieser Arbeit verwendete DBMS Oracle (9.2i) ist eine Relationale Datenbank, die
darüber hinaus über Funktionen einer objektorientierten Datenbank verfügt. Oracle nennt sein
DBMS daher objekt-relational.
20
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
2.5.1 Relationales Schema
In einem relationalen Datenbankschema - der Großteil der heute eingesetzten DBMS sind
immer noch ausschließlich relationale Datenbanken - werden die Informationen in Tabellen
abgelegt. Die Spalten einer Tabelle werden durch einen Datentyp festgelegt und in jeder Zeile
steht ein neuer Eintrag. Sinnvoller Weise wählt man als erste Spalte einen unified identifier
(UID), genannt Primärschlüssel um alle Spalten eindeutig von einander unterscheiden zu
können.
Bei dem Beispiel aus Abbildung 2.6 sieht die Tabellen etwa so aus:
Tabelle Vertex:
Vertex_ID
X_Coord
1
10,002
2
12,000
3
3,459
…
Y_Coord
9,765
13,004
4,110
Tabelle Edge:
Edge_ID
First_Vertex
201
1
202
2
203
3
…
Last_Vertex
2
3
7
Tabelle Vertex_Edge:
Vertex_Edge_ID
Vertex_ID
1001
4
1002
5
1003
6
…
Z_Coord
0,000
5,553
10,421
Edge_ID
203
203
203
Prev_VE_ID
NULL
1001
1002
Next_VE_ID
1002
1003
1004
Der Primärschlüssel (PK) dient zur eindeutigen Identifizierung einer Zeile der gleichen Tabelle. Demnach ist es nicht erlaubt, den gleichen Wert in einer Tabelle mehrfach zu verwenden.
Allerdings ist es möglich, diesen bei mehreren unterschiedlichen Tabellen einzusetzen. Die
unterschiedlichen Werte für den PK sollen das Beispiel übersichtlicher halten.
Die PK’s der Tabelle Vertex erscheinen in der Tabelle Edge als Fremdschlüssel (FK). Man
speichert in der Tabelle Edge also nicht nochmals die Koordinaten der betreffenden Punkte
sondern zeigt nur auf die Tabelle, wo die Informationen liegen. Diese Vermeidung von Redundanzen ermöglicht zum einen eine effizientere Datenspeicherung, aber vor allem müssen
bei der Änderung der Koordinaten nur die Werte in einer einzigen Tabelle geändert werden.
2.5. DATENBANKEN
21
Die Tabelle Edge weist eine 1:n-Beziehung auf. Mehrere Edges, mit unterschiedlichen
Edge_ID’s könnten die gleichen Fremdschlüssel in den Spalten First_Vertex und
Last_Vertex besitzen. Ein Vertex könnte also in mehreren Edges vorkommen. Damit eine
Edge aber aus mehreren, beliebig vielen Vertices bestehen kann, braucht man die Tabelle
Vertex_Edge. Hier wird die m:n-Beziehung realisiert. Durch die entsprechenden Einträge
in der Tabelle Vertex_edge besitzt die Edge 203 die Vertices 3, 4, 5, 6, 7. Die Reihenfolge
der Vertices 4, 5 und 6 ergeben sich aus den Spalten Prev_VE_ID und Next_VE_ID, 3
und 7 sind Anfangs- und Endpunkt, definiert in der Tabelle Edge. Der Wert NULL, der in der
Tabelle Vertex_Edge auftaucht, bedeutet nur, dass an dieser Stelle keine Information steht.
Dieses System konsequent weitergeführt ergibt letztendlich das komplette relationale Datenbank-Schema.
2.5.2 Objekt-relationales Schema
Oracle nennt sein DBMS wie in 2.3 bereits erwähnt objekt-relational. Zu den Funktionen einer relationalen Tabelle kommen also noch objektorientierte Funktionen hinzu.
Objektorientierung ist seit Anfang der 90er Jahre zu einem großen Schlagwort in der Informatik geworden.
„I have a cat named Trash. In the current political climate, it would seem that if I were trying
to sell him ( at least to a computer scientist), I would not stress that he is gentle to humans and
is self sufficient, living mostly on field mice. Rather, I would argue that he is object-oriented.”
R. King, 1989, [Kin89]
Bei der Objektorientierung sind drei Stichworte auch für die Welt der Datenbanken von großer Bedeutung: Abstraktion, Generalisierung und Aggregation.
Hinter der Abstraktion verbirgt sich die Trennung zwischen Konzept und Umsetzung. In der
Realität ist diese Unterscheidung sehr bedeutsam. Wer weiß, wie man einen Lichtschalter
betätigt, ist auch in der Lage andere Schalter zu betätigen. Wer einen Führerschein hat, kann
ein Auto fahren, ohne dessen kompliziertes Innenleben im Detail verstanden zu haben. Diese
Unterscheidung findet sich in den Begriffen Objekt und Klasse wieder. Ein Objekt ist tatsächlich existierend, die Klasse dagegen beschreibt dieses oder mehrere Objekte. Genauer gesagt,
die Klasse beschreibt, wie das Objekt zu bedienen ist, welche Eigenschaften das Objekt besitzt und wie das Objekt hergestellt wird.
Bei der Generalisierung und Spezialisierung wird durch Vererbung eine „is-a“-Beziehung
ausgedrückt. Eine Klasse wird dabei nicht völlig neu definiert, sondern aus einer Superklasse
22
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
(Vaterklasse) abgeleitet. Die abgeleitete Klasse wird auch Subklasse genannt. Ein Beispiel
dafür soll Abbildung 2.9 geben.
Abbildung 2.9: Beispiel einer Vererbung, „is-a“-Beziehung [OGCa]
Unter Aggregation versteht man den allgemeinen Fall des einfachen Aufnehmens anderer
Objekte, man spricht hier von einer „part-of“-Beziehung. Diese Beziehung ist jedoch nicht
wie „is-a“ essentiell für die Existenz des aufnehmenden Objektes. Die explizite Anwendung
der (rekursiven) Aggregation wird in den Abschnitten 3.1.2 und 3.2.2 noch genauer erläutert.
Oracle stellt drei Brücken [McC02] zur Verfügung, um das Beste aus beiden Welten nutzen
zu können:
Eine Objektansicht. Eine Objektansicht bildet relationale Tabellen auf eine Objekttabelle ab.
Ähnlich wie relationale Ansichten enthält eine Objektansicht selbst keine eigenen Daten, sondern stellt nur eine bestimmte Methode dar, die zu Grunde liegenden Tabellen zu betrachten.
Mit Hilfe der Objektansicht können vorhandene relationale Tabellen auf eine objektorientierte
Art und Weise angezeigt werden.
Eine Objekttabelle. Eine Objekttabelle ist eine Tabelle, deren Zeilen durch einen Objekttyp
und nicht durch explizite Spalten definiert werden. Die Elemente innerhalb des Objekttyps
definieren, welche Daten in der Objekttabelle gespeichert werden.
Zusätzlich kann eine Objekttabelle Objektmethoden enthalten, mit denen die Daten manipuliert werden können und die mit der Tabellendefinition gespeichert werden. Anders ausgedrückt: In Objekttabellen sind sowohl Daten als auch Anwendungsprozeduren in einem Ob-
2.5. DATENBANKEN
23
jekt zusammengefasst. Objekttabellen können auch über Primärschlüssel und Indizes (schnelle Zugriffspfade) verfügen.
Eine Objekttabelle, die Objektspalten und relationale Spalten verbindet. Eine relationale
Tabelle mit einer oder mehreren Spalten, deren Datentyp durch einen Objekttyp definiert
wird. Eine Objektspalte ist eine Spalte mit einem Objekttyp-Attribut als Datentyp.
Bei dem in dieser Arbeit entwickelten Datenbank-Schema werden ausschließlich Objekttabellen verwendet.
Die Attribute eines Objektes können folgendermaßen definiert werden:
Eine normale Spalte. Jeder Datentyp kann hier eingesetzt werden. Standard-Datentypen sind
u.a.: Number (=Integer), Varchar (=String), Date, Blob (= Binary Large Object) oder Float.
Eine Liste. In Bezug auf Objekte wird eine Liste als Array bezeichnet. Die Größe dieses Array wird festgelegt und kann nicht nachträglich geändert werden.
Eine eingebettete Tabelle. Diese Art von Attribut wird nested table genannt und es handelt
sich dabei um eine Datentabelle innerhalb eines Objektes, deren Größe variabel ist. Mit nested
tables können m:n-Relationen hergestellt werden. Mehr dazu in Abschnitt 2.5.3.
Ein anderes Objekt. Das Objekt, das vorher (zumindest namentlich, nicht inhaltlich) definiert sein muss, wird wie eine weitere Spalte behandelt. Anders als eine normale Spalte hat es
aber seine eigene Liste mit Attributen, die als normalen Spalten, Array, eingebetteten Tabellen oder weiteren Objekten bestehen kann. Der Vorteil besteht z.B. darin, dass dieses Objekt
in vielen anderen Objekten wiederverwendet werden kann.
Objektreferenz
Die Objektreferenz oder REF ist ein spezieller Datentyp, der für Objekttabellen geschaffen
wurde. Sie funktioniert wie ein Fremdschlüssel, sie definiert die Beziehung zwischen zwei
Objekten. Im Gegensatz zur Fremdschlüsselspalte einer relationalen Tabelle wird hier kein
unified identifier (UID) vom Nutzer eingegeben, sondern von der Datenbank festgelegt. Bei
einer Abfrage hat das den Vorteil, keine UID’s zu verwenden, sondern mittels des Befehls
deref die Beziehung zwischen zwei Objekten wieder herzustellen. (Siehe hierzu auch Abschnitt 2.5.4)
Im Application Developer’s Guide – Object-Relational Features [Oraa] findet man eine detailierte Beschreibung der objekt-relationalen Fähigkeiten von Oracle. Darüber hinaus befindet
sich dort in Abschnitt 9 ein Beispiel für die Entwicklung einer objekt-relationalen Datenbank.
24
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
2.5.3 Nested Tables
Im relationalen Schema wurden m:n-Beziehungen durch eine zusätzliche Tabelle realisiert.
Im objekt-relationalen Schema passiert prinzipiell nichts anderes, allerdings hat der Benutzer
hier keinen direkten Zugriff auf diese Tabelle. Der Inhalt einer solchen nested table wird in
ein Objekt eingebettet. Bei der Anzeige eines Objekts werden dem Nutzer nur die Zeilen aufgelistet, die auch zu diesem Objekt gehören. Für die Zeile A werden also die Elemente A11,
A12 und A13 aufgelistet (Abbildung 2.10). Dieses Verfahren vereinfacht die Handhabung
und setzt den Gedanken der Objektorientierung konsequent fort. Eine von der Datenbank generierte 16 byte lange NESTED_TABLE_ID setzt die übergeordnete Zeile aus einem Objekt
mit den Zeilen des korrespondierenden nested tables in Verbindung.
Abbildung 2.10: Schematische Darstellung eines nested tables [Oraa]
Besitzt die nested table einen Primärschlüssel, wird die Tabelle als index-organisierte Tabelle
(IOT) behandelt. Die Datenbank sortiert die Zeilen nach ihren übergeordneten Zeilen, um die
Effizienz von Zugriffen zu steigern. Wenn man darüber hinaus bei der Erstellung des nested
tables den Befehl COMPRESS angibt, wird der Schlüssel zur übergeordneten Tabelle nur
einmal gespeichert (Siehe Abbildung 2.11). Die SQL-Statemens, die einen nested table erstellen, werden in Abschnitt 3.2.3 nochmals aufgegriffen.
Zum Zeitpunkt dieser Arbeit sind nested tables noch nicht durch die Abfrage-Sprache SQL
(Abschnitt 2.5.4) standardisiert. Dies soll sich für die kommende Version von SQL ändern
und es ist davon auszugehen, dass die Spezifikationen sehr nahe an der Umsetzung durch
2.5. DATENBANKEN
25
Oracle sein werden. Spätestens dann ist das Datenmodell 1:1 auf andere objekt-relationale
DBMS umsetzbar.
Abbildung 2.11: nested table, komprimiert [Oraa]
2.5.4 Structured Query Language (SQL)
Um Datenmanipulationen bei relationalen Datenbanken durchzuführen, wird zumeist SQL
(Structured Query Language = Strukturierte Abfrage Sprache) verwendet. SQL ist eine
nichtprozedurale, relationenalgebraische Sprache. Im Gegensatz zu einer prozeduralen Sprache muss SQL nicht mitgeteilt werden, wie ein Problem zu lösen ist, sondern es muss nur
beschrieben werden, welches Problem zu lösen ist.
Die Grundform einer SQL-Abfrage besteht aus fünf Klauseln [McC02]:
SELECT
Hier gibt man die Liste der Spalten an, die man sehen möchte. Es ist auch möglich Spalten mehrerer Tabellen auszuwählen.
FROM
Hier gibt man die Namen der Tabellen an.
WHERE
(Optional) Bedingungen wie Vergleiche, Begrenzungen, Beziehungen zwischen Tabellen usw. können hier angegeben werden. Mehrere WHEREKlauseln werden mit einem AND verbunden. Ohne die WHERE-Klausel werden immer alle Zeilen gewählt.
GROUP BY (Optional) Wenn Daten zusammengefasst werden sollen, kann man das mit
dieser Klausel tun.
ORDER BY (Optional) Für die Ausgabe werden die Daten hier anhand der Reihenfolge, wie
die Spalten hier angegeben werden, sortiert.
26
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
Einige Beispielabfragen:
SELECT * FROM Knoten_objtab WHERE ID_Knoten <5;
ID_KNOTEN
---------1
2
3
4
X
---------3445743,93
3445733,79
3445718,64
3445720,76
Y
Z
---------- ---------5539972,67
122,7
5539996,27
122,8
5539989,87
122,8
5539985,06
122,8
SELECT * FROM Knoten_objtab k WHERE ID_Knoten <5 AND z >122.7
ORDER BY y;
ID_KNOTEN
---------4
3
2
X
---------3445720,76
3445718,64
3445733,79
Y
Z
---------- ---------5539985,06
122,8
5539989,87
122,8
5539996,27
122,8
Mit der Objektreferenz aus Abschnitt 2.5.2 kann man nun ganz einfach die Anfangsknoten
von mehreren Kanten ausgeben, ohne dabei in der WHERE-Klausel Bedingungen über die
Zugehörigkeit von Knoten zu Kanten anzugeben, wie es in der relationalen Form der Fall wäre:
SELECT
ID_Kante,
deref(Anfang_ref).id_knoten,
deref(Anfang_ref).x,
deref(Anfang_ref).y,
deref(Anfang_ref).z
FROM Kante_objtab
WHERE ID_Kante <5;
ID_KANTE ID_KNOTEN
X
Y
Z
-------- --------- ----------- ----------- -----1
2 3445733,79 5539996,27 122,8
2
1 3445743,93 5539972,67 122,7
3
11 3445743,93 5539972,67 133,1
4
3 3445718,64 5539989,87 122,8
2.5. DATENBANKEN
27
In der relationalen Form gäbe es jetzt analog zu Abbildung 2.6 zusätzlich eine Tabelle Kante_Knoten, aus der die m:n-Beziehungen ermittelt werden müssten. Die SQL-Abfrage sähe in
etwa so aus:
SELECT
KA.ID_Kante,
KO.x,
KO.y,
KO.z
FROM Kante_objtab KA, Kante_objtab KO, Kante_Knoten KK
WHERE
KA.ID_Kante <5 AND
KK.ID_Kante = KA.ID_Kante;
In den Abbildungen 2.12 und 2.13 finden sich zwei SQL-Abfragen, die alle Koordinaten eines
Gebäudes wiedergeben. In der Abfrage aus Abbildung 2.12 werden für jede Zeile in volumen_objtab sechs in einander verschachtelte Objekt-Referenzen aufgerufen. Mit Hilfe
eines „Joins“ (Abbildung 2.13, vorletzte Zeile), wie er auch in der obigen Abfrage in der
WHERE-Klausel zu finden ist, konnte die gleiche Abfrage wie in Abbildung 2.13 erheblich
beschleunigt werden.
SELECT
v.id_volumen,
m.masche_ref.aussen_ref.id_ring,
h.kante_ref.anfang_ref.id_knoten,
h.kante_ref.anfang_ref.x,
h.kante_ref.anfang_ref.y,
h.kante_ref.anfang_ref.z,
h.kante_ref.ende_ref.id_knoten,
h.kante_ref.ende_ref.x,
h.kante_ref.ende_ref.y,
h.kante_ref.ende_ref.z,
h.sortvar
FROM
volumen_objtab v,
TABLE (v.maschenliste_ntab) m,
TABLE(m.masche_ref.aussen_ref.kantenliste_ntab) h
WHERE
id_volumen = 1
ORDER BY m.masche_ref.aussen_ref.id_ring, h.sortvar;
Abbildung 2.12: SQL-Abfrage eines Gebäudes ohne JOIN
28
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
SELECT
v.id_volumen,
m.masche_ref.aussen_ref.id_ring,
l.kante_ref.anfang_ref.id_knoten,
l.kante_ref.anfang_ref.x,
l.kante_ref.anfang_ref.y,
l.kante_ref.anfang_ref.z,
l.kante_ref.ende_ref.id_knoten,
l.kante_ref.ende_ref.x,
l.kante_ref.ende_ref.y,
l.kante_ref.ende_ref.z,
l.sortvar
FROM
ring_objtab r,
volumen_objtab v,
table(r.kantenliste_ntab) l,
table(v.maschenliste_ntab) m
WHERE
v.id_volumen = 1 and
m.masche_ref.aussen_ref.id_ring = r.id_ring
ORDER BY r.id_ring, l.sortvar;
Abbildung 2.13: SQL-Abfrage eines Gebäudes mit JOIN
Wie bereits in Abschnitt 2.5.3 erwähnt, werden nested tables in anderen Tabellen gespeichert
als die Objekte. Bei der SQL-Abfrage in Abbildung 2.13 wird dies über den Befehl TABLE
realisiert, der die eingebettete Tabelle aus dem jeweiligen Objekt darstellt.
Vor der Datenabfrage muss man natürlich Tabellen erstellen und diese auch mit Daten füllen.
Mit dem Befehl
CREATE OR REPLACE TYPE Knoten_objtyp;
wird ein Objekt erstellt. Es ist möglich, nur den Tabellennamen ohne seine Spalten zu definieren. Das ist ggf. nötig, um Vererbungen oder Referenzierungen durchzuführen.
CREATE OR REPLACE TYPE Knoten_objtyp AS OBJECT
(ID_Knoten
NUMBER,
x
NUMBER,
y
NUMBER,
z
NUMBER) NOT FINAL;
2.5. DATENBANKEN
29
Erst hier wird festgelegt, dass es sich bei der angelegten Tabelle um eine Objekt-Tabelle handelt. Mit dem Befehl NOT FINAL legt man fest, dass dem Objekt später Attribute oder Methoden hinzugefügt, entfernt oder geändert werden können.
CREATE TABLE Knoten_objtab OF Knoten_objtyp
(PRIMARY KEY (ID_Knoten))
OBJECT IDENTIFIER IS PRIMARY KEY;
Nachdem das Objekt erstellt wurde kann die Tabelle erzeugt werden. Erst hier wird ein Attribut als Primärschlüssel deklariert.
2.5.5 Java-Schnittstelle
Die Java Database Connection (JDBC) ist eine standardisierte Schnittstelle zwischen Java und
einer Datenbank, basierend auf der Abfrage-Sprache SQL. Mit Hilfe von JDBC werden also
SQL-Kommandos zwischen Java und der Datenbank ausgetauscht.
Für die Installation empfiehlt sich die Lektüre des Oracle JDBC Developers Guide and Reference [Orab].
Die Verbindung zwischen Java und der Oracle-Datenbank ist mit zwei verschiedenen Treibern möglich, dem JDBC-Thin-Treiber und dem JDBC-OCI-Treiber.
Der Thin-Treiber wurde komplett in Java programmiert und ist somit plattformunabhängig,
auf der Client-Seite bedarf es keinerlei Oracle-Software. Ein Java-Applet in einem Browser
oder ein eigenständiges Java-Programm kann mit diesem Treiber über das TCP/IP-Protokoll
eine direkte Verbindung zur Datenbank aufbauen.
Der OCI-Treiber wurde für einen Oracle Client-Server Betrieb entwickelt, er setzt also auf
der Client-Seite eine Oracle-Client Installation voraus, wodurch der Treiber auf die von Oracle unterstützten Plattformen begrenzt ist. Dieser Treiber wurde in einer Kombination aus Java
und C geschrieben und setzt die JDBC-Aufrufe in sein eigenes OCI-Interface um. Die Kommunikation zum Oracle Datenbank-Server erfolgt dann über den Oracle Net Adapter, der
wiederum TCP/IP und IPX/SPX unterstützt.
Wie in Abbildung 2.14 zu sehen ist, bietet der OCI-Treiber mehr Funktionen und mehr Performance, die Arbeit mit ihm bedeutet jedoch deutlich mehr Aufwand als mit dem ThinTreiber. Letztendlich war das der Ausschlag dafür, den Thin-Treiber zu wählen.
30
KAPITEL 2 – 3D-REPRÄSENTATION UND DATENBANKASPEKTE
Abbildung 2.14: Vergleich der Oracle JDBC-Treiber [Orab]
Zum Aufbau einer Verbindung verwendet man in Java einen Connection String
String connect_string =
jdbc:oracle:thin:USER/PASSW@IPADRESS:1521:DBNAME";
Die IP-Adresse des Oracle-Servers kann als IP-Adresse oder DNS-Name eingetragen werden,
die Zahl 1521 ist der von der Oracle-Installation gewählte Standard-Port des JDBC-listeners.
Der Name der Datenbank muss unter DBNAME eingetragen werden.
In den folgenden Befehlen wird der JDBC-Treiber geladen, eine Verbindung aufgebaut und
ein SQL-Statement kreiert.
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
conn = DriverManager.getConnection (connect_string);
stmt = conn.createStatement ();
Dieses Statement nimmt dann den SQL-Befehl im Klartext auf, und sendet ihn an die Datenbank:
ResultSet rset = NULL;
rset = stmt.executeQuery ("SELECT 'Hello JDBC: ' || SYSDATE
FROM DUAL");
Die Antwort der Datenbank, das Resultset wird dann mit diesem Befehl ausgewertet:
while (rset.next ())
System.out.print(rset.getString (1) + "\n");
ResultSet und Verbindung müssen zum Schluss noch ordnungsgemäß geschlossen werden:
rset.close();
conn.close();
2.5. DATENBANKEN
31
Auf diese Weise können Befehle wie SELECT, Update oder Insert an die Datenbank
übermittelt werden. Um eine Tabelle mit vielen Daten zu füllen, müssten tausende InsertBefehle übertragen werden, die jeweils eine neue Zeile hinzufügen. Mit einem Prepared Statement (pstmt) kann diese Aufgabe wesentlich schneller gelöst werden:
for (i=0; i<max; i++)
{
DB.pstmt.setInt(1, Knoten_ID);
DB.pstmt.setDouble(2, x[i]);
DB.pstmt.setDouble(3, y[i]);
DB.pstmt.setDouble(4, z[i]);
DB.pstmt.addBatch();
}
Nachdem die For-Schleife beendet wurde, kann der Batch-Stapel mit einem Befehl an die
Datenbank übergeben werden:
DB.pstmt.executeBatch();
Die Technologien und Konzepte aus diesem Kapitel sollen die Grundlage für die Beschreibung der Entwicklung eines objekt-relationalen Datenmodells sein, welches im folgenden
vorgestellt wird.
Kapitel 3
Implementierung des Datenmodells
In Abschnitt 2.1 wurden bereits zwei Datenmodelle vorgestellt, die „3D Vector Maps“ von
Molenaar und SOMAS von Pfund. Dieses Kapitel wird in Abschnitt 3.1 das Modell „Regengeld“ (Abbildung 3.5) vorstellen und in Abschnitt 3.2 die Umsetzung dieses Modells in ein
objekt-relationales Datenmodell beschreiben. Abschnitt 3.3 erläutert die SQL-Anweisungen,
mit denen das objekt-relationale Modell erstellt wurde.
3.1 Modell „Regengeld“
Am Institut für Geoinformation und Kartographie der Universität Bonn wurde in einem Kooperationsprojekt mit dem Institut für Photogrammetrie für die Stadt Wuppertal ein geometrisch-topologisches 3D-Stadtmodell entwickelt [Bru02]. Das Datenmodell sollte den folgenden Anforderungen entsprechen:
Multifunktionale Nutzung
Neben der Visualisierung soll das Datenmodell insbesondere für raumbezogene und / oder
thematische Anfragen und Auswertungen geeignet sein. Es soll sich als Basismodell für die
Anbindung von Fachanwendungen eignen.
Berücksichtigung von ISO-Standards
Zur Gewährleistung von Interoperabilität werden die räumlichen Objekte entsprechend existierender ISO-Standards (ISO 19107: Spatial Schema) modelliert. Zwei wesentliche Entwurfsentscheidungen wurden dadurch impliziert:
1) Die Objektgeometrien werden durch eine geometrisch-topologische Modellierung repräsentiert.
2) Der ISO-Standard sieht zur Repräsentation von 3D-Volumenmodellen ausschließlich die
Randflächendarstellung (B-Rep) vor.
32
3.1. MODELL „REGENGELD“
33
Hierarchische Gliederung
In Anlehnung an die Modellierung von ALKIS soll das Modell hierarchisch in Ebenen gegliedert sein: In der unteren Ebene befindet sich das geometrisch-topologische Basismodell,
darüber die Aggregationsebene und oben die anwendungsbezogen Modellierung. Verbindungen zu ALKIS-Objekten sollen realisiert werden können.
Der Kern des Datenmodells wird durch die geometrisch-topologische Modellierung von 0-,
1-, 2- und 3-dimensionalen Primitiven gebildet. Sie bauen auf einander auf und realisieren ein
Knoten-, Kanten-, Flächen- und Volumenmodell.
3.1.1 Primitive
Knoten- und Kantenobjekte:
Nur die Knotenobjekte besitzen Koordinaten. Kantenobjekte sind Geraden, sie definieren sich
durch ihren Anfangs- und Endknoten und legen so ihre Geometrie implizit fest.
Flächenobjekte
Flächen werden durch die Angabe der Kanten des Umringpolygons beschrieben. Da Flächen
auch Löcher haben können, ist es nicht ausreichend, nur einen äußeren Flächenumring vorzusehen. Flächen werden deshalb durch Maschen repräsentiert, die genau einen äußeren Umring
und keinen, einen oder mehrere innere (Loch-)Umringe besitzen. Ein Umring ist dabei eine in
einer beliebigen Umlaufrichtung geordnete Menge von mindestens drei Kanten. Da nur ebene
Flächen repräsentiert werden sollen, gilt für alle Knoten des äußeren und der inneren Umringe
die Bedingung, dass sie in einer Ebene liegen müssen, also koplanar sind.
Volumengeometrie
Volumenkoerper
0..2
Orientierung
4..*
begrenzt_von
Flaechengeometrie
Masche
1..0
0..*
innerer
1
1
äußerer
Ring
0..2
3..*
{ordered}
besteht_aus
Liniengeometrie
Kante
Knoten
0..*
1
−x:Koordinate
Endknoten −y:Koordinate
0..*
1 −z:Koordinate
Startknoten
Abbildung 3.1: UML-Diagramm der geometrisch-topologische Modellierung eines
Volumenkörpers [Bru02]
Zur UML-Notation
Das UML-Diagramm stellt Klassen mit ihren Attributen dar, sowie die Assoziationen zwischen diesen Klassen [RJB99]. Die Assoziation benennt die Beziehungen zwischen den Klassen und gibt Multiplizitäten an. So kann die Klasse Knoten in 0 bis beliebig vielen
34
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
Klassen Kanten vorkommen, sowohl als Endknoten, als auch als Startknoten. Eine Kante besitzt aber immer genau einen Endknoten und einen Anfangsknoten. Analog dazu sind auch alle
anderen UML-Diagramme zu lesen, die sich auf das Modell Regengeld beziehen.
Modellierung
Das in Abbildung 3.1 dargestellte UML-Diagramm zeigt die Modellierung eines Volumenkörpers. Höherdimensionale Objekte setzen sich aus Primitiven der darunter liegenden Dimensionen zusammen, die aber auch Bestandteil mehrerer Objekte sein können. So besitzen
beispielsweise zwei benachbarte Flächen eine gemeinsame Kante, die nur einmal existiert,
aber von beiden Umringen aus referenziert wird. Dieses Vorgehen hat den Vorteil, dass die
redundante Speicherung von (Teil-) Geometrien vermieden wird. Gleichzeitig ist damit sichergestellt, dass sich berührende bzw. aneinandergrenzende Objekte einerseits nicht überlappen und andererseits keine dazwischenliegenden Klaffungen aufweisen.
Volumenobjekte
Die Randflächen eines Volumens müssen aus mindestens vier Flächen bestehen. Jede Fläche
wird durch eine orientierte Masche repräsentiert. Die Orientierung gibt dabei an, welche Seite
der Masche nach innen bzw. nach außen zeigt. Zur Festlegung einer eindeutigen Orientierung
wird angenommen, dass wenn man senkrecht auf eine Masche schaut und die Kanten des äußeren Rings in linker Umlaufrichtung sortiert sind, der Normalenvektor zum Betrachter zeigt.
Sollen Fenster in Wänden explizit repräsentiert werden, so können die Fenster zunächst als
Löcher in der Wandfläche dargestellt werden. Dazu werden zu der Wandmasche gemäß der
Fensterumrandungen innere Ringe hinzugefügt. Damit die Fläche insgesamt geschlossen
bleibt, wird jedes Fenster durch eine eigene Masche repräsentiert, deren äußerer Ring identisch mit dem entsprechenden inneren Ring der Wandfläche ist.
Materialeigenschaften
0..1
oben
Flaechengeometrie
Masche
0..1
unten
Phototextur
−Bitmap:Binaer
−Tranformationsmatrix:Matrix
einfarbiges Material
−RGB_Wert:(int , int , int )
Abbildung 3.2: Materialmodellierung für Flächen. Eine Masche kann auf der Oberund Unterseite als Material eine Textur oder ein einfarbiges Material
aufweisen. [Bru02]
3.1. MODELL „REGENGELD“
35
Material
Um die Erscheinungsform von Flächen angeben zu können, kann grundsätzlich jeder Flächenseite eine eigene Materialeigenschaft zugewiesen werden. Vorder- und Rückseite einer
Masche können somit unterschiedliche Eigenschaften erhalten. Die Klasse Materialeigenschaften ist eine abstrakte Klasse und wird zunächst in die zwei Unterklassen einfarbiges Material und Phototextur spezialisiert. Die hier verwendete UML-Notation (Pfeil) bedeutet in
diesem Fall eine Generalisierung der Klasse Phototextur zur Klasse Materialeigenschaften.
Das Material ist entweder ein einfarbiges Material oder eine Phototextur. Diese ist als Rastergrafik (Bitmap) zusätzlich zu den Transformationsparametern anzugeben. Die Transformationsmatrix beschreibt die Rotation, Skalierung und Translation der Bitmap bzgl. der Koordinaten des Startknotens der ersten Kante des äußeren Umrings der Masche.
3.1.2 Rekursive Aggregation
Unmittelbar über dem Basismodell befindet sich die Aggregationsebene. Hier werden die
Schemata definiert, die beschreiben, wie Primitive eines Typs zu komplexen Objekten des
gleichen Typs aggregiert werden. Ein Gebäude könnte demnach in mehrere, einzeln repräsentierte Gebäudeteile wie z.B. in Haus und Garage, und das Haus wiederum in Haupttrakt und
Nebentrakt zerlegt und in dieser Struktur als Aggregat gespeichert werden. Einfache Gebäudemodelle besitzen zumeist keine Zerlegung in Gebäudeteile, so dass in den meisten Fällen
keine Aggregation stattfindet.
Es gibt Aggregate für Kanten, Flächen und Volumenkörper. Da diese zur Definition der Objektgeometrie verwendet werden, heißen die Klassen entsprechend Liniengeometrie, Flächengeometrie und Volumengeometrie. Punktgeometrien bestehen jeweils nur aus einem einzigen
Knoten. Eine aus mehreren Knoten zusammengesetzte Punktgeometrie ist nicht vorgesehen.
Objektgeometrie
Volumengeometrie
−Typ:string
Volumenkoerper
Volumenaggregat
Abbildung 3.3: Aggregation von Volumenkörpern zu (komplexen) Volumengeometrien [Bru02]
36
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
Das Aggregationsschema ist für alle drei Geometrieklassen identisch. Es besteht jeweils aus
einer Oberklasse, die sich zum einen in das zugrundeliegende Primitiv und zum anderen in
eine Aggregatsklasse spezialisiert, die wiederum eine Aggregationsbeziehung zu ihrer Oberklasse besitzt. Diese Aggregation wird in der UML-Notation durch eine Raute dargestellt, sie
stellt eine spezielle Assoziation dar, deren beteiligte Klassen zueinander in Beziehung stehen,
wie ein Ganzes zu seinen Teilen.
Diese Modellierung realisiert eine rekursive Aggregationshierarchie, die sich durch einen
Baum darstellen lässt, dessen Knoten Aggregatobjekte sind und an dessen Blättern die Primitive hängen. Rekursiv bedeutet zunächst einmal nur, dass die Werte einer Funktion derart zusammenhängen, dass sie sich aus einem gegebenen Anfangswert nacheinander durch jeweils
die gleiche Formel berechnen lassen. Der Baum, der eine Aggregationshierarchie darstellt,
kann also beliebig viele Ebenen besitzen. In einem 3D-Stadtmodell wird z.B. die Garage mit
dem Haus aggregiert, danach dieses Aggregat zusammen mit weiteren zu einem Stadtviertel,
mehrere Viertel zu einer Stadt usw.
Bei der Bildung von Volumenaggregaten ist allerdings darauf zu achten, dass sich die Einzelteile zwar berühren, aber nicht durchdringen dürfen. An den Stellen, an denen sich die Komponenten berühren, müssen diese gemeinsame Flächen, Kanten oder Knoten verwenden. Das
heißt, dass wenn z.B. eine Garage ohne Spalt an die Seitenwand eines Gebäudes gebaut wurde, und Haus und Garage durch einen eigenen Volumenkörper repräsentiert werden sollen,
die Berührungsfläche explizit modelliert sein muss. Die Masche, die die Berührungsfläche
repräsentiert, müsste Bestandteil beider Volumenkörper sein. An diesem Beispiel lässt sich im
übrigen auch verdeutlichen, warum bei Volumenkörpern die Orientierung der Maschen explizit angegeben werden muss, und es nicht reicht z.B. zu fordern, dass die Flächennormale immer nach außen zeigen muss. Da dieselbe Fläche Bestandteil der Volumenkörper des Hauses
und der Garage ist, kann sie nur bzgl. eines der Objekte nach außen zeigen.
Der Aufbau einer Flächengeometrie und einer Liniengeometrie geschieht analog dazu, wobei
allerdings darauf zu achten ist, dass sich Linienaggregate (an Knoten) zwar berühren, aber
nicht überlappen dürfen. Um dies zu gewährleisten, darf jede Kante nur einmal innerhalb derselben Liniengeometrie vorkommen.
3.1. MODELL „REGENGELD“
37
DGM
Flaechengeometrie
-Typ:String
Orientierung
Flaechenaggregat
1..*
Geometrie
TIN
1..*
Masche
Dreieck
1
0..1
0..*
Bruchkante
0..2
Kante
3
begrenzt_von
Abbildung 3.4: Spezielles Flächenaggregat TIN [Bru02]
Als ein spezielles Flächenaggregat wurde das TIN ((triangulated irregular network), eine
unregelmäßige Dreiecksvermaschung explizit modelliert. Es leitet sich aus der Klasse DGM
(Digitales Geländemodell) ab und gibt die Geländeoberfläche wieder. Ein TIN ist ein spezielles Flächenaggregat, das sich ausschließlich aus Dreiecken zusammensetzt. Ein Dreieck ist
eine spezielle Masche. Die Klasse Dreieck wird somit als Unterklasse von Masche modelliert.
Zusätzlich können zu einem TIN eine Menge von Bruchkanten angegeben werden, die bei der
Generierung der Dreiecksvermaschung als Zwangskanten eingehen.
Wie man in Abbildung 3.5 erkennt, besteht das Objekt Gebäude aus Volumen-, Flächen und
Liniengeometrien. Damit ist es möglich, beispielsweise ein Haus durch einen geschlossenen
Volumenkörper zu repräsentieren und die Dachüberstände als einzelne Dachteilflächen ohne
volumetrische Ausdehnung an die Traufkanten anzubringen. Genauso kann man eine Antenne
als Linienobjekt auf das Dach setzen.
0..2
Geometrie
1..*
-R G B _ W e rt:(in t , in t , in t )
einfarbiges Material
Geometrie
1..*
Geometrie
1..*
0..*
-Tranformationsmatrix:Matrix
-Bitmap:Binaer
Phototextur
unten
0..1
oben
0..1
äußerer
1
0..*
innerer
1
1..0
Ring
Flaechenaggregat
4..*
Masche
-Typ:String
Orientierung
Geometrie
Flaechengeometrie
Gebaeude
Ueberirdisches Bauwerk
begrenzt_von
Orientierung
Volumenaggregat
Materialeigenschaften
Volumenkoerper
-Typ:string
Volumengeometrie
Objektgeometrie
Ausgestaltung
0..*
1..*
Dreieck
0..2
1
1..*
Geometrie
3..*
0..2
3
0..*
0..*
Linienaggregat
begrenzt_von
Kante
0..*
Bruchkante
{ordered}
besteht_aus
0..1
TIN
Geometrie
-Typ:String
Liniengeometrie
DGM
Startknoten
1
Endknoten
1
-x:Koordinate
-y:Koordinate
-z:Koordinate
Knoten
1
0..*
-Typ:String
Punktgeometrie
38
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
Abbildung 3.4: Gesamtmodell Projekt „Regengeld“ Version vom 13.11.2002 [Bru02]
3.1. MODELL „REGENGELD“
39
3.1.3 Integritätsbedingungen
In Abschnitt 2.1.3 wurden 12 Konventionen aufgestellt, welche die Integrität der Daten sicherstellen sollen. Bezogen auf dieses Modell sind in [Bru02] folgende Integritätsbedingungen aufgestellt worden, die sich mit denen aus 2.1.3 logischerweise stark überschneiden.
•
Es darf keine verschiedenen Knoten mit identischen Koordinaten geben. Wenn zwei
Punkte dieselbe Koordinate besitzen, müssen sie durch den selben Knoten repräsentiert werden.
•
Start- und Endknoten von Kanten müssen unterschiedlich sein. In Verbindung mit der
vorherigen Bedingung wird damit sichergestellt, dass Kanten immer eine Länge > 0
besitzen.
•
Kanten stellen eine gerade Strecke dar, d.h. die Verbindung von Start- und Endknoten
erfolgt auf dem kürzesten Weg.
•
Es darf keine verschiedenen Kanten mit den selben Start- und Endknoten geben.
•
Kanten berühren sich nur in Start- und Endknoten, d.h. es darf keinen Schnitt oder gar
eine Überlappung zweier Kanten geben, die nicht in einem Start- oder Endknoten
liegt.
•
Ein Ring muss ein einfacher Zyklus aus Kanten sein, d.h. nur der erste und der letzte
Knoten des Zyklus dürfen (und müssen) sich berühren.
•
Wenn sich mehrere Ringe berühren, müssen die sich berührenden Elemente (Knoten
oder Kanten) Bestandteil jeweils aller beteiligten Ringe sein.
•
Innerhalb einer Masche dürfen sich der äußere und die inneren Ringe nicht überlappen
und sich höchstens in einem Punkt berühren. Es darf dabei aber nicht der Fall eintreten, dass durch eine Verkettung sich berührender innerer Ringe, die an zwei Knoten
auch den äußeren Ring berührt, die Maschenfläche partitioniert wird.
•
Der äußere und die inneren Ringe einer Masche müssen koplanar sein.
•
Koplanare Maschen dürfen sich nicht überlappen.
•
Volumenkörper dürfen sich nicht durchdringen. Wenn sich Volumenkörper berühren,
müssen die sich berührenden Elemente (Knoten, Kanten oder Maschen) Bestandteil
jeweils aller beteiligten Volumenkörper sein.
40
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
Integritätsbedingungen auf der Anwendungsebene
Generell dürfen sich räumliche 3D-Objekte nicht durchdringen. Dies gilt sowohl für Objekte
der selben Klasse als auch bzgl. der Objekte unterschiedlicher Klassen. Das bedeutet, dass
sich einerseits verschiedene Gebäude nicht durchdringen dürfen und andererseits auch kein
Ausgestaltungselement ein Gebäude durchdringen darf.
Bedingt durch die getrennte Bestimmung eines DGMs und der 3D-Objekte kann es passieren,
dass ein Haus von einer Masche des DGMs durchdrungen wird. Um solche Probleme zu vermeiden, muss die Verbindung von 3D-Objekten und DGMs durch gemeinsame Kanten und
Maschen explizit gemacht werden. Dazu ist der Schnitt der Wandflächen mit dem DGM zu
ermitteln. Die Schnittfläche zerteilt das Gebäude in einen oberirdischen und einen unterirdischen Teil. Die Wandflächen teilen sich dementsprechend in eine Masche, die über der Erde
liegt und eine zweite Masche, die unter der Erde liegt. Die Schnittkanten sind dem DGM als
Zwangskanten hinzuzufügen, so dass die Schnittfläche einerseits die oberirdischen und unterirdischen Gebäudeteile begrenzt und sie andererseits Teil des DGMs bleibt.
3.2 Objekt-relationale Umsetzung
Bei der Umsetzung bestand die Aufgabe darin, das zuvor dargestellte Datenmodell in Oracle
in objekt-relationaler Form abzubilden. Eine 1:1 Umsetzung ist deshalb als problematisch
anzusehen, da in der Datenbank nicht ohne weiteres m:n-Beziehungen dargestellt werden
können und vor allem das Problem der rekursiven Aggregation gelöst werden muss. Dieses
Kapitel beschreibt die Umsetzung und Kapitel 3.3 erläutert die SQL-Anweisungen, mit denen
das objekt-relationale Modell erstellt wurde.
3.2.1 Geometrisch-topologisches Modell
MaschenListe ntabtyp
RingListe ntabtyp
KantenListe ntabtyp
Maschenliste_ntab
-SortVar:NUMBER
Innen_ntab
Kantenliste_ntab
Masche_ref
Volumen objtyp
-ID_Volumen:NUMBER
Ring_ref
Masche objtyp
-ID_Masche:NUMBER
-Orientierung:VARRAY
Ring objtyp
-ID_Ring:NUMBER
Kante_ref
Kante objtyp
-ID_Kante:NUMBER
Knoten objtyp
Ende_ref
Aussen_ref
+sortkante:void
Anfang_ref
-ID_Knoten:NUMBER
-x:NUMBER
-y:NUMBER
-z:NUMBER
Abbildung 3.5: UML-Diagramm der objekt-relationalen Umsetzung für die
geometrisch-topologische Modellierung eines Volumenkörpers
3.2 OBJEKT-RELATIONALE UMSETZUNG
41
Zur Notation
Die hier verwendete Notation weicht zur UML-Notation zu Abbildung 3.1 etwas ab, da hier
ein objekt-relationales Modell beschrieben wird. Auf Multiplizitäten muss hier verzichtet
werden, weil die Datenbank nicht in der Lage ist, solche semantischen Bedingungen zu überwachen, vielmehr müssen die Daten bereits den Integritätsbedingungen aus Abschnitt 3.1.3
genügen.
Jedes abgebildete Objekt entspricht einem Objekttypen in der objekt-relationalen Datenbank,
seine Attribute stehen für die Spalten der Tabelle, in der die Daten eines Objekttypen gehalten
werden (Siehe auch „Objekttabelle“ in Abschnitt 2.5.2). Die Assoziationen zwischen den Objekttypen sind ebenfalls Spaltenelemente der Tabellen, bzw. spezielle Attribute der Objekttypen, nämlich Objektreferenzen. Die Ausnahme bilden dabei Assoziationen vom Typ _ntab,
die einer Referenz auf eine eingebettete Tabelle entsprechen.
Modellierung
Die in Abbildung 3.5 dargestellten Einheiten sind zum einen (in der oberen Reihe) nested
tables, zu erkennen an der Endung ntabtyp und zum anderen Objekttypen. In Abschnitt
3.2.3 wird man erkennen, dass die Objekttypen keine Daten enthalten sondern nur die Tabellen definieren, welche dann die Daten aufnehmen. Am Beispiel zwischen Knoten und Kante erkennt man sehr gut die Bedeutung der Objekt-Referenzen. Der Objekttyp Kante besitzt
eine UID (ID_Kante) und zwei Referenzen auf ihren Anfangs- und Endknoten.
Ein Ring soll aus m Kanten bestehen, die wiederum in n Ringen auftauchen dürfen. Hierfür
wird die nested table KantenListe benötigt. Für jeden Ring existiert eine Liste von Objekt-Referenzen auf Kanten und zusätzlich eine Sortiervariable, welche jeder Kante die Position im Ring zuordnet.
Eine Masche besitzt per Definition (Abschnitt 3.1.1) einen Außenring und 0-n Innenringe.
Der Außenring besteht wie bei der Kante aus einer einfachen Objekt-Referenz, während die
Innenringe durch eine Liste von Objekt-Referenzen dargestellt werden. Zusätzlich zu Ihrer ID
besitzt die Masche eine Orientierung bestehend aus drei Zeilen, die als Listenelement (VARRAY) in das Objekt integriert ist (Abschnitt 2.5.2) und die Richtung des Normalenvektors
festlegen.
Das Volumen besitzt analog dazu ebenfalls eine nested table, in der alle Maschen aufgelistet
werden, aus denen sich ein Volumenkörper zusammensetzt.
An dieser Stelle sei darauf hingewiesen, dass die Vergabe von ID’s für objekt-relationale
Schemata nicht notwendig sind. Wenn man aber JOINS (Abschnitt 2.5.4) verwendet, benötigt
man ID’s. Somit gehen sie zusätzlich in dieses Modell ein.
42
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
3.2.2 Rekursive Aggregation
a)
G2
G1
G3
G6
G2
G1
G1
G2
LinienGeom_ref
Kante_ref
Kante objtyp
G6
G3
LinienAggregat ntabtyp
G4
G3
G7
G5
c)
LinienGeometrie objtyp
-ID_Linie:NUMBER
- is_aggr: NUMBER
LinienAggregat_ntab
G5
b)
G4
-ID_Kante:NUMBER
G4
Abbildung 3.6: Rekursive Aggregation und Umsetzung in objekt-relationales Modell
Abbildung 3.6 verdeutlicht noch einmal die Baumstruktur einer rekursiven Aggregation. Da
die nested table LinienAggregat wieder auf eine neue LinienGeometrie zeigt, sind
unendlich tiefe Aggregationsebenen möglich. In Beispiel c) zeigt die nested table der LinienGeometrie G7 auf die Geometrien G5 und G6. Diese verweisen wiederum auf die Geometrien
G1 und G2, sowie G3 und G4, welche mit der Objekt-Referenz auf die vier abgebildeten Kanten zeigen. Legen wir das Beispiel aus Abbildung 2.10 zu Grunde, würde die eingebettete
Tabelle etwa so aussehen:
Nested Tabel ID Value
G5
G1
G5
G2
G6
G3
G6
G4
G7
G5
G7
G6
Im Vergleich zu Abbildung 3.3 ist diese Umsetzung zwar etwas anders, das Resultat ist jedoch das gleiche, es können unendlich viele Aggregationsstufen mit diesem Modell ermöglicht werden.
Da eine LinienGeometrie entweder eine Liste mit Aggregaten besitzt oder direkt eine
Kante referenziert, hilft die Variable is_aggr dabei, dieses herauszufinden. Eine andere
3.2 OBJEKT-RELATIONALE UMSETZUNG
43
Möglichkeit bestünde darin, herauszufinden, ob die Referenz auf eine Kante NULL ist, oder
nicht.
Abbildung 3.7 zeigt das komplette Modell. Auf die Einflechtung eines TIN’s und eines
DGM’s wurde verzichtet, eine spätere Erweiterung ist aber durchaus möglich. Auf die Unterteilungen in Gebäude oder oberirdisches Bauwerk wurde ebenso verzichtet, da solche Attribute in einer darüber liegenden Ebene gespeichert werden sollten. Egal, ob Brücke, Haus, Straße
oder Gebäude, dies sind alles Attribute, die dem Objekt später vererbt werden können.
Das an oberster Stelle angeordnete Objekt kann wie im Modell „Regengeld“ Volumen-,
Flächen- und Liniengeometrien besitzen. Zusätzlich sitzt in diesem Objekttyp die SpatialTabelle, in der die Koordinaten einer Geometrie gespeichert sind, egal ob es aus Volumen,
Flächen und / oder Linien besteht. Leider stößt man an dieser Stelle an die Grenzen von Oracle, denn wie man an der Endung Objekt_reltab erkennen kann, handelt es sich hier
nicht um einen Objekttypen, sondern um eine einfache relationale Tabelle. Verantwortlich
dafür ist der Spatial-Datentyp mdsys.sdo_geometry. (Sie dazu Abschnitt 4.6). Die Attribute Volumen_ref, Flaeche_ref und Linie_ref sind daher keine ObjektReferenzen, sondern einfache Fremdschlüssel, somit also vom Datentyp NUMBER(ähnlich
integer).
Der SQL-Befehl, mit dem diese rekursive Aggregation abgefragt werden kann, wird in Abschnitt 5.2 genauer erläutert.
Abbildung 3.7: Objekt-relationales Datenmodell
-ID_Masche:NUMBER
-Orientierung:VARRAY
FlaechenAggregat_ntab
-Rot:NUMBER
-Gruen:NUMBER
-Blau:NUMBER
RGB
Aussen_ref
Innen_ntab
Objekt reltab
-ID_Ring:NUMBER
Ring objtyp
Ring_ref
Kantenliste_ntab
Kante objtyp
-ID_Kante:NUMBER
Kante_ref
-SortVar:NUMBER
Kante_ref
-ID_Linie:NUMBER
-is_aggr:NUMBER
LinienGeom_ref
LinienAggregat_ntab
Anfang_ref
Ende_ref
PunktGeometrie objtyp
Knoten objtyp
Knoten_ref
-ID_Punkt:NUMBER
-ID_Knoten:NUMBER
-x:NUMBER
-y:NUMBER
-z:NUMBER
LinienAggregat ntabtyp
LinienGeometrie objtyp
Linie_ref
KantenListe ntabtyp
Flaeche_ref
-ID_Objekt:NUMBER
-world:mdsys.sdo_geometry
RingListe ntabtyp
FlaechenAggregat ntabtyp
FlaechenGeom_ref
Masche_ref
-ID_Volumen:NUMBER
Masche_ref
MaschenListe ntabtyp
-ID_Flaeche:NUMBER
-is_aggr:NUMBER
Masche objtyp
Maschenliste_ntab
VolumenAggregat ntabtyp
Oben
FlaechenGeometrie objtyp
Unten
Material
Volumen objtyp
Volumen_ref
VolumenAggregat_ntab
VolumenGeom_ref
-ID_VolumenGeom:NUMBER
-is_aggr:NUMBER
VolumenGeometrie objtyp
-Bitmap:BLOB
-Transformation:VARRAY
Textur
Volumen_ref
44
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
3.2 OBJEKT-RELATIONALE UMSETZUNG
45
3.2.3 Erstellung des Datenmodells mit SQL
Das Datenmodell kann bei Oracle mit der Enterprise Manager Konsole oder mit SQLBefehlen erstellt werden. Letztere sind in jedem Fall vorzuziehen, da sich damit ObjektReferenzen und eingebettete Tabellen wesentlich flexibler erstellen lassen. Im folgenden finden sich nur die Beispiele für die Implementierung von Punkt- und Liniengeometrie, sowie
den darunter liegenden Typen. Die vollständige Liste der SQL-Befehle befindet sich im Anhang.
Um Objekt-Referenzen zu erstellen, müssen die zu referenzierenden Objekttypen zumindest
namentlich existieren. Daher werden die Typen für Knoten, Kante und Liniengeometrie als
erstes erstellt.
CREATE OR REPLACE TYPE Knoten_objtyp
/
CREATE OR REPLACE TYPE LinienGeometrie_objtyp
/
CREATE OR REPLACE TYPE Kante_objtyp
/
Das LinienAggregat wird nicht referenziert, sondern ist der Objekttyp für eine eingebettete
Tabelle, die direkt im Anschluß definiert wird.
CREATE OR REPLACE TYPE LinienAggregat_objtyp AS OBJECT
(
LinienGeom_ref REF LinienGeometrie_objtyp
) NOT FINAL
/
Mit AS OBJECT legt man fest, dass es sich hierbei um einen Objekttypen handelt. Der Befehl REF weist dem Attribut LinienGeom_ref den Datentyp „Zeiger auf LinienGeometrie_objtyp“ zu, obwohl dieser noch nicht weiter spezifiziert ist. Der Befehl NOT
FINAL ermöglicht es, den Objekttyp später noch zu verändern. Grundsätzlich ist es aber
jederzeit möglich, den Status FINAL oder NOT FINAL zu ändern.
CREATE OR REPLACE TYPE LinienAggregat_ntabtyp AS TABLE OF
LinienAggregat_objtyp
/
Für den späteren Einsatz der eingebetteten Tabelle (nested table) wird hier bereits deren Datentyp als Tabelle in LinienAggregat_objtyp erstellt.
46
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
Da jetzt alle Objekttypen definiert sind, werden ihnen im folgenden die Attribute zugewiesen.
CREATE OR REPLACE TYPE PunktGeometrie_objtyp AS OBJECT
(
ID_Punkt
NUMBER,
Knoten_ref
REF Knoten_objtyp
) NOT FINAL
/
CREATE OR REPLACE TYPE Knoten_objtyp AS OBJECT
(
ID_Knoten
NUMBER,
x
NUMBER,
y
NUMBER,
z
NUMBER
) NOT FINAL
/
CREATE OR REPLACE TYPE Kante_objtyp AS OBJECT
(
ID_Kante
NUMBER,
Anfang_ref
REF Knoten_objtyp,
Ende_ref
REF Knoten_objtyp
) NOT FINAL
/
CREATE OR REPLACE TYPE LinienGeometrie_objtyp AS OBJECT
(
ID_Linie
NUMBER,
Kante_ref
REF Kante_objtyp,
LinienAggregat_ntab
LinienAggregat_ntabtyp,
is_aggr
NUMBER
) NOT FINAL
/
Der zuvor definierte Datentyp LinienAggregat_ntabtyp läßt zwar vom Namen her auf eine
eingebette Tabelle schließen, der Datenbank ist das aber noch nicht bekannt. Darüber hinaus
wurden bis jetzt lediglich Objekttypen erstellt, in denen noch keine Daten abgelegt werden
können. Es folgt nun die Erstellung der Tabellen aus den jeweiligen Objekttypen. Zur Erinnerung, es können beliebig viele Tabellen aus einem Objekttyp erstellt werden.
3.2 OBJEKT-RELATIONALE UMSETZUNG
47
CREATE TABLE LinienGeometrie_objtab OF LinienGeometrie_objtyp
(
PRIMARY KEY (ID_Linie),
FOREIGN KEY (Kante_ref) REFERENCES Kante_objtab
ON DELETE CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE LinienAggregat_ntab STORE AS LinienAggregat_stortab
/
Bei der Erstellung der Tabelle wird ein Primärschlüssel angegeben, was nicht unbedingt nötig
wäre, aber zwei Vorteile mit sich bringt: Zum einen kann der Benutzer mit Hilfe des Primärschlüssels leichter auf die Daten in der Tabelle zugreifen (z.B. nur ID’s < 20 anzeigen) und
zum anderen speichert die Datenbank einen selbst generierten object-identifier in
einer versteckten Spalte, welcher eine Länge von 16 byte besitzt. Für den Fall, dass man einen
Primärschlüssel angibt und diesen als object-identifier benutzt, kann man Speicherplatz sparen, sofern die selbst generierten ID’s nicht ebenso lang sind [Oraa].
Wie in Abschnitt 2.5.2 erwähnt, werden Objekt-Referenzen als Fremdschlüssel behandelt
(z.B. Attribut Kante_ref). Der Befehl ON DELETE CASCADE ist dafür verantwortlich,
dass beim Löschen einer Kante, die darauf referenzierende LinienGeometrie ebenfalls gelöscht wird, um sogenannte „dangling references“ zu vermeiden, die in solch einem Fall „ins
Leere“ zeigen würden.
Erst bei der Erstellung der Tabelle LinienGeometrie_objtab wird der Datenbank mitgeteilt, dass sie die (bereits erstellte) Tabelle LinienAggregat_ntab als nested table
einbetten soll. Da mehrere Tabellen die gleiche eingebettete Tabelle verwenden können, der
Inhalt der eingebetteten Tabellen aber in einer „externen“ Tabelle (Siehe Abschnitt 2.5.3)
zusammengefasst wird, muss hier der Name dieser „externen“ Tabelle mit dem Befehl STORE AS angegeben werden.
ALTER TABLE LinienAggregat_stortab
ADD (SCOPE FOR (LinienGeom_ref) IS LinienGeometrie_objtab)
/
Da für die Objekt-Referenzen in den eingebetteten Tabellen keine Primärschlüssel verwendet
werden, kann alternativ dazu ein „scoped REF“ verwendet werden, der ebenfalls Speicherplatz spart und für bessere Performance sorgt [Oraa].
Analog zu LinienGeometrie_objtab verhält es sich auch mit den Tabellen Knoten_objtab, Kante_objtab und PunktGeometrie_objtab:
48
KAPITEL 3 – IMPLEMENTIERUNG DES DATENMODELLS
CREATE TABLE Knoten_objtab OF Knoten_objtyp
(
PRIMARY KEY (ID_Knoten)
)
OBJECT IDENTIFIER IS PRIMARY KEY
/
CREATE TABLE PunktGeometrie_objtab OF PunktGeometrie_objtyp
(
PRIMARY KEY (ID_Punkt),
FOREIGN KEY (Knoten_ref) REFERENCES Knoten_objtab
ON DELETE CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
/
CREATE TABLE Kante_objtab OF Kante_objtyp
(
PRIMARY KEY (ID_Kante),
FOREIGN KEY (Anfang_ref) REFERENCES Knoten_objtab
ON DELETE CASCADE,
FOREIGN KEY (Ende_ref) REFERENCES Knoten_objtab
ON DELETE CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
/
Alle SQL-Befehle zur Erstellung des vollständigen Datenmodells befinden sich im Anhang.
Darauf aufbauend werden im folgenden Kapitel die 3D-Fähigkeiten von Oracle Spatial untersucht. Im Anschluss daran werden die verschiedenen Werkzeuge beschrieben, die den Datenaustausch und die Datenaufbereitung mit dem hier vorgestellten Datenmodell realisieren.
Kapitel 4
Eignung von Oracle Spatial
Bislang existieren nur wenige Untersuchungsergebnisse zu den 3D-Fähigkeiten von Oracle
Spatial wie z.B. in [Sto03]. Die von Oracle herausgegebene Dokumentation [Orac] behandelt
das Thema 3D nur ganz am Rande, dort werden vor allem die Fähigkeiten in 2D hervorgehoben. Dieses Kapitel soll Aufschluss über die 3D-Fähigkeiten von Oracle Spatial geben und
gleichzeitig erläutern, wie diese Fähigkeiten in dieser Arbeit genutzt werden können. Zum
besseren Verständnis wird das Konzept von Spatial zunächst in 2D beschrieben. Die 3DFähigkeiten werden darauf aufbauend in Abschnitt 4.2 erläutert.
4.1 Konzept
Oracle Spatial (kurz: Spatial) stellt ein SQL-Schema und zugehörige Funktionen zur Verfügung, mit deren Hilfe das Speichern, Bearbeiten, Aktualisieren und Abfragen von räumlichen
Informationen möglich wird. Dazu gehören:
•
•
•
Ein Schema (MDSYS), dass die Speicherung, Syntax und Semantik der verschiedenen
geometrischen Datentypen beschreibt.
Operatoren und Funktionen, die bestimmte Regionen abfragen können, räumliche Daten mit einander verknüpfen und andere Analyse-Operatoren.
Ein Mechanismus zur räumlichen Indizierung von Daten.
4.1.1 Räumliche Datentypen
Abbildung 4.1 zeigt die von Spatial unterstützten Geometrien. Da deren Koordinaten in drei
Dimensionen gespeichert werden können, ist es auch möglich die o.g. Geometrietypen beliebig im Raum anzuordnen. Außer der Tatsache, dass Polygone, die nicht in einer Ebene liegen,
auch von Spatial akzeptiert werden, entsprechen die Geometrien den Simple Features Spezifikationen [OGCa] des Open Gis Consortium.
49
50
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
Point
Line String
Compound Linestring
Self-crossing
line string
Compound Polygon
Polygon
Circle
Polygon with hole
Rectangle
Abbildung 4.1: Auswahl der unterstützten Geometrietypen von Oracle Spatial [Orac]
Demnach müssen (im Gegensatz zu VRML) Polygone immer geschlossen werden, d.h., als
Endpunkt eines Polygons müssen immer die Koordinaten des Anfangspunktes nochmals abgespeichert werden. Die Reihenfolge dieser Punkte ist bei Polygonen bzw. Außen-Polygonen
gegen den Uhrzeigersinn, bei Innen-Polygonen ist die Umlaufrichtung aber mit dem Uhrzeigersinn. Innere Polygone müssen immer im Anschluss an deren äußeres Polygon gespeichert
werden und dürfen dieses auch nur in einem einzigen Punkt berühren (Siehe Abbildung 4.2).
Abbildung 4.2: Von Spatial erlaubte Polygone, angelehnt an die Spezifikationen des
Open Gis Consortium [OGCa]
Umlaufrichtung äußerer Polygone gegen und innerer mit dem Uhrzeigersinn; Innere dürfen äußere Polygone in einem Punkt berühren.
Zu den besonderen Fähigkeiten von Spatial gehört der Umgang mit Koordinatensystemen.
Nicht georeferenzierte Koordinaten werden in kartesischen Koordinaten gespeichert, für alle
Koordinaten mit räumlichem Bezug stehen geodätische, projezierte und lokale Koordinatensysteme zur Verfügung [Orac]. Spatial bietet sogar die Möglichkeit, zwischen Koordinatensystem mit insgesamt 975 verschiedenen Datumsangaben zu transformieren.
4.1. KONZEPT
51
Das zuvor angesprochene Spatial Datenmodell (MDSYS) besitzt eine hierarchische Struktur,
wie Abbildung 4.3 zeigt. Beachtet man diese Struktur, kann ein Element aus einem Punkt,
einer Linie, einem Polygon, einem gemischten Linientyp oder aus einem gemischten Polygon
bestehen. Ein oder mehrere (auch unterschiedliche) Elemente bilden eine Geometrie. Der
Layer, der beliebig viele Geometrien enthalten kann, entspricht einer Spalte in einer Tabelle.
Der Datentyp dieser Spalte heißt MDSYS.SDO_GEOMETRY und kann auch in mehreren
Spalten vorkommen. So ist es z.B. möglich, in einer Tabelle „Gebäude“ einen Layer für
Wohnhäuser, einen Layer für Fabrikhallen usw. zu erstellen, falls es für die Anwendung sinnvoll ist. Ebenso können damit verschiedene Level of Details realisiert werden.
Spatial Layer
Geometries
Elements
Point
Linestring
Polygon
Compound
Linestring
Compound
Polygon
Abbildung 4.3: Hierarchische Struktur des Spatial Datenmodells. Ein Layer kann
beliebig viele Geometrie beinhalten, die wiederum beliebig viele
Elemente enthalten können.
SDO_GEOMETRY wird von Spatial derart definiert:
CREATE TYPE sdo_geometry AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
Das Attribut SDO_GTYPE beschreibt als vierstellige Zahl den Geometrietyp. Dabei steht die
erste Ziffer für die Dimension (2, 3 oder 4), die zweite und dritte Ziffer sind reserviert und die
letzte Ziffer steht für den genauen Geometrietypen. Dazu gehören:
52
0
1
2
3
4
5
6
7
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
unbekannte Geometrie
Punkt
Linie
Polygon
collection, entspricht einer Sammlung von Punkt, Linie und Polygon
multipoint, entspricht einer Sammlung von Punkten
multilinestring, entspricht einer Sammlung von Linien
multipolygon, entspricht einer Sammlung von Polygonen
Ein Polygon im 3D hat also das Attribut 3003.
Das Attribut SDO_SDRID steht für eines der zahlreichen Koordinatensysteme, wobei mit
dem Wert NULL das Kartesische Koordinatensystem angenommen wird.
SDO_POINT kann nur dann nicht NULL sein, wenn SDO_GTYPE NULL ist.
SDO_GEOMETRY ist also entweder eine Geometrie, oder ein Punkt.
SDO_ELEM_INFO enthält die Geometrietypen, deren Position in SDO_ORDINATES und die
Interpretation der Elemente einer Geometrie. Mögliche Werte wären:
Wert
0
1
2
3
1003
2003
4
5
1005
2005
Element
unbekanntes Element
Punkt
Linienelement
Polygon
(äußeres)
(inneres)
zusammengesetzte Linien
zusammengesetztes Polygon
(äußeres)
(inneres)
Interpretation
Anzahl der Punkte
1 = gerade Linien, 2 = Kreisbögen
1 = gerade Linien, 2 = Kreisbögen
3 = Rechteck, 4 = Kreis
Anzahl der Subelemente
Anzahl der Subelemente
SDO_ELEM_INFO könnte beispielsweise den Wert (1, 1003, 3, 5, 1003, 3) besitzen, mit
folgendender Bedeutung: (1, 1003, 3) entspricht einem äußeren Polygon (1003) mit der Interpretation 3 = Rechteck, dessen erster Koordinatenwert an der Stelle 1 in SDO_ORDINATES
steht. Die zweite Geometrie beginnt an fünfter Stelle und ist ebenfalls ein Rechteck.
SDO_ORDINATES hat dann z.B. die Werte (10,10, 20,20, 40,40, 50,50) der Art (x1,y1,
x2,y2, x3,y3, x4,y4), denn ein Rechteck ist bereits durch zwei Punkte (vgl. Abbildung 4.1)
definiert.
4.1. KONZEPT
53
Sekundär
Filter
Primär
Filter
Reduzierte
Datenmenge
Layer Daten
Spatial
Index
Exaktes
Ergebnis
Spatial
Funktionen
Abbildung 4.4: Spatial’s „two-tier“-Modell. Mit Hilfe eines Primärfilters wird die
Datenmenge reduziert, um sie erst danach genau zu untersuchen. Diese
Methode spart Rechenaufwand.
Zur Abfrage eines Layers benutzt Spatial ein sog. „two-tier“-Modell, bei dem die Abfrage in
zwei Teile aufgespalten wird (Abbildung 4.4). Die Daten eines Layers werden zunächst mit
einem Primär-Filter selektiert, der einen rämlichen Index verwendet. Die durch diese Filterung reduzierte Datenmenge wird dann mit einem zweiten Filter genau untersucht. Dies ist
notwendig, weil die dazu verwendeten räumlichen Funktionen erheblich mehr Rechenaufwand benötigen als es die Durchsuchung des räumlichen Index erfordert. Die Arbeitsweise
der einzelnen Filter wird in Abschnitt 4.3 noch genauer erläutert.
4.1.2 Räumlicher Index
Um Objekte schneller aufzufinden, kann man die Objekte eines Layers indizieren. Bei der
Indizierung wird die häufig sehr komplexe Geometrie eines Objektes durch eine ganz Einfache approximiert. Im zweidimensionalen spricht man hier von einem Minimum Bounding
Rectangel (MBR), also das kleinste achsparallele Rechteck, welches die Geometrie umschließt. Diese Informationen werden in einem Suchbaum, genauer gesagt in einem R-Baum
[Gut84] sortiert abgelegt.
Abbildung 4.5: Minimum Bounding Rectangle; Kleinstes Rechteck um eine
Geometrie
54
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
Nach der Bestimmung der MBR’s für alle Geometrien werden diese Informationen so gruppiert, dass nahe bei einander liegende Objekte auch in der Struktur des Suchbaums in Nachbarschaft zu einander abgebildet werden. Nimmt man das Beispiel aus Abbildung 4.6, so
werden dort die nahe bei einander liegenden Geometrien in a gruppiert. Das gleiche geschieht
mit b, c und d. Diese liegen in der untersten Ebene des Suchbaums und beinhalten das MBR
der gruppierten Geometrien und zusätzlich die Zeiger auf diese Geometrien. Diese Elemente
werden Blätter genannt.
Basierend auf ihrer Nachbarschaft werden als nächstes a, b, c und d in einem weiteren MBR
gruppiert. Die MBR’s a und b werden in R und c und d werden in S zusammengefasst.
Das Element in der höchsten Ebene des Suchbaums, auch Wurzel genannt, besitzt das MBR
um R und S und wie zuvor Zeiger auf die Elemente R und S.
Abbildung 4.6: Indizierung von Geometrien mit Hilfe von MBR’s in einem
R-Baum [Orac]
Die Struktur eines R-Baums ist darauf ausgelegt, auf nahe bei einander liegende Elemente
zuzugreifen. Der Zugriff erfolgt immer von der Wurzel aus, die Knoten des R-Baums besitzen
keine Zeiger auf darüber liegende Elemente. In Spatial beträgt die voreingestellte maximale
Verzweigung eines R-Baum’s 35 Elemente. Auf diese Weise können schon sehr viele Elemente indiziert werden, ohne dass der Baum zu tief wird.
Abbildung 4.7: Nicht exaktes Ergebnis: Das Suchfenster (gestrichelt) überlappt beide
MBR’s, aber berührt tatsächlich nur eine der beiden Geometrien.
4.1. KONZEPT
55
Da ein MBR nur eine Approximation einer komplexen Geometrie darstellt, ist auch das Ergebnis einer Suche im R-Baum nur eine Approximation.
In Abbildung 4.7 wird ersichtlich, dass das Suchergebnis mit MBR’s zwar 100% der gesuchten Objekte wiedergibt, darüber hinaus aber noch weitere Objekte mit in das Suchergebnis
einfließen, die dort eigentlich nicht auftauchen dürften. Aufgrund dessen ist es nötig, das in
Abbildung 4.4 gezeigte „two-tier“-Modell von Spatial anzuwenden. Mit Hilfe der MBR’s
kann also die Suche in einer großen Datenmenge stark reduziert werden, indem nur innerhalb
einer „Area of Interest“ gesucht werden muss.
4.1.3 Räumliche Operatoren
Bezogen auf das „two-tier“-Modell aus Abbildung 4.4 wenden alle räumlichen Operatoren
voreingestellt zuerst den primären, indexbasierten Filter an, um danach das Ergebnis einer
exakten Untersuchung zu unterziehen. Eine Ausnahme bildet hier der Operator
SDO_FILTER, der ausschließlich den ersten Schritt durchführt.
SDO_FILTER
Er benutzt einen räumlichen Index um zwei Geometrien zu finden, die potentiell mit einander
interagieren. In der Regel entspricht die erste Geometrie einem Suchfenster und man möchte
wissen, welche anderen Geometrien sich innerhalb dieses Fensters befinden (vgl. Abbildung
4.7). Prinzipiell ist aber auch möglich, zwei vorhandene Geometrien zu wählen und abzufragen, ob diese mit einander interagieren, wobei SDO_Filter diese Frage immer nur auf Basis der MBR’s der jeweiligen Geometrien beantwortet. Gemäß Abbildung 4.4 („two-tier“Modell) führt SDO_FILTER also nur den ersten Teil aus und liefert lediglich eine reduzierte,
nicht exakte Datenmenge. Da dieser Operator nur die Antwort TRUE oder FALSE liefert,
kann er nur in der WHERE-Klausel der SQL-Abfrage verwendet werden.
Syntax:
SDO_FILTER
( <geometry1>,
<geometry2>,
‘QUERYTYPE =<querytype>’
) = ‘TRUE’
Die erste Geometrie muss einen Index besitzen, man setzt hier die Spalte des zu durchsuchenden Layers ein. Die zweite Geometrie kann aus einer anderen Tabelle sein oder temporär erzeugt werden. Für den Fall, dass diese Geometrie keinen Index besitzt, wird der Inhalt des
Suchfensters für diese Anfrage kurzzeitig indiziert. Als querytype kann WINDOW oder
JOIN eingesetzt werden, Oracle empfiehlt aber in fast allen Fällen WINDOW zu benutzen, da
56
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
JOIN (als räumliches Kreuzprodukt zu verstehen) immer auch als WINDOW Abfrage umgeschrieben werden kann.
SDO_RELATE
Dieser Operator führt im ersten Schritt die gleiche Prozedur wie SDO_FILTER aus, überprüft
aber im zweiten Schritt beide Geometrien entsprechend dem 9-Schnittmodell von Egenhofer
[Ege90] (Siehe Abbildung 4.8).
Abbildung 4.8: Oracles Umsetzung des 9-Schnittmodells von Egenhofer [Orac]
Mit dem 9-Schnittmodell können im zweidimensionalen alle topologischen Beziehungen zwischen zwei Objekten ausgedrückt werden. So ist es möglich, durch eine Abfrage alle Objekte
ausgeben zu lassen, die innerhalb (inside) eines Suchfensters liegen. Genauso können aber
auch alle Objekte ausgegeben werden, die gleich (equal) sind, um doppelt vorhandene Daten aufzudecken. Durch die Abfrage der Beziehung touch können z.B. benachbarte Flächen
gefunden werden. Um zu testen, ob zwei Objekte disjunkt (disjoint) sind, muss die Frage
ANYINTERACT = FALSE lauten.
Die Masken TOUCH, OVERLAPBDYDISJOINT, OVERLAPBDYINTERSECT,
EQUAL, INSIDE, COVEREDBY, CONTAINS, COVERS und ANYINTERACT können mit AND oder OR verknüpft werden. Der Rückgabewert des Operators lautet bei
ANYINTERACT = TRUE, bei allen anderen Masken jedoch so wie die Maske selbst, z.B.:
CONTAINS = CONTAINS.
Syntax:
SDO_RELATE
( <geometry1>,
<geometry2>,
‘MASK=<mask>
QUERYTYPE =<querytype>’
) = ‘TRUE’
4.1. KONZEPT
57
Die Operatoren SDO_WITHIN_DISTANCE und SDO_NN wurden in dieser Arbeit zwar
nicht verwendet, sind aber wichtiger Bestandteil von Spatial.
SDO_WITHIN_DISTANCE
Dieser Operator identifiziert mittels des räumlichen Index die Geometrien, welche innerhalb
einer spezifizierten Distanz zu einer gegebenen Geometrie liegen. QUERYTYPE und UNIT
sind optionale Parameter. Wählt man QUERYTYPE = Filter, wird nur der primäre Filter
unter Verwendung der MBR’s durchgeführt. Lässt man das Feld QUERYTYPE weg, wird die
exakte Distanz ermittelt. Bei Verwendung von UNIT kann man verschiedene von Spatial unterstützte Einheiten benutzen, lässt man das Feld weg, so wird die Einheit verwendet, die dem
verwendeten Koordinatensystem zugrunde liegt.
Syntax:
SDO_WITHIN_DISTANCE
( <geometry1>,
<geometry2>,
‘DISTANCE=<n>,
QUERYTYPE = <querytype>
UNIT = unit’
) = ‘TRUE’
SDO_NN
Er sucht mit Hilfe des räumlichen Index den nächsten Nachbarn einer Geometrie.
Mit dem optionalen Parameter SDO_NUM_RES gibt man an, wie viele nächste Nachbarn
angezeigt werden sollen.
58
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
4.1.4 Räumliche Funktionen
Der Unterschied zwischen den Operatoren und den Funktionen besteht darin, dass die Operatoren zunächst den primären und danach den sekundären Filter auf die räumlichen Daten anwenden, wobei der erste Filter sich immer auf den räumlichen Index stützt. Die Funktionen
lassen den primären Filter aus, benötigen also keinen räumlichen Index und ermitteln auf diese Weise ein exaktes Ergebnis. Vergleicht man den Operator SDO_RELATE mit der Funktion SDO_GEOM.RELATE, muss die Funktion bei der Performance immer schlechter abschneiden als der Operator, weil der Operator ja nur die Objekte überprüft, die der Primärfilter ausgegeben hat.
Die folgende Tabelle soll einige ausgewählte räumliche Funktionen [Orac] auflisten, die Spatial bereitstellt. Auf eine tiefergehende Beschreibung wird hier jedoch verzichtet.
Räumliche Funktionen
und deren Aufgabe:
RELATE
Untersucht die räumliche Beziehung zweier
Geometrien (nach Egenhofer)
SDO_BUFFER
Legt ein Polygon in bestimmtem Abstand um
eine Geometrie
SDO_CENTROID
Bestimmt den Schwerpunkt einer Geometrie
SDO_CONVEXHULL
Gibt die Hülle einer Geometrie in Form eines
Polygons wieder
SDO_DIFFERENCE
Gibt das Objekt wieder, dass bei einer MINUSVerknüpfung zweier Objekte entsteht
SDO_DISTANCE
Errechnet die Entfernung zwischen den beiden
am nächsten liegenden Punkten zweier Objekte
SDO_INTERSECTION
Gibt das Objekt wieder, dass bei einer UNDVerknüpfung zweier Objekte entsteht
SDO_LENGTH
Berechnet die Durchmesser oder den Umfang
einer Geometrie
SDO_MBR
Gibt die Koordinaten des MBR einer Geometrie
aus
SDO_UNION
Gibt das Objekt wieder, dass bei einer ODERVerknüpfung zweier Objekte entsteht
SDO_WITHIN_DISTANCE
Ermittelt, ob zwei Objekte innerhalb eines
bestimmten Abstandes zu einander liegen
4.2. 3D-FÄHIGKEITEN
59
4.2 3D-Fähigkeiten
Jede der in Abschnitt 4.1 beschriebenen geometrischen Elemente wird durch Koordinaten
repräsentiert, welche alle in drei Dimensionen gespeichert werden können. Für das hier vorgestellte Modell sind vor allem gerade Linien und Flächen interessant. Die Koordinaten von
Linien und Flächen können in x, y und z abgespeichert werden, somit ist es auch möglich,
diese Geometrien frei im Raum anzuordnen.
Mit dem R-Baum können auch Geometrien im 3D und sogar im 4D indiziert werden. Im 3D
spricht man dann aber nicht mehr von einem Minimum Bounding Rectangle, sondern von
einem Minimum Bounding Volume (MBV).
z
y
x
Abbildung 4.9: Im 3D wird aus einem MBR ein MBV, ein Minimum Bounding
Volume ist das kleinste achs-parallele Volumen um eine Geometrie.
Der Operator SDO_FILTER aus Abschnitt 4.3, der nur auf die Interaktion zwischen den Indizes (MBR’s) von Geometrien achtet, führt im Gegensatz zu den anderen Operatoren nur die
primäre Filterung durch. Weil der R-Baum sich auch für 3D-Geometrien indizieren lässt,
vermag SDO_FILTER den primären Filter auch auf 3D-Objekte, bzw. Minimum Bounding
Volumes anzuwenden. Alle anderen Operatoren, die zusätzlich den sekundären Filter anwenden, versagen ihren Dienst bei 3D-Geometrien vollständig.
Man stelle sich den Fall vor, dass zwei Geometrien sich nur in der z-Koordinate unterscheiden
würden, also über einander stehen. 2D-Operatoren wären nicht in der Lage, diese beiden Geometrien von einander zu unterscheiden. Genau das ist derzeit der Stand aktueller geographischer Informationssysteme. In diesem Fall ist der Operator SDO_FILTER jedoch in der Lage,
sofern die MBV’s der beiden Geometrien nicht mit einander interagieren, diese Geometrien
von einander zu unterscheiden, wie Abbildung 4.10 deutlich macht.
60
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
a)
b)
Abbildung 4.10: a) Geometrien können aus 2D-Sicht nicht von einander unterschieden
werden, wenn sie genau übereinander stehen. b) Sofern die MBV’s
der beiden Geometrien nicht mit einander interagieren, kann sie
SDO_FILTER aber unterscheiden.
Ebenso wie im 2D ergibt die Suche mit SDO_FILTER mehr Ergebnisse, als es tatsächlich
richtig wäre. An dieser Stelle empfiehlt Oracle eigene Funktionen zu entwickeln, welche die
bereits reduzierte Ergebnismenge hinsichtlich der dritten Dimension genau untersuchen. Es
bieten sich dazu räumliche Funktionen an, die in Java programmiert sogar auf dem Datenbank-Server als Prozeduren ausgeführt werden könnten. Im Hinblick auf ein echtes 3D-GIS
sind solche Eigenentwicklungen unabdingbar, sofern Oracle diese nicht in einer der kommenden Versionen von Spatial zur Verfügung stellt (s.a. Kapitel 7).
Da die Entwicklung solcher Funktionen den Rahmen dieser Arbeit deutlich gesprengt hätte,
wurde hier ein anderer Weg beschritten.
Zwar versagen die räumlichen Operatoren bei 3D-Geometrien ihren Dienst, die räumlichen
Funktionen lassen aber lediglich die z-Koordinate außer Acht, bzw. setzen diese gleich
NULL. Somit ist es also prinzipiell möglich, alle 2D-Abfragen auf 3D-Objekte zu beziehen,
was bei 3D-Stadtmodellen bereits einige Standard-Anwendungen ermöglichen würde. Darüber hinaus kann mittels eines verschachtelten SQL-Befehls das Suchgebiet unter Berücksichtigung der dritten Dimension mit dem Operator SDO_FILTER erheblich eingeschränkt werden.
Folgender SQL-Befehl beinhaltet in der FROM-Klausel eine weitere SELECT-Anweisung,
die den primären Filter ausführt. Auf diese Weise wird das Suchergebnis reduziert und es
4.2. 3D-FÄHIGKEITEN
61
kann dann in der ursprünglichen WHERE-Klausel mit Hilfe der 2D-Funktion ein (bezogen
auf 2D) exaktes Ergebnis geliefert werden.
SELECT s.id_objekt
FROM (
SELECT r.id_objekt, r.world
FROM objekt_reltab r
WHERE MDSYS.SDO_FILTER(
r.world, MDSYS.SDO_GEOMETRY(
3003, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
MDSYS.SDO_ORDINATE_ARRAY(3446733.79, 5549996.27, 142.8,
3445133.79, 5539196.27, 104.8)
),'querytype=window'
) = 'TRUE'
) S, volumengeometrie_objtab v
WHERE MDSYS.SDO_GEOM.RELATE(
S.world, 'ANYINTERACT', MDSYS.SDO_GEOMETRY(
3003, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
MDSYS.SDO_ORDINATE_ARRAY(3446733.79, 5549996.27, NULL,
3445133.79, 5539196.27, NULL)
),0.5
) = 'TRUE' AND
v.id_volumengeom = S.id_objekt;
Das Objekt MDSYS.SDO_GEOMETRY wurde bereits in Kapitel 4.1 erläutert. Der Wert
3003 legt ein Polygon im 3D fest, weshalb das in MDSYS.SDO_ELEM_INFO_ARRAY definierte Rechteck im 3D eine Box ist, die durch die x-, y- und z-Koordinaten in
MDSYS.SDO_ORDINATE_ARRAY aufgespannt wird.
Statt der Maske ANYINTERACT kommen für 2D-Untersuchungen alle Masken aus Abbildung 4.8 in Betracht. Die Maske INSIDE würde beispielsweise nur die Geometrien auswählen, die sich vollständig innerhalb des Suchfensters befinden.
Neben der Funktion RELATE sind noch die Funktionen SDO_BUFFER, SDO_DISTANCE
und SDO_LENGTH für diese Nutzung interessant. So könnte mit SDO_Buffer eine Anfrage
vom Typ „Im Umkreis von x Metern um das Objekt y“ gestellt werden. SDO_DISTANCE
kann die kürzeste Horizontalstrecke zwischen zwei Objekten berechnen und SDO_LENGTH
gibt Auskunft über den Durchmesser oder den Umfang unter Vernachlässigung der zKoordinate.
62
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
4.3 Geometriebeispiel
Das Gebäude aus Abbildung 4.11 soll in der Tabelle objekt_reltab als SpatialGeometrie abgelegt werden.
Abbildung 4.11: Konstruiertes Gebäude mit Dachüberstand als Beispiel für das
Einfügen einer komplexen Geometrie in einen Spatial-Layer
Der SQL-Befehl dazu sieht wie folgt aus:
insert into objekt_reltab values (1000, NULL,
mdsys.sdo_geometry(3003, NULL, NULL,
mdsys.sdo_elem_info_array(
1, 1003, 1,
16, 1003, 1,
31, 1003, 1,
46, 1003, 1,
61, 1003, 1,
76, 1003, 1,
91, 1003, 1,
103, 1003, 1,
115, 1003, 1,
130, 1003, 1),
mdsys.sdo_ordinate_array(
50,50,50, 50,50,53, 50,58,53, 50,58,50,
50,50,50, 56,50,50, 56,50,53, 50,50,53,
56,50,50, 56,50,53, 56,58,53, 56,58,50,
56,58,50, 56,58,53, 50,58,53, 50,58,50,
50,58,53, 50,50,53, 53,50,56, 53,58,56,
53,50,56, 56,50,53, 56,58,53, 53,58,56,
50,58,53, 56,58,53, 53,58,56, 50,58,53,
50,50,53, 56,50,53, 53,50,56, 50,50,53,
50,50,50, 50,58,50, 56,58,50, 56,50,50,
50,58,53, 50,50,53, 49,50,52, 49,58,52,
NULL, NULL,
50,50,50,
50,50,50,
56,50,50,
56,58,50,
50,58,53,
53,50,56,
50,50,50,
50,58,53)));
4.3. GEOMETRIEBEISPIEL
63
Das Gebäude besteht aus insgesamt zehn Flächen. Dazu gehören die vier rechteckigen Seitenflächen, die beiden rechteckigen Dachflächen, die beiden dreieckigen Giebelflächen, die
Grundfläche des Hauses und der viereckige Dachüberstand, der an die Dachfläche im gleichen Neigungswinkel angesetzt wurde. Jede einzelne Fläche wird in diesem Beispiel in einer
neuen Zeile aufgeführt. Man erkennt auch die Konvention, dass zum Schließen eines Polygons der Endpunkt /Anfangspunkt ein zweites mal gespeichert werden muss.
Beim Einfügen dieses Gebäudes in die Tabelle objekt_reltab wurde dem Attribut
ID_Objekt der Wert 1000 zugeordnet und alle anderen Attribute gleich NULL gesetzt, da
dieses Gebäude nur manuell in die Datenbank eingefügt wurde.
Auf diese Weise sind alle Objekte in die Tabelle objekt_reltab eingefügt und indiziert
worden.
4.4 Polyeder-Repräsentation
Statt mehrere Flächen als Multipolygon zu speichern und damit auch redundante Koordinaten
in Kauf zu nehmen, wurde in [Are03] die Polyeder-Repräsentation in Spatial entwickelt. Ein
Polyeder (engl. Polyhedron) ist das 3D-Äquivalent zu einem 2D-Polygon. Es setzt sich aus
mehreren (mindestens vier) planaren Flächen zusammen und umschließt so ein Volumen.
Diese Darstellungsform ist in der Lage, sowohl die Geometrie, als auch die Topologie von
3D-Objekten direkt im Spatial-Layer zu speichern.
-geometry_type
Node
Face
Polyhedron
1
-starting_offset
4..* -element_type
-interpretation_code
3..* 3..*
ordered
Vertex
-x_coordinate
-y_coordiante
-z_coordinate
Abbildung 4.12: UML-Diagramm der Polyeder-Repräsentation [Are03]
Der folgende SQL-Befehl legt in einem Spatial-Layer namens geometry einen Polyeder in
Form eines Würfels ab. Die Datenstruktur aus Abbildung 4.12 wird dabei innerhalb des Attributs MDSYS.SDO_ORDINATE_ARRAY realisiert.
64
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
INSERT INTO polyhedron_table (id, geometry)
VALUES (
1, --id
mdsys.sdo_geometry(3002, -- geometry type: 3D line
NULL, NULL,
mdsys.sdo_elem_info_array(
1,2,1,
25,0,1006,
29,0,1006,
33,0,1006,
37,0,1006,
41,0,1006,
45,0,1006),
-- starting offset, e_type,int_code
-- first triplet is line,
-- then the faces
mdsys.sdo_ordinate_array(
1,1,0, 1,3,0, 3,3,0, 3,1,0,
1,1,2, 1,3,2, 3,3,2, 3,1,2,
-- vertices
1,2,3,4, 8,7,6,5, 1,4,8,5,
-- bottom, top, front face (nodes)
2,6,7,3, 1,5,6,2, 4,3,7,8
-- back, left, right face (nodes)
)
)
);
Im Attribut MDSYS.SDO_ELEM_INFO_ARRAY ist als erstes eine 3D-Linie gespeichert,
deren Koordinaten die gleichen wie die des Polyeders sind. Des weiteren werden in diesem
Attribut Geometrien vom Typ 0, für Spatial also unbekannte Geometrien (vgl. Abschnitt
4.1.1) mit der Interpretation 1006 abgelegt. Diese Interpretation ist von Oracle nicht definiert
und wurde zur Beschreibung einer Fläche als innere (2006) oder äußere (1006) Fläche eines
Polyeders eingeführt.
Im Attribut MDSYS.SDO_ORDINATES werden alle Koordinaten des Polyeders aus Sicht
von Spatial als Punkte der 3D-Linie abgelegt. Die darauf folgenden Knoten stellen zusammen
genommen jeweils eine Fläche dar. Bei welcher Ziffer eine neue Fläche anfängt, wird in
MDSYS.SDO_ELEM_INFO_ARRAY definiert. So bedeutet dort z.B. die Zeile (25, 0, 1006),
dass an der Koordinatenstelle 25 eine unbekannte Geometrie mit der Interpretation 1006 beginnt. Sie besitzt die Werte 1, 2, 3, 4, die von Spatial nicht interpretiert werden. Die zweite
Fläche ist definiert durch die Zeile (29, 0, 1006) und besitzt demnach die Werte 8, 7, 6 und 5.
Diese Werte stehen natürlich für die Position der Koordinatentrippel, so dass also die zweite
4.4. POLYEDER-REPRÄSENTATION
65
Fläche beispielsweise die Koordinaten in folgender Reihenfolge besitzt: (3, 1, 2), (3, 3, 2),
(1, 3, 2), (1, 1, 2).
Da Spatial aber der Geometrietyp 3D-Linie bekannt ist, kann auch ein MBV für diese 3DLinie erstellt werden. Dieses MBV ist natürlich auch gleichzeitig das MBV des Polyeders,
wodurch ein 3D-Index für Polyeder angelegt werden kann (vgl. Abbildung 4.13).
Abbildung 4.13: Knotenpunkte des Polyeders repräsentiert durch eine 3D-Linie (fett).
Das MBV für die 3D-Linie entspricht dem des Polyeders (gestrichelt).
Das Besondere an dieser Darstellungsform ist zum einen, dass innerhalb der SpatialGeometrie zusätzlich topologische Beziehungen gespeichert werden können und zudem Redundanzen vermieden werden.
4.5 Oracle Spatial Java Library
Dieses Kapitel richtet sich vornehmlich an Java-Programmierer, um ihnen einen Überblick
über die Spatial Java Library zu verschaffen.
Bisher fand die Kommunikation zu Oracle nur über die JDBC-Schnittstelle statt. Auf den
Spatial-Datentyp wurde bisher also nur mit SQL-Befehlen zugegriffen. Mit der Spatial Java
Library (SDO_API) steht eine Schnittstelle zur Verfügung, mit der man von Java aus direkten
Zugriff auf Spatial-Geometrien hat. Die 3D-Funktionalität beschränkt sich hier jedoch nur auf
das Lesen von 3D-Objekten.
66
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
Das Java-Package besteht aus 3 Teilen:
SDOAPI.GEOM (geometrische Objekte)
Mit dem geometry factory interface (GeometryFactory) können Geometrien erstellt werden.
Diese Schnittstelle kapselt das Java-Programm von der Implementierungsseite ab. Dadurch
sollten Programme auch nach Änderungen auf der Implementierungsseite weiter stabil laufen.
SDOAPI.ADAPTER (Geometrie-Adapter)
Mit diesem Gerüst verschiedener Geometrie-Adapter werden Geometrien konvertiert. Fremdhersteller können Geometrie-Adapter entwickeln, welche dann in Java-Programmen genutzt
werden sollen. Oracle liefert bereits Adapter für die Konvertierung von Shapefiles, XML,
oder WKT (well-known text) mit.
SDOAPI.SREF (Räumliche Koordinatensysteme)
Es werden geographische, projizierte und lokale Koordinatensysteme unterstützt. Zur Zeit
werden allerdings keine Koordinatentransformationen unterstützt.
Das folgende Beispiel aus [Orad] zeigt eine rekursive Funktion, welche die übergebenen Geometrien auswertet. Für die Übergabe der Geometrien genügt ein SELECT-Befehl, der den
Datentyp MDSYS.SDO_GEOMETRY übergibt. Die Funktion zerlegt Geometrien solange bis
sie auf der niedrigsten Ebene, dem Punkt, angekommen ist.
Query = “SELECT id_objekt, world FROM objekt_reltab”;
OracleResultSet ors = (stm.executeQuery(query);
Struct origSTR = (STRUCT)ors.getObject(2);
origgeom = sdoAdapter.importGeometry(origSTR);
printGeometry(origgeom);
// Print a geometry object
protected static void printGeometry(Geometry geom, int indent)
{
if (geom == NULL)
return;
// Indentation
for (int i = 0; i < indent; i++)
System.out.print(" ");
if (geom instanceof Point)
{
// Print x, y ordinates of a point
Point point = (Point) geom;
System.out.println("Point: " + point.getX() + ", " + point.getY());
}
else if (geom instanceof LineString)
4.5. ORACLE SPATIAL JAVA LIBRARY
67
{
LineString lineString = (LineString) geom;
int nDim = lineString.getDimensionality();
double[] coordArray = lineString.getCoordArray();
int nPoints = coordArray.length / nDim;
System.out.print("LineString: " + nPoints + " points:");
// Print coordinates of this line string
for (int i = 0; i < coordArray.length; i++)
System.out.print(" " + coordArray[i]);
System.out.println();
}
else if (geom instanceof Polygon)
{
// Print a linear polygon by printing all its parts
Polygon polygon = (Polygon) geom;
System.out.println("Polygon: ");
for (Enumeration e = curvePolygon.getRings(); e.hasMoreElements();)
printGeometry((Geometry)e.nextElement(), indent+2);
System.out.println();
}
else if (geom instanceof GeometryCollection)
{
// Print a geometry collection by printing all its member geometries
GeometryCollection geomColl = (GeometryCollection) geom;
System.out.println("GeometryCollection: ");
for (Enumeration e = geomColl.getGeometries(); e.hasMoreElements();)
printGeometry((Geometry)e.nextElement(), indent+2);
System.out.println();
}
}
4.6 Beurteilung
Mit Oracle Spatial ist es also möglich, 3D-Objekte zu verwalten. Bei der räumlichen Abfrage
der Daten zeigt sich aber, dass exakte Ergebnisse nur im zweidimensionalen möglich sind,
weil die dritte Dimension bei den räumlichen Funktionen unberücksichtigt bleibt. Immerhin
lassen sich 3D-Objekte in der dritten Dimension durch MBV’s indizieren, wobei der Operator
SDO_FILTER diee MBV’s der Objekte, auf Interaktion mit einander prüfen kann. Abbildung
4.14 zeigt jedoch, wann die Indizierung keine verlässlichen Resultate mehr bringen kann:
68
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
a)
b)
Abbildung 4.14: a) Mit Hilfe der MBV’s können beide Objekte von einander unterschieden werden. b) Die beiden Geometrien berühren sich zwar
nicht, aber dafür ihre MBV’s. Somit ergibt die Anfrage an den räumlichen Index ebenso wie die Untersuchung mit der 2D-Funktion kein
exaktes Ergebnis.
Abschließend kann man sagen, dass der Funktionsumfang von Spatial beachtlich ist. Die
räumliche Erweiterung von Oracle bietet viele verschiedene Koordinatensysteme sowie
Transformationen zwischen diesen Systemen an. Sie besitzt ausgereifte Techniken zur Abfrage von 2D-Daten und ist sogar in der Lage, die 2D-Abfragen auf 3D-Daten anzuwenden.
Die dritte Dimension wird bisher nur durch eine räumliche Indizierung unterstützt, mit der
sich aber das Suchergebnis bereits deutlich einschränken lässt. Das bietet wiederum die Möglichkeit, eigene Routinen zu entwickeln und auf diese Weise ein exaktes Suchergebnis zu erzielen. Solche Routinen können in Java oder C++ programmiert und als eigenständige Subroutinen in der Datenbank untergebracht werden, womit die Rechenleistung vom Server und
nicht vom Client aufgebracht werden muss.
Diese 3D-Routinen sollten folgende Aufgaben lösen:
•
•
•
Exakte Unterscheidung von 3D-Objekten (vgl. Abbildung 4.14)
Messung der Schrägdistanz im Modell
Berechnung von Höhe, Volumen und Schwerpunkt eines 3D-Objekts
Mit diesen zusätzlichen Funktionen könnte man das System ohne Einschränkung 3D-tauglich
nennen.
4.6. BEURTEILUNG
69
Während der Arbeit mit Spatial sind immer wieder kleine Probleme aufgetaucht, die hier noch
einmal angesprochen werden sollen:
Indexerstellung bei Objekttypen
Es ist durchaus möglich, den Datentyp MDSYS.SDO_GEOMETRY in einem Objekttyp unterzubringen und den Datentyp mit Inhalt zu füllen. Leider ist es nicht möglich, hierfür einen
Index zu erstellen. Aufgrund dessen musste der Objekttyp Objekt im objekt-relationalen
Datenmodell aus Abschnitt 3.2.1 in eine relationale Tabelle umgewandelt werden.
Keine 3D-Unterstützung durch SDO_API
Die Spatial Java Library ist zur Zeit nicht in der Lage, 3D-Objekte zu erstellen. Was per SQL
funktionierte, konnte mit der API nicht durchgeführt werden; Fehlermeldungen aller Art waren die Folge.
Limit von 999 Werten in SDO_ORDINATES
Wenn man per SQL Objekte mit mehr als 999 Werten im Feld SDO_ORDINATES übergeben
will, gibt es eine Fehlermeldung. Abhilfe schaffte hier ein sog. „Transactional Insert“. Dazu
wird die folgende PL/SQL Prozedur angelegt, zu der nur die Daten übermittelt werden. Der
Update-Befehl wird dann erst in dieser Prozedur (Stored Procedure) aufgerufen.
CREATE OR REPLACE PROCEDURE
INSERT_GEOM(GEOM MDSYS.SDO_GEOMETRY, objid INTEGER) IS
BEGIN
UPDATE objekt_reltab
SET world = (GEOM)
WHERE id_objekt = objid;
COMMIT;
END;
/
Vor dem Aufruf dieser Funktion müssen die Informationen mit einem DECLARE-Befehl zur
Übergabe an die Prozedur vorbereitet werden, erst dann wird die Prozedur aufgerufen.
DECLARE
geom mdsys.sdo_geometry:= mdsys.sdo_geometry(
3004, NULL, NULL,
mdsys.sdo_elem_info_array(
1, 1003, 1,
70
KAPITEL 4 – EIGNUNG VON ORACLE SPATIAL
16, 1003, 1,
31, 1003, 1,
46, 1003, 1,
61, 1003, 1,
76, 1003, 1,
91, 1003, 1,
103, 1003, 1,
115, 1003, 1
)
mdsys.sdo_ordinate_array(
50,50,50, 50,50,53, 50,58,53,
50,50,50, 56,50,50, 56,50,53,
56,50,50, 56,50,53, 56,58,53,
56,58,50, 56,58,53, 50,58,53,
50,58,53, 50,50,53, 53,50,56,
53,50,56, 56,50,53, 56,58,53,
50,58,53, 56,58,53, 53,58,56,
50,50,53, 56,50,53, 53,50,56,
50,58,53, 50,50,53, 49,50,52,
50,58,53, 50,50,53, 49,50,52,
BEGIN INSERT_GEOM(geom, 1000);
COMMIT;
END;
50,58,50,
50,50,53,
56,58,50,
50,58,50,
53,58,56,
53,58,56,
50,58,53,
50,50,53,
49,58,52,
49,58,52,
50,50,50,
50,50,50,
56,50,50,
56,58,50,
50,58,53,
53,50,56,
50,58,53
0,58,53)));
SDO_ELEM_INFO und SDO_ORDINATES
Zeigt man mit einem SELECT-Befehl den Datentyp MDSYS.SDO_GEOMETRY an und das
Objekt besitzt mehr als 99 Werte, also 33 Koordinaten, wird der Rest aus nicht nachvollziehbaren Gründen abgeschnitten. Dieser Fehler tritt nur bei der Ausführung über die JDBCSchnittstelle auf. Er tritt nicht auf, wenn man den SELECT-Befehl per Hand im SQLWorksheet eingibt. Erfreulicherweise beschränkt sich die 3D-Unfähigkeit der SDO_API nur
auf das Erstellen von 3D-Objekten, denn das Auslesen von 3D-Geometrien ist mit der API
möglich, so dass dieser Weg für die Ausgabe der Geometrien verwendet wurde.
Kapitel 5
Datenaustausch
Dieses Kapitel beschreibt die Werkzeuge, die den Datenaustausch mit der Datenbank vornehmen. Dazu gehören für den Import der Daten zwei Werkzeuge, von denen das eine Daten
der T-Mobile Deutschland GmbH in deren eigenem Datenformat importiert und das andere
VRML-Daten einlesen kann. In Abschnitt 5.2 wird die Erstellung von Spatial-Objekten erläutert und Abschnitt 5.3 beschäftigt sich mit den Export-Werkzeugen. Das eine exportiert die
Daten aus dem geometrisch-topologischen Modell und das andere verwendet nur den Inhalt
des Spatial-Layers. Die Selektion für den Export geschieht durch räumliche Anfragen.
5.1 Import
5.1.1 Daten der T-Mobile Deutschland GmbH
Mit freundlicher Genehmigung durch das Mobilfunk-Unternehmen T-Mobile Deutschland
GmbH konnte das System anhand von realen Daten evaluiert werden. Dabei handelt es sich
um einen Ausschnitt eines Gebäudemodells der Stadt Mainz mit etwa 10.000 Objekten, die
aus knapp 170.000 Koordinaten bestehen. Benötigt werden diese Daten zur rechnergestützten
Simulation der Ausbreitung von Funkwellen.
Mit Verfahren der photogrammetrischen Stereoauswertung werden Gebäude ab einer Grundfläche von 36 m² erfasst, die eine Mindesthöhe von 2,5 m besitzen. Für die Ausbreitung von
Funkwellen sind die Dachformen wichtig. Es wird unterschieden zwischen Flachdach, Pultdach, Satteldach, Walmdach und Zeltdach. Die Lagegenauigkeit der Gebäude liegt unter ±1
m, die Höhengenauigkeit beträgt 10% der Gebäudehöhe, mindestens aber ±0,5 m und höchstens ±2,0 m.
Abbildung 5.1: Beispielgebäude aus den T-Mobil-Daten. Es werden nur die 3DKoordinaten des Grundriss- und des Trauf-Polygons gespeichert.
71
72
KAPITEL 5 – DATENAUSTAUSCH
Die Daten liegen im Ascii-Format vor, wobei ein Gebäude durch ein Grundriss-Polygon, ein
Trauf-Polygon und je nach Dachform durch dessen Firstpunkte dargestellt wird. Zusätzlich
gibt es Angaben über die Dachform, die relative Gebäudehöhe und die absolute Höhe des
Gebäudes über NN als Mittelwert der Grundrisspunkte. Unter einem Grundriss-Polygon kann
man sich ein Polygon vorstellen, welches alle aufgenommen Grundriss-Punkte mit einander
verbindet. Analog dazu verhält es sich mit dem Trauf-Polygon, bei dem alle Traufpunkte mit
einander verbunden werden. Die Lage der Traufpunkte entspricht immer der Lage der Grundriss-Punkte, so dass von allen Traufpunkten auf den dazugehörigen Grundriss-Punkt herabgelotet werden kann (Siehe Abbildung 5.1). Die Lagekoordinaten liegen im Gauß-KrügerKoordinatensystem vor, die Höhe bezieht sich auf Normal Null.
Da das Dach nur durch seine Dachform und die entsprechenden Firstpunkte gegeben war,
hätte das Dach beim Import noch konstruiert werden müssen. Zur Evaluierung des Systems
reichte aber bereits die einfache Modellierung eines Gebäudes ohne sein Dach aus, so dass
nur Flachdach-Gebäude repräsentiert werden.
Mit dieser Modellierung können aber nur einfache Gebäude dargestellt werden. Deswegen
werden zusätzlich Innenhöfe oder Aufbauten mit der Kennziffer des dazugehörigen Gebäudes
gespeichert, wobei die Kennziffer ein negatives Vorzeichen erhält und um eine aufsteigende
dreistellige Zahl ergänzt wird.
Im Hinblick auf die Aggregationsmöglichkeit des Datenmodells war es sinnvoll, die Aufbauten zusammen mit den dazugehörigen Gebäuden zu einem Aggregat zu verbinden.
Nach dem Einlesen der Koordinaten können Trauf- und Grundriss-Polygon direkt als Maschen in der Datenbank gespeichert werden (Abbildung 5.2a). Um das Gebäude zu schließen,
müssen zusätzlich noch die Randflächen (Gebäudewände) erstellt werden. An Abbildung 5.2b
kann man sehen, dass die erste Fläche sich aus den Kanten 1, 2, 3 und 5 zusammensetzt, was
dem Prinzip entspricht, jede Kante nur einmal zu speichern. So besteht die zweite Fläche aus
den Kanten 4, 5, 6 und 8 und die letzte Fläche besitzt die Kanten 16, 17, 18 und 2.
a)
b)
16
13
17
15
18
2
1
4
8
3
7
5
10 14
11
6
9
12
Abbildung 5.2: Generierung der Randflächen. Die erste Fläche besitzt die Kanten 1, 2,
3 und 5. Die letzte besitzt die Kanten 16, 17, 18 und 2.
5.1. IMPORT
73
Speicherung im objekt-relationalen Datenmodell
Auf diese Weise werden also in der Tabelle Knoten_objtab (Siehe Abbildung 3.7) die
Koordinaten von Trauf- und Grundriss-Polygon gespeichert, die Kanten dieser Polygone sowie die Lote aller Traufpunkte auf die Grundrisspunkte werden in der Tabelle Kante_objtab abgelegt. Zur Berücksichtigung der Umlaufrichtung wird in der Liste der Kante,
die eine Fläche repräsentieren, zusätzlich noch eine „Sortiervariable“ gespeichert. Sortiert
man diese Liste von Kanten einer Fläche, ergibt sich daraus automatisch die richtige Umlaufrichtung. Alle Flächen werden so in der Tabelle Ring_objtab gespeichert. Da das Datenmodell von T-Mobile keine Löcher in den Polygonen vorsieht, wird ein Ring von einer Masche immer mit dem Attribut Aussen_ref referenziert. Alle Flächen werden auf diese Weise in einer Liste von Maschen gespeichert und so einem Volumen zugeordnet. Dieses Volumen wird in der Tabelle Volumengeometrie_objtab durch das Attribut Volumen_ref referenziert, wobei diese Volumengeomtrie Teil eines Aggregats sein kann
(aber nicht muss!). Zum „Objekt“ wird dieses Volumen mit dem Fremdschlüssel Volumen_ref in der Tabelle Objekt_reltab. In dieser Tabelle befinden sich alle Objekte des
3D-Stadtmodells. Von der Linie bis zum Aggregat aus mehreren Volumen besitzt jedes Objekt einen Eintrag in dieser Tabelle.
Die Integrität dieser Daten wird beim Import nicht überprüft, weil davon ausgegangen wird,
dass die Eingangsdaten diesbezüglich bereits untersucht worden sind. Durch die oben beschriebene Vorgehensweise ist jedoch sichergestellt, dass jedes Volumen geschlossen ist.
5.1.2 VRML
In Kapitel 2.4 wurde kurz auf den Zusammenhang zwischen den Koordinaten und deren Koordinatenindex eingegangen. Im Beispiel aus Abbildung 2.8 besitzt ein IndexedFaceSet
genau ein Fläche. Eine andere Variante besteht darin, ein IndexedFaceSet aus mehreren
Flächen zusammenzustellen. In diesem Fall werden alle verwendeten Koordinaten nur einmal
in Coordinate gespeichert und in coordIndex mehrmals verwendet. Das spart zwar
Speicherplatz, kann aber bei der Verwendung von Texturen zu Problemen führen. Mit ganz
schlechtem Beispiel geht hier ArcScene1 voran, welches ein ganzes 3D-Stadtmodell in ein
einziges IndexedFaceSet „einstampft“.
Das Werkzeug für den Import von VRML-Daten wurde mit verschiedenen Dateien aus dem
Internet und des Institutes für Photogrammetrie2 getestet. Es durchsucht eine VRML-Datei bis
es auf ein IndexedFaceSet trifft, dessen Fläche(n) als Maschen in der Datenbank gespeichert werden. Sind mehrere Flächen in einem IndexedFaceSet vorhanden, wie es bei 2
der Fall ist, wird davon ausgegangen, dass alle Flächen eines Objekts in diesem IndexedFaceSet abgelegt sind. Der andere Fall besteht darin, dass ein IndexedFaceSet (vergl. Abbildung 2.8) nur genau eine Fläche beinhaltet.
1
2
: Gehört zu ArcGIS 3D Analyst von ESRI, www.esri.com
: http://www.ipb.uni-bonn.de/ipb/projects/buildings/nussallee2.wrl.gz
74
KAPITEL 5 – DATENAUSTAUSCH
Dann werden alle Flächen, die sich in einem Gruppenknoten finden lassen, einem Volumen
zugeordnet.
Im Vergleich zu den T-Mobile-Daten müssen hier keine Flächen mehr konstruiert werden, ob
die Gebäude aus den VRML-Daten jedoch geschlossen sind, kann an dieser Stelle nicht beurteilt werden. Ebenso wenig werden andere Integritätsmerkmale überprüft, was in Zukunft aber
eine Aufgabe der Datenbank sein sollte.
5.1.3 Probleme und Verbesserungen
Bei den T-Mobile-Daten wurden nicht alle verfügbaren Informationen verarbeitet. Die Dachflächen fehlen, die relative Gebäudehöhe und die absolute Höhe des Gebäudes blieben unberücksichtigt. Die beiden letztgenannten Werte sollten aber ohnehin nicht in die Datenbank
aufgenommen werden, da solche Informationen mit geeigneten Funktionen automatisch ermittelt werden können. Ein Problem stellen jedoch die Grundrisspolygone dar. Im Gegensatz
zu den Traufpolygonen kann es passieren, dass diese Flächen nicht mehr in einer Ebene liegen. So etwas passiert beispielsweise dann, wenn ein Haus am Hang steht und die Punkte des
Grundrisspolygons unterschiedliche Höhen aufweisen. Streng genommen müssten diese Flächen erst mit einem Algorithmus trianguliert werden, bevor sie in die Datenbank eingehen. Da
einerseits Spatial solche Flächen akzeptiert und andererseits lediglich ein Prototyp entwickelt
werden sollte, wurde auf eine Triangulation verzichtet.
Das Werkzeug für den VRML-Import ist als wesentlich fragiler einzustufen. Aufgrund der
verschiedensten Möglichkeiten der Datenstrukturierung in einer VRML-Datei stößt dieses
Werkzeugen sehr schnell an seine Grenzen. Kaum lösbar werden die Probleme bei der Implementierung dann, wenn von der hierarchischen Gruppierung in einem VRML Scene Graph
kein Gebrauch gemacht wird, und, wie im vorhergehenden Abschnitt beschrieben, ganze 3DModelle in einem einzigen Kindknoten abgelegt werden. Es ist also grundsätzlich nicht auszuschließen, dass der VRML-Import für zukünftige VRML-Dateien noch angepasst werden
muss. Wirkliche Verbesserung würde hier Java3D1 bringen. Dabei handelt es sich um eine
Programmierschnittstelle für Java, mit der die Erstellung, Darstellung und Kontrolle über 3DObjekte möglich ist. Der Vorteil für den Import der VRML-Dateien liegt darin begründet,
dass man keine eigene Routine zum Einlesen der VRML-Daten benötigt, sondern dieser
Schritt von Java3D übernommen wird. Andere Vorteile, die Java3D mit sich bringt, werden in
Kapitel 7 genauer beschrieben.
1
: http://java.sun.com/products/java-media/3D/
5.2. ERSTELLUNG VON SPATIAL-OBJEKTEN
75
5.2 Erstellung von Spatial-Objekten
Beim Import werden die Geometrien noch nicht im Spatial-Layer eingetragen. Diese Aufgabe
wird von einem Werkzeug übernommen, das mit Hilfe eines SQL-Befehls eine bestimmte
Menge an Objekten auswählt und deren Geometrie in einem Spatial-Layer ablegt. Das Werkzeug besteht aus zwei Funktionen. Mit der einen werden nicht-aggregierte Objekte erfasst, mit
der anderen Funktion nur aggregierte. Nach der Durchführung beider Funktionen wird der
räumliche Index automatisch neu erstellt. Zum besseren Verständnis werden in diesem Abschnitt nur Gebäude aggregiert.
Erfassung von nicht aggregierten Gebäuden
SELECT
o.id_volumengeom,
m.masche_ref.aussen_ref.id_ring,
l.kante_ref.anfang_ref.id_knoten,
l.kante_ref.anfang_ref.x,
l.kante_ref.anfang_ref.y,
l.kante_ref.anfang_ref.z,
l.kante_ref.ende_ref.id_knoten,
l.kante_ref.ende_ref.x,
l.kante_ref.ende_ref.y,
l.kante_ref.ende_ref.z,
l.sortvar
FROM
ring_objtab r,
volumen_objtab v,
volumengeometrie_objtab o,
TABLE(r.kantenliste_ntab) l,
TABLE(v.maschenliste_ntab) m
WHERE
m.masche_ref.aussen_ref.id_ring = r.id_ring AND
o.volumen_ref.id_volumen = v.id_volumen
ORDER BY r.id_ring, l.sortvar
Abbildung 5.3 : SQL-Befehl zur Selektion aller Objekte, die im geometrischtopologischen Datenmodell gespeichert sind
Der SQL-Befehl in Abbildung 5.3 wählt alle Volumengeometrien aus, die sich im geometrisch-topologischen Modell befinden. Flächen- und Liniengeometrien wurden mangels existierender Daten nicht mit aufgeführt, wobei diese aber nach dem gleichen Muster zu selektie-
76
KAPITEL 5 – DATENAUSTAUSCH
ren wären. Die benötigten Informationen zur Erstellung der Spatial-Geometrie eines Gebäudes sind:
•
•
•
•
•
Die Objekt_ID, um alle Ringe einem bestimmten Gebäude zuordnen zu können.
Die Ring_ID, um alle Knoten dem jeweiligen Ring zuordnen zu können.
Die Knoten_ID des Anfangs- und Endknotens der Kanten, aus denen ein Ring besteht
Die Koordinaten des Anfangs- und des Endknotens einer Kante.
Die Sortiervariable, welche die Kanten bezüglich eines Ringes in der richtigen Reihenfolge sortiert, mit dem Befehl ORDER BY in der letzten Zeile.
Die Übernahme von inneren Ringen ist an dieser Stelle aus zwei Gründen nicht von Interesse:
Zum einen besitzen die gespeicherten Gebäude keine Fenster, somit auch keine inneren Ringe
in den Maschen. Zum anderen wäre es für den räumlichen Index sinnlos, innere Ringe zu
speichern, weil diese zur räumlichen Ausdehnung eines Gebäudes nicht beitragen würden.
Grundsätzlich ist die Möglichkeit der Speicherung von Polygonen mit Löchern aber durch
Spatial gegeben.
Um ein Gebäude im Spatial-Layer einzutragen, müssen die dazugehörigen Flächen gemäß
dem Geometriebeispiel in Abschnitt 4.3 in MDSYS.SDO_ORDINATE_ARRAY abgelegt werden. Genauso ist der jeweilige Geometrietyp (1003, 1 = geschlossenes Polygon) sowie die
Position der ersten Koordinate jeder Fläche in MDSYS.SDO_ELEM_INFO_ARRAY zu speichern. Wegen des Limits von 999 Parametern in MDSYS.SDO_ORDINATE_ARRAY (vgl.
Abschnitt 4.6) können diese Werte nicht direkt an die Datenbank übermittelt werden, sondern
müssen erst den Umweg über die Stored Procedure nehmen. Auf diese Weise wird dann jedes
einzelne Gebäude als neue Geometrie in der Tabelle objekt_reltab im Spatial-Layer
world eingetragen.
Erfassung von aggregierten Gebäuden
Es werden genau wie zuvor Volumengeometrien ausgewählt, deren aggregierte Gebäude(teile) zusammen im Spatial Layer abgelegt werden sollen. Durch die rekursive Aggregation ergeben sich hier jedoch einige Änderungen. Um alle Aggregate (Zusammengesetzte Gebäude) in einer Tabelle anzeigen zu lassen, kann man folgenden SQL-Befehl verwenden:
SELECT g.id_volumengeom
FROM objekt_reltab o, volumengeometrie_objtab g
WHERE g.id_volumengeom = o.volumen_ref AND g.is_aggr = 1;
Dieser einfache Befehl muss der eigentlichen Rekursion vorgeschaltet werden, weil der folgende SQL-Befehl nur die aggregierten Volumengeometrien von einer Volumengeometrie
(Im Beispiel die Volumengeometrie mit der ID 16) auflisten kann. Entscheidend für die Rekursion im diesem Beispiel ist der Befehl START WITH ... CONNECT BY PRIOR. Er
startet die Rekursion in der Volumengeometrie 16 und es werden alle aggregierten Volumen-
5.2. ERSTELLUNG VON SPATIAL-OBJEKTEN
77
geometrien angezeigt, die in der nested table stehen. Gleichzeitig werden aber alle diese gefundenen Einträge (m.volumengeom_ref.id_volumengeo) als neue Startwerte verwendet, um die Rekursion dort weiterzuführen. Dieser Vorgang funktioniert unabhängig von
der Rekursionstiefe und auch unabhängig davon, ob der Rekursionsgraph ausgeglichen ist
oder nicht.
SELECT
v.id_volumen,
m.masche_ref.aussen_ref.id_ring,
l.kante_ref.anfang_ref.id_knoten,
l.kante_ref.anfang_ref.x,
l.kante_ref.anfang_ref.y,
l.kante_ref.anfang_ref.z,
l.kante_ref.ende_ref.id_knoten,
l.kante_ref.ende_ref.x,
l.kante_ref.ende_ref.y,
l.kante_ref.ende_ref.z,
l.sortvar,
16
FROM
ring_objtab r,
volumen_objtab v,
TABLE(r.kantenliste_ntab) l,
TABLE(v.maschenliste_ntab) m
WHERE
v.id_volumen IN (
SELECT m.volumengeom_ref.volumen_ref.id_volumen
FROM
volumengeometrie_objtab o,
TABLE(o.volumenaggregat_ntab) m
WHERE m.volumengeom_ref.volumen_ref.id_volumen > 0
START WITH o.id_volumengeom
IN (
SELECT o.id_volumengeom
FROM volumengeometrie_objtab o
WHERE o.is_aggr = 1 AND o.id_volumengeom = 16)
CONNECT BY PRIOR
m.volumengeom_ref.id_volumengeom = o.id_volumengeom
) AND m.masche_ref.aussen_ref.id_ring = r.id_ring
ORDER BY r.id_ring, l.sortvar;
78
KAPITEL 5 – DATENAUSTAUSCH
Entsprechend dem o.g. Beispiel werden also in der Zeile der Volumengeometrie 16 (entspricht im Beispiel einem zusammengesetzten Gebäude) die Geometrien aller aggregierten
Gebäudeteile eingetragen. Diese Gebäudeteile liegen geometrisch im Spatial-Layer nun
zweimal vor. Einmal in der Zeile, in der nur der einzelne Gebäudeteil liegt und einmal zusammen mit den anderen Gebäudeteilen in der gerade eben erstellten Zeile.
a)
b)
c)
x
x
Abbildung 5.3: Gebäudeteil a und b werden zu Gebäude c aggregiert.
Belässt man die nun doppelt vorliegenden Geometrien im Spatial-Layer, würde diese Redundanz bei einer räumlichen Anfrage zu einem Problem führen. Bei der Suche, in welchem Gebäude sich der Punkt x befindet, würde die Antwort a und c lauten. Aus diesem Grund müssen
nach der Erstellung des Gebäudes c die Gebäudeteile a und b aus dem Spatial-Layer gelöscht
werden. Das Suchergebnis lautet jetzt nur noch c und ist somit eindeutig. Auf diese Weise
gehen keine Informationen verloren, denn a und b liegen weiterhin getrennt vor, sie besitzen
nur keinen Eintrag im Spatial-Layer.
Würde man erst gar nicht das Gebäude c erstellen, träte ein anderes Problem auf. Bei der
räumlichen Anfrage, die alle Häuser im Umkreis von 100 m ausgeben soll, würde evtl. der
Gebäudeteil b ohne den Teil a ausgegeben, wenn a, nicht aber b, außerhalb des Suchkreises
liegt. Dann würde jedoch der Eindruck entstehen, dass dieses Gebäude keine Garage oder
Anbau besitzt.
5.3. EXPORT
79
5.3 Export
Die Selektion für den Export wird durch die räumlichen Funktionen von Spatial unterstützt.
Der Benutzer kann die 3D-Koordinaten einer Bounding Box angeben und zusätzlich einen
Maskentyp (Abbildung 4.8) wählen, der Objekte bezüglich ihrer 2D-Interaktion filtert. Das
Suchergebnis wird dann in einer VRML-Datei ausgegeben (vgl. Abbildung 2.8). VRMLKoordinaten sind bislang nur in single-precision definiert (32Bit). Da Gauß-KrügerKoordinaten bereits 7 Vorkommastellen besitzen, treten Fehler im Dezimeter-Bereich auf.
Aufgrund dessen kann der Benutzer vor dem Export zwischen Gauß-Krüger- oder lokalen
Koordinaten auswählen. Ist letzteres der Fall, wird der Ursprung des lokalen Koordinatensystems im Header der VRML-Datei in Gauß-Krüger-Koordinaten angegeben.
Der Scene Graph der VRML-Datei besitzt in der obersten Ebene ausschließlich Gruppenknoten, von denen jeder einzelne ein Objekt (Gebäude) repräsentiert. Dessen Kindknoten besitzen
jeweils einen Objektknoten, der ein IndexedFaceSet mit einer Fläche beinhaltet. Das
Geometriebeispiel aus Abschnitt 4.3 würde demnach einen Gruppenknoten besitzen, der wiederum über 10 Kindknoten mit jeweils einem IndexFaceSet verfügt.
Daten können über zwei verschiedene Wege exportiert werden. Zum einen aus dem geometrisch-topologischen Modell und zum anderen aus dem Spatial-Layer. Der Export über den
Spatial-Layer ist zwar schneller (vgl. Kapitel 6), aber dafür besitzt dieser keine topologischen
Informationen.
5.3.1 Geometrisch-topologisches Modell
Dieses Modell stellt nicht nur die Flächen zur Verfügung, die ein Gebäude repräsentieren,
sondern kann auch Auskunft über die Nachbarn einer Fläche geben, ob sie Löcher enthält, wie
sie orientiert ist und welches Material sie besitzt. Zudem kommen noch die Informationen
über Aggregate hinzu. Beim Export in eine VRML-Datei gehen einige dieser topologischen
Merkmale verloren, was jedoch in der Datenstruktur von VRML begründet liegt, die diese
Informationen nicht aufnehmen kann. Aber gerade bei VRML-Daten spielt die Orientierung
und das Material eine sehr große Rolle, denn VRML-Daten dienen primär der Visualisierung.
Da die Eingangsdaten der T-Mobile Deutschland GmbH über keine unterschiedlichen Materialien verfügen, wurden Orientierung und Material einer Fläche nicht exportiert.
Der folgende SELECT-Befehl wählt die Geometrie aller Volumen aus, die in der ersten
WHERE-Klausel stehen. Diese beinhaltet zwei SELECT-Befehle, deren Ergebnis Volumen
sind und mit dem Befehl UNION (entfernt doppelte Zeilen) zusammengefasst werden. Der
eine SELECT-Befehl erfasst alle nicht-aggregierten Volumen und der andere behandelt nur
die aggregierten Volumen. Beide wenden jedoch die gleiche Methode zur räumlichen Selektion an, die bereits in Abschnitt 4.2 erläutert wurde.
80
KAPITEL 5 – DATENAUSTAUSCH
SELECT
v.id_volumen,
m.masche_ref.aussen_ref.id_ring,
l.kante_ref.anfang_ref.id_knoten,
l.kante_ref.anfang_ref.x,
l.kante_ref.anfang_ref.y,
l.kante_ref.anfang_ref.z,
l.kante_ref.ende_ref.id_knoten,
l.kante_ref.ende_ref.x,
l.kante_ref.ende_ref.y,
l.kante_ref.ende_ref.z,
l.sortvar
FROM
ring_objtab r,
volumen_objtab v,
TABLE(r.kantenliste_ntab) l,
TABLE(v.maschenliste_ntab) m
WHERE
v.id_volumen IN(
SELECT g.volumen_ref.id_volumen
FROM volumengeometrie_objtab g, (
SELECT r.id_objekt, r.volumen_ref, r.world
FROM objekt_reltab r
WHERE mdsys.sdo_filter(
r.world, mdsys.sdo_geometry(
3003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(x1,y1,z1, x2,y2,z2)
),'querytype=window'
) = 'TRUE'
) S
WHERE
s.volumen_ref = g.id_volumengeom AND is_aggr = 0 AND
mdsys.sdo_geom.relate(
S.world, 'ANYINTERACT', mdsys.sdo_geometry(
3003, NULL, NULL, mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(x1,y1,z1, x2,y2,z2)
),0.5
) = 'TRUE'
UNION
SELECT m.volumengeom_ref.volumen_ref.id_volumen
FROM volumengeometrie_objtab o, TABLE(o.volumenaggregat_ntab) m
WHERE m.volumengeom_ref.volumen_ref.id_volumen > 0
START WITH o.id_volumengeom IN (
5.3. EXPORT
81
SELECT g.id_volumengeom
FROM volumengeometrie_objtab g, objekt_reltab o, (
SELECT r.id_objekt, r.world
FROM objekt_reltab r
WHERE mdsys.sdo_filter(
r.world, mdsys.sdo_geometry(
3003, NULL, NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(x1,y1,z1, x2,y2,z2)
), 'querytype=window'
) = 'TRUE'
) S
WHERE
o.volumen_ref = g.id_volumengeom AND mdsys.sdo_geom.relate(
S.world, 'ANYINTERACT', mdsys.sdo_geometry(
3003, NULL, NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(x1,y1,z1, x2,y2,z2)
),0.5
) = 'TRUE'
) CONNECT BY PRIOR m.volumengeom_ref.id_volumengeom = o.id_volumengeom
) AND m.masche_ref.aussen_ref.id_ring = r.id_ring
ORDER BY r.id_ring, l.sortvar
5.3.2 Spatial-Layer
Der Spatial Layer diente bisher nur der Beantwortung räumlicher Anfragen, z.B. welche Objekte innerhalb einer Suchbox liegen oder wie zwei Objekte mit einander interagieren. Das
Geometriebeispiel aus Abschnitt 4.3 zeigt aber, dass bei der Speicherung in einem SpatialLayer zwar die Topologie, nicht aber die Geometrie verloren geht. Es können also die gleichen Informationen in eine VRML-Datei exportiert werden, wie das im vorherigen Abschnitt
der Fall ist. Der SELECT-Befehl dazu ist deutlicher einfacher als im geometrischtopologischen Modell und wurde bereits in Abschnitt 4.2 vorgestellt.
Im folgenden Kapitel sollen die hier vorgestellten Prozesse auf ihre Performance untersucht
und beurteilt werden. Der anschließende Ausblick wird das Potential dieses Systems beschreiben und mögliche Erweiterungen für die Zukunft nennen.
Kapitel 6
Analyse
Dieses Kapitel untersucht die Performance und den Speicherverbrauch der Datenbank beim
Import und Export von realen Daten und beurteilt die Ergebnisse kritisch.
Die Testumgebung besteht aus einem AMD Athlon XP 2100+ (1800MHz) mit 512MB DDRRAM auf einem WindowsXP Betriebssystem. Oracle liegt in der Version 9.2.0.1.0 vor. Sämtliche Ergebnisse werden mit den zuvor beschriebenen Werkzeugen (vgl. Kapitel 5) ermittelt.
Abbildung 6.1 zeigt einen Screenshot des Java-Programms. Bei der Erstellung der Datenbank
wurde die Speicherverwaltung so konfiguriert, dass 90% des freien Speichers genutzt werden
können, wodurch der Datenbank ca. 300MB Arbeitsspeicher zur Verfügung stehen.
Abbildung 6.1: Screenshot des Javaprogramms
82
6.1 SPEICHERPLATZBEDARF
83
6.1 Speicherplatzbedarf
Je nachdem, welche Features bei einer Datenbank zusätzlich installiert werden, ändert sich
auch der Speicherplatzbedarf auf der Festplatte. Bei der Konfiguration mit dem Oracle Database Configuration Assistent wurden aus Kompatibilitätsgründen alle Einstellungen unverändert übernommen. Nach der Erstellung der Datenbank betrug der Platzbedarf 1,1 MBytes.
Dateiname
Dateigröße (Bytes)
CONTROL01.CTL
1.613.824
CONTROL02.CTL
1.613.824
CONTROL03.CTL
1.613.824
DRSYS01.DBF
20.979.712
INDX01.DBF
26.222.592
REDO01.LOG
104.858.112
REDO02.LOG
104.858.112
REDO03.LOG
104.858.112
SYSTEM01.DBF
346.038.272
TEMP01.DBF
41.951.232
TOOLS01.DBF
10.493.952
UNDOTBS01.DBF
277.880.832
USERS01.DBF
26.222.592
XDB01.DBF
39.985.152
In der Datei SYSTEM01.DBF wird der Inhalt der Datenbank aufbewahrt. Signifikante Änderungen der Dateigröße bei Benutzung der Datenbank sind lediglich bei dieser und bei der Datei UNDOTBS01.DBF zu beobachten. Die Datei TEMP01.DBF dient der Zwischenspeicherung von Daten, ihre Größe ändert sich schnell, nachdem mehrere SQL-Abfragen gestellt
wurden. Hier hat der Benutzer jedoch Möglichkeiten, den Speicherbedarf zu begrenzen. Abbildung 6.2 zeigt den Verlauf des Speicherverbrauchs der Dateien SYSTEM01.DBF und UNDOTBS01.DBF bei zunehmendem Datenbestand. Geht man von einem annähernd linearen
Verhältnis zwischen Speicherbedarf und der Anzahl der Gebäude aus, bedeutet das etwa 80
MBytes pro 10.000 Gebäude. Die Eingangsdaten betrugen für die annähernd gleiche Menge
lediglich 6,7 Mbytes. Es ist jedoch zu berücksichtigen, dass in der Datenbank zusätzlich noch
die Randflächen generiert, etliche Indizes und der Spatial-Layer erstellt wurden.
84
KAPITEL 6 – ANALYSE
500
450
MByte
400
SYSTEM01.DBF
UNDOBTS01.DBF
350
300
250
0
2000
4000
6000
Gebäude
8000
10000
12000
Abbildung 6.2: Speicherplatzverbrauch der Systemdateien abhängig von der Menge
der gespeicherten Gebäude
6.2 Import
Weil keine ausreichend große Menge an VRML-Daten vorliegt, wird lediglich der Import der
realen Daten der T-Mobile Deutschland GmbH analysiert. In der o.g. Testumgebung werden
dabei pro Minute ca. 100 Gebäude importiert. Die anschließende Erstellung der SpatialObjekte aus den vorhanden Daten verarbeitet etwa 230 Gebäude pro Minute. Bei 10.000 Gebäuden bedeutet das insgesamt Rechenzeit von knapp 145 Minuten.
6.3 Export
Da der Export der Daten die wesentliche Aufgabe dieses Systems darstellt, werden die dazu
vorhandenen Werkzeuge an dieser Stelle besonders genau untersucht. Der Export geschieht
ausschließlich in VRML-Dateien und ist einerseits aus dem topologischen Datenmodell und
anderseits aus dem Spatial-Layer möglich. Diese beiden Varianten werden im folgenden gegenübergestellt.
6.3. EXPORT
85
6.3.1 Topologie-Query
Die SQL-Abfrage (vgl. Abschnitt 5.3.1) für das topologische Datenmodell (im folgenden
„Topologie-Query“ genannt) wählt alle Koordinaten der Gebäude aus, die sich innerhalb einer
vorgegebenen Suchbox befinden. Gebäude, die sich aus mehreren Aggregaten zusammensetzten werden dabei ebenfalls berücksichtigt. Das Topologie-Query ist relativ komplex und wird
daher zusätzlich für die folgenden Analysen in seine Komponenten aufgespaltet. Diese Komponenten sind sogenannte Sub-Querys, also Unterabfragen innerhalb eines SELECT-Befehls.
Die Aufgabe dieser Komponenten sind die Rekursion, die räumliche Anfrage, der Bezug zwischen Objekt und Volumen und die Auswahl der Koordinaten der gesuchten Objekte.
Bei der Untersuchung stellt man fest, dass ein eindeutiger Zusammenhang zwischen der gespeicherten Datenmenge und der Dauer einer SQL-Anfrage besteht. Deshalb sind die folgenden Diagramme nach der Menge der abgespeicherten Daten unterteilt. Da sich die Daten der
T-Mobile Deutschland GmbH auf drei Dateien verteilen, werden die verschiedenen SQLAbfragen nach dem Import einer jeden Datei erstellt. Daraus ergeben sich drei Diagramme,
mit 2357, 5716 und mit 9943 gespeicherten Gebäuden.
25
Objekt-Bezug
Spatial
Sekunden
20
15
3
Rekursion
3
Geometrie
2
2
2
3
1
1
10
1
1
5
3
14
11
1
1
1
2
3
6
3
0
50
500
1000
Abgefragte Gebäude
2000
2357
Abbildung 6.3: Dauer der kompletten SQL-Abfrage für eine unterschiedliche Anzahl
von Gebäuden; Eine SQL-Abfrage besteht aus vier verschiedenen
Komponenten: der Auswahl der Geometrie, der Rekursion, der
Spatial-Abfrage und des Objekt-Bezugs.
86
KAPITEL 6 – ANALYSE
Bei 2357 Gebäuden in der Datenbank (Abbildung 6.3) sind die Ergebnisse noch nicht auffällig. Die Dauer des kompletten Topologie-Querys (Gesamthöhe einer Säule) richtet sich nach
der Anzahl der abgefragten Gebäude, wobei eine wirkliche Abhängigkeit nur für die Komponente „Geometrie“ nachgewiesen werden kann. Die anderen Komponenten verhalten sich fast
konstant.
Die einzelnen Komponenten des Topologie-Querys werden durch Differenz-Bildung zweier
SQL-Abfragen ermittelt. So ergibt sich z.B. der „Objekt-Bezug“ aus der Differenz der kompletten SQL-Abfrage und einer Abfrage, in welcher das Sub-Query für den „Objekt-Bezug“
nicht mehr existiert. Die o.g. Sub-Querys sind im folgenden aufgelistet:
Sub-Query „Objekt-Bezug“
Hier wird der Zusammenhang zwischen dem Objekt und der Volumengeometrie hergestellt
und gleichzeitig nur Elemente ausgewählt, die nicht aggregiert sind.
SELECT g.volumen_ref.id_volumen
FROM volumengeometrie_objtab g
WHERE s.volumen_ref = g.id_volumengeom AND is_aggr = 0;
Sub-Query “Spatial“
Dieses Sub-Query wählt zunächst alle Objekte innerhalb einer 3D-Box anhand seiner Indizes
(SDO_FILTER) aus und überprüft diese Ergebnis noch mit der 2D-Funktion von
SDO_RELATE.
SELECT g.volumen_ref.id_volumen
FROM volumengeometrie_objtab g, (
SELECT r.id_objekt, r.volumen_ref, r.world
FROM objekt_reltab r
WHERE mdsys.sdo_filter(
r.world, mdsys.sdo_geometry(
3003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(
3445646.0,5539951.0,1.0,3446021.0,5540252.0,9999.0)
),'querytype=window'
) = 'TRUE'
) S
WHERE
s.volumen_ref = g.id_volumengeom AND is_aggr = 0 AND
mdsys.sdo_geom.relate(
S.world, 'ANYINTERACT', mdsys.sdo_geometry(
3003, NULL, NULL, mdsys.sdo_elem_info_array(1,1003,3),
6.3. EXPORT
87
mdsys.sdo_ordinate_array(
3445646.0,5539951.0,1.0,3446021.0,5540252.0,9999.0)
),0.5
Sub-Query „Rekursion“
Wie beim Sub-Query Spatial werden hiermit die Objekte innerhalb einer 3D-Box ausgewählt,
nur dass hier die Objekte ausgegeben werden, die Aggregate besitzen. Die ID’s aller aggregierten Objekte wird durch Rekursion ermittelt und an den übergeordneten SELECT-Befehl
übergeben.
SELECT m.volumengeom_ref.volumen_ref.id_volumen
FROM volumengeometrie_objtab o,TABLE(o.volumenaggregat_ntab) m
WHERE m.volumengeom_ref.volumen_ref.id_volumen > 0
START WITH o.id_volumengeom IN (
SELECT g.id_volumengeom
FROM volumengeometrie_objtab g, objekt_reltab o, (
SELECT r.id_objekt, r.world
FROM objekt_reltab r
WHERE mdsys.sdo_filter(
r.world, mdsys.sdo_geometry(
3003, NULL, NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(
3446733.79,5549996.27,142.8,
3445133.79,5539196.27,104.8)
), 'querytype=window'
) = 'TRUE'
) S
WHERE
o.volumen_ref = g.id_volumengeom AND
mdsys.sdo_geom.relate(
S.world, 'ANYINTERACT', mdsys.sdo_geometry(
3003, NULL, NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(
3446733.79,5549996.27,142.8,
3445133.79,5539196.27,104.8)
),0.5
) = 'TRUE'
) CONNECT BY PRIOR
m.volumengeom_ref.id_volumengeom = o.id_volumengeom
88
KAPITEL 6 – ANALYSE
Haupt-Query „Geometrie“
Hierbei handelt es sich um das Query, welches die Ergebnisse aus den verschiedenen SubQuerys in seiner WHERE-Klausel vereinigt und dann die gefundenen Objekte mit Ihren Koordinaten ausgibt.
SELECT
v.id_volumen,
m.masche_ref.aussen_ref.id_ring,
l.kante_ref.anfang_ref.id_knoten,
l.kante_ref.anfang_ref.x,
l.kante_ref.anfang_ref.y,
l.kante_ref.anfang_ref.z,
l.kante_ref.ende_ref.id_knoten,
l.kante_ref.ende_ref.x,
l.kante_ref.ende_ref.y,
l.kante_ref.ende_ref.z,
l.sortvar
FROM
ring_objtab r, volumen_objtab v,
TABLE(r.kantenliste_ntab) l,
TABLE(v.maschenliste_ntab) m
WHERE
v.id_volumen IN() AND
m.masche_ref.aussen_ref.id_ring = r.id_ring;
Abbildung 6.4 zeigt das gleiche Balkendiagramm wie zuvor, allerdings hier mit mehr als doppelt so vielen Gebäuden in der Datenbank. Nicht nur die Abfrage der reinen Geometrien verlangsamt sich im Vergleich zu Abbildung 6.3 deutlich, sondern die Rekursion nimmt wesentlich mehr Zeit in Anspruch. Der geringe Anteil der Rekursion bei der Auswahl aller Gebäude
scheint in der Datenbank sehr effizient gelöst zu sein. In der kompletten SQL-Abfrage (vgl.
Abschnitt 5.3.1) führt der Befehl UNION zwei Suchergebnisse zusammen und löscht dabei
doppelte Zeilen. In dem Moment, wo mit dem ersten Select-Befehl bereits alle gesuchten Gebäude aufgedeckt werden, überspringt UNION das Rekursions-Query, weil dort keine zusätzlichen Gebäude mehr gefunden werden können.
6.3. EXPORT
89
60
Objekt-Bezug
50
Spatial
7
Rekursion
5
40
Sekunden
Geometrie
7
30
4
3
11
20
39
12
10
0
1
28
12
11
15
9
6
3
50
500
1000
2000
4000
5716
Abgefragte Gebäude
Abbildung 6.4: Die Datenbank enthält jetzt 5716 Gebäude. Die Rekursion nimmt deutlich mehr Zeit in Anspruch, allerdings nicht bei der Abfrage aller
Geometrien.
Sekunden
100
90
Objekt-Bezug
80
Spatial
70
Rekursion
60
Geometrie
6
7
5
6
5
5
4
16
50
20
40
72
26
30
20
24
25
31
10
0
55
25
6
9
12
50
500
1000
18
2000
4000
8000
9943
Abgefragte Gebäude
Abbildung 6.5: Die Datenbank beinhaltet nun 9943 Gebäude. Die Dauer zur Verarbeitung der Rekursion hat sich proportional zur Datenmenge verdoppelt.
90
KAPITEL 6 – ANALYSE
Die geringe Dauer der Rekursion bei 8000 Objekten (16 Sekunden) wie auch bei 4000 Objekten in Abbildung 6.4 (4 Sekunden) lässt sich ebenfalls mit dem UNION-Befehl erklären: Die
Rekursion wird um so schneller, je mehr Gebäude bereits durch den ersten Select-Befehl ausgewählt wurden. Diese Gebäude müssen in der Rekursion nicht noch einmal abgefragt werden.
Vergleicht man die Dauer der Rekursion in den drei verschiedenen Abbildungen 6.3 bis 6.5
beispielweise bei 1.000 oder 2.000 Gebäuden, ergibt sich mit den Zeiten 3 Sek., 12 Sek. und
25 Sek. bereits ein eindeutig lineares Verhältnis. Weitere Messungen ergaben an dieser Stelle
einen ungefähren Wert von 2,5 Sekunden pro 1.000 Gebäude. Gesetzt den Fall, die Datenbank
beinhaltet 20.000 Gebäude und es sollten 1.000 Objekte abgefragt werden, so würde die Rekursion mit 50 Sekunden etwa 70% der Gesamtdauer einer Abfrage in Anspruch nehmen.
6.3.1 Spatial-Query
Bleibt man zunächst bei den Abbildungen 6.3 bis 6.5, fällt die Auswahl der Gebäude unter
Zuhilfenahme des räumlichen Index mit sechs bis sieben Sekunden kaum ins Gewicht. Spatial
wird hier aber auch für den Export der Geometrien benutzt. Dabei werden die Koordinaten
nicht wie zuvor erst während der Abfrage zusammengestellt, sondern lediglich aus dem Spatial-Layer (vgl. Abschnitt 5.3.2) gelesen. Dort liegen die Flächen eines Gebäudes, egal ob mit
oder ohne Aggregate, bereits in 3D-Koordinaten vor. Der SQL-Befehl zur Abfrage des Spatial-Layers (im folgenden „Spatial-Query“ genannt) sieht folgendermaßen aus:
SELECT s.id_objekt, world
FROM (
SELECT r.id_objekt, r.world
FROM objekt_reltab r
WHERE mdsys.sdo_filter(
r.world, mdsys.sdo_geometry(
3003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(
3446733.79,5549996.27,142.8,3445133.79,5539196.27,104.8)
), 'querytype=window'
) = 'TRUE'
) S, volumengeometrie_objtab v
WHERE mdsys.sdo_geom.relate(
S.world,'ANYINTERACT', mdsys.sdo_geometry(
3003,NULL,NULL,mdsys.sdo_elem_info_array(1,1003,3),
mdsys.sdo_ordinate_array(
3446733.79,5549996.27,142.8,3445133.79,5539196.27,104.8)
),0.5) = 'TRUE' AND v.id_volumengeom = s.id_object
6.3. EXPORT
91
100
90
2357 Gebäude
80
5716 Gebäude
Sekunden
70
9943 Gebäude
60
50
40
30
20
10
0
0
1000
2000
3000
4000
5000
6000
Abgefragte Gebäude
7000
8000
9000
10000
Abbildung 6.6: Die Dauer der Abfrage ist bei diesem Spatial-Query nur abhängig von
der Menge der abgefragten Daten, nicht von der Größe der Datenbank.
Das Spatial-Query erzeugt das gleiche Suchergebnis, wie das wesentlich komplexere Topologie-Query, das zuvor untersucht wurde. Wie Abbildung 6.6 zeigt, ist das Spatial-Query unabhängig von der Menge der abgespeicherten Daten. Die Abfragedauer ist nahezu proportional
zur Menge der abgefragten Daten. Wie die Abbildung zeigt, liegt die Abfragedauer bei ca. 10
Sekunden pro 1.000 Gebäude.
6.4 Beurteilung
Die Performance der räumlichen Anfragen durch Spatial ist sehr hoch. Bei einer räumlichen
Selektion von weniger als etwa 2.000 Objekten braucht die Datenbank nicht mehr als eine
Sekunde für die Anwendung der räumlichen Funktionen. Der Geschwindigkeitsvorteil beim
Export aus der Spatial-Tabelle fällt jedoch gegenüber dem Export aus dem geometrischtopologischen Modell unerwartet gering aus. Beim Export von nur wenigen Gebäuden
(<1.000) ist die Performance noch zufriedenstellend. Geht die Anzahl jedoch darüber hinaus,
dauert der Export aus dem geometrisch-topologischen Modell nur noch unwesentlich länger
als aus der Spatial-Tabelle. Abbildung 6.7 zeigt die Abfragedauer von Topologie-Query und
Spatial-Query bei einem Datenbestand von 5716 und 9943 Gebäuden.
92
KAPITEL 6 – ANALYSE
120
106
5716 Spatial-Query
5716 Topologie-Query
9943 Spatial-Query
9943 Topologie-Query
100
Sekunden
80
92
84
75
62
60
56
47
40
32
20
34
30
23
20
16
10
1
39
35
18
6
10
48
44
37
19
10
1
0
50
500
1000
2000
4000
8000
9943
Abgefragte Gebäude
Abbildung 6.7: Vergleich von Spatial-Query und Topologie-Query bei zwei unter
schiedlich großen Datenbankbeständen. Das Spatial-Query ist bei
steigender Anzahl abgefragter Gebäude nicht deutlich schneller.
Probleme gibt es allerdings bei der Rekursion, also der Suche von aggregierten Objekten, die
in beliebig tiefe Aggregationsebenen verschachtelt sein können. Das Problem begründet sich
dadurch, dass bei jedem Element, was durch CONNECT BY PRIOR aufgerufen wird, die
Tabelle erneut durchsucht werden muss. Weil das Objekt M.VOLUMENGEOM_REF.
ID_VOLUMENGEOM nicht indiziert werden kann, wird die Tabelle VOLUMENGEOMETRIE.
OBJTAB bei jedem Aufruf von CONNECT BY PRIOR erneut durchsucht. Dies führt zu einem Performanceverlust, der proportional zur Tabellengröße ist.
Alle Zeiten, die hier gemessen wurden, ergeben sich aus dem Mittel von drei Messungen,
deren Standard-Abweichung unterhalb von einer Sekunde liegt. Wichtig zu erwähnen ist hierbei, dass immer der erste Aufruf eines SQL-Befehls ca. 10% bis 15% langsamer ist, als die
folgenden, was sich durch Cache-Strategien seitens der Datenbank erklären lässt. Um vergleichbare Ergebnisse zu erzielen, wurde also immer die Dauer der Folgebefehle gemessen. In
der Realität werden exakt dieselben SQL-Befehle nur selten hintereinander verwendet, daher
sollte man für reale Anwendungen nochmals 10% bis 15% auf die hier erzielten Messergebnisse aufaddieren. Es lässt sich jedoch vermuten, dass auf großen Servern mit sehr viel Arbeitsspeicher dieser Effekt nicht mehr auftritt.
6.4. BEURTEILUNG
93
Sicherlich gibt es viele Möglichkeiten in Oracle, mit denen die SQL-Abfragen oder auch
grundsätzlich die Suche in Tabellen beschleunigt werden kann. Die Standardverfahren dazu
wurden allerdings schon berücksichtigt:
Durch die Verwendung von Primärschlüsseln in den Objekttabellen sind diese bereits indiziert. Eine zusätzliche Indizierung der anderen Spalten bringt daher keine signifikante Leistungssteigerung, was sowohl für die normalen Tabellen, als auch für eingebettete Tabellen
(nested tables) gilt. Für die Objekt-Referenzen wurden Scope’s angelegt, die ObjektReferenzen dazu zwingen, nur noch auf eine bestimmte Tabelle zu zeigen. Die Nutzung von
Scope’s verringert den Speicherverbrauch und steigert die Effizienz. Die SQL-Abfragen wurden ebenfalls durch manuelle Tests optimiert. Leider hilft das Programm SQL-Analyse aus
dem Oracle Tuning Pack an dieser Stelle nicht weiter, weil es offensichtlich nicht in der Lage
ist, objekt-relationale SQL-Befehle zu analysieren.
An dieser Stelle kann nur die Vermutung ausgesprochen werden, dass mit einem relationalen
Modell die Effizienz eventuell steigen könnte. Vermuten lässt sich das zumindest beim
Importieren der Daten, weil dort mit Hilfe der Prepared Statements in relationalen Tabellen
höhere Geschwindigkeiten erzielbar sind. Wie sich die Geschwindigkeit bei der Rekursion
oder bei der Auswahl der Geometrien auswirkt, bei der zwischen sieben und neun Tabellen in
einem großen JOIN zusammengefasst werden müssten, lässt sich nicht vorhersagen. Das gesamte Datenmodell in ein relationales umzuwandeln wäre aber grundsätzlich möglich. Das
Datenmodell verliert dadurch keine Funktionalität, die Umsetzung der rekursiven Aggregation und der m:n-Beziehungen sind lediglich etwas aufwändiger zu modellieren.
Kapitel 7
Schluss & Ausblick
In dieser Arbeit wurde ein objekt-relationales Datenmodell zur Repräsentation von 3DStadtmodellen in eine Oracle Datenbank implementiert. Bei der Ableitung aus dem geometrisch-topologischen Modell „Regengeld“ wurden entsprechend dem objekt-relationalen Ansatz nested tables verwendet, die m:n-Relationen und auch rekursive Strukturen ermöglichen.
Da die Aufgabe unter anderem in der Verwaltung und Abfrage räumlicher Daten bestand,
wurde bei der Umsetzung die Erweiterung Spatial hinsichtlich ihrer 3D-Fähigkeiten untersucht. Zusätzlich wurden im Rahmen dieser Arbeit verschiedene Werkzeuge für den Import
und Export dieser räumlichen Daten in ein VRML-Modell entwickelt, welche sowohl einen
Datenaustausch als auch die Visualisierung der Daten realisieren. Dabei besteht die Möglichkeit, bei der Erstellung der VRML-Daten entweder auf das geometrisch-topologische Modell,
oder auf die von Spatial verwaltete Tabelle zurückzugreifen. Die Evaluation des Systems
wurde anhand von realen Daten durchgeführt, die Ergebnisse analysiert und kritisch beurteilt.
Die Ergebnisse der Untersuchung von Spatial zeigen, dass 3D-Daten verwaltet und auch abgefragt werden können. Die dreidimensionale Indizierung von Objekten mit Hilfe eines RBaums unter Verwendung von Minimum Bounding Volumes ist ebenfalls möglich. Bei der
3D-Analyse mit diesen Minimum Bounding Volumes zeigen sich jedoch Schwächen, denn
bei einer Suche nach bestimmten Objekten z.B. innerhalb einer Suchbox werden unter Umständen zu viele Objekte gefunden. Immerhin ergibt eine solche Suche niemals weniger Treffer, als tatsächlich vorhanden. Dieses Problem lässt sich reduzieren, in dem das 3DSuchergebnis noch mit 2D-Funktionen analysiert wird, wobei diese Funktionen nur unter Vernachlässigung der z-Koordinate exakte Ergebnisse produzieren.
Um die Datenbank 3D-tauglich zu nennen, fehlen ihr noch die folgende Funktionen:
•
•
•
Exakte Unterscheidung von 3D-Objekten (vgl. Abbildung 4.14)
Messung der Schrägdistanz im Modell
Berechnung von Höhe, Volumen und Schwerpunkt eines 3D-Objekts
Bisher bleibt die Implementierung solcher 3D-Funktionen dem Nutzer von Spatial überlassen,
der eigene Entwicklungen jedoch problemlos in die Datenbank integrieren kann.
94
7. SCHLUSS & AUSBLICK
95
Beim Import der Daten leidet die Performance unter der objekt-relationalen Datenstruktur,
weil hier kein Prepared Statements durchgeführt werden kann. Das größte Performanceproblem entsteht durch die rekursive Durchsuchung von Objekttabellen, weil die Tabelle bei
jedem Aufruf der rekursiven Funktion erneut vollständig abgearbeitet werden muss. Auf diese
Weise sinkt die Performance proportional zur Größe einer Tabelle.
Im Gegensatz dazu fällt die Performance von Spatial bei der räumlichen Selektion der Daten
kaum ins Gewicht. Ergibt die räumliche Selektion weniger als etwa 2.000 Objekte, braucht
die Datenbank unter den Testbedingungen (vgl. Kapitel 6) weniger als eine Sekunde für die
Anwendung der räumlichen Funktionen.
Der Geschwindigkeitsvorteil beim Export aus der Spatial-Tabelle fällt jedoch gegenüber dem
Export aus dem geometrisch-topologischen Modell unerwartet gering aus. Beim Export von
nur wenigen Gebäuden (<1.000) ist die Performance noch zufriedenstellend. Geht die Anzahl
jedoch darüber hinaus, dauert der Export aus dem geometrisch-topologischen Modell nur
noch unwesentlich länger als aus der Spatial-Tabelle. Attributive Anfragen an die Datenbank,
die nicht die komplette Geometrie eines Objektes wiedergeben sollen, können mit diesem
System nahezu in Echtzeit abgefragt werden und auch komplette Geometrien von etwa 200
bis 300 Objekten können praktisch ohne Zeitverzug ausgegeben werden.
Um aber von einem echten 3D-GIS sprechen zu können, fehlt dem System zur Zeit noch eine
graphische Benutzer-Oberfläche, einige 3D-Routinen und weitere Geschwindigkeitsverbesserungen, um auch größere Datenmengen effizient verwalten zu können. Zu diesem Zweck
werden folgende Vorschläge für weitere Untersuchungen und Entwicklungen gemacht:
Zur Visualisierung von 3D-Objekten in der Benutzeroberfläche bietet sich Java3D an. Damit
können Suchergebnisse von SQL-Abfragen in einem Ansichtsfenster dargestellt werden in
dem auch Selektionen oder die Auswahl von bestimmten Operationen möglich sind. Die 3DStreckenmessung lässt sich damit ebenso wie die Einblendung von Zusatzinformationen realisieren. Darüber hinaus ist Java3D auch in der Lage, den Import und Export von VRML- oder
X3D-Dateien übernehmen.
Durch die Möglichkeit der Implementierung eigener Java- oder C++-Routinen in die Datenbank, bieten sich neben den oben angesprochenen 3D-Funktionen noch andere an. So können
Funktionen entwickelt werden, welche die 3D-Daten auf Ihre Integrität prüfen. Diese Überprüfung muss nicht nur beim Import der Daten erfolgen, sondern auch dann, wenn die Datenbank durch den Nutzer geändert wird. Genauso können anwendungsspezifische Funktionen
implementiert werden, wie z.B. die Visualisierung von Hochwasserständen oder die Funkwellen-Ausbreitung eines Mobilfunkmastes.
Für Fachanwendungen sind Verknüpfungen zu weiteren Datenbeständen denkbar. Neben den
3D-Objekten können z.B. digitale Geländemodelle, Orthophotos oder zusätzliche fachspezifische Informationen in das System eingebettet werden.
96
KAPITEL 7 – SCHLUSS & AUSBLICK
Hinsichtlich der Performance gibt es sicher noch Möglichkeiten, SQL-Abfragen zu beschleunigen und auch die Suche in den Tabellen zu verbessern. Vor allem ist zu prüfen, welche Vorund Nachteile die Umsetzung in ein relationales Datenmodell bringt. Ob die Rekursion dadurch beschleunigt werden kann, bleibt offen. Die Partitionierung von Tabellen könnte hier
bereits Abhilfe schaffen.
Dieses System verfügt ohne Zweifel über ein großes Potential und ist bereits jetzt nicht mehr
weit von einem 3D-Basis-GIS entfernt. Daher lohnt es sich in jedem Fall weitere Untersuchungen und Entwicklungen an diesem System vorzunehmen. Nicht zuletzt gibt diese Arbeit
auch Aufschluss über die Praxistauglichkeit eines Datenmodells, welches zu einem Standard
für die Repräsentation von 3D-Stadtmodellen werden soll.
8 Anhang
/*
/*
/*
/*
/*
/*
/*
/*
SQL-Datei zur Erstellung der Datenbank
by Markus Reuter
*/
*/
*/
Hier werden die Objekttypen definiert. */
Da einige Beziehungen rekursiv sind,
*/
werden die Typen hier nur namentlich
*/
aufgeführt, anders als bei den ntab*/
Typen, die jetzt schon vollständig sind */
/* PunktGeometrie */
CREATE OR REPLACE TYPE PunktGeometrie_objtyp
/
/* Knoten */
CREATE OR REPLACE TYPE Knoten_objtyp
/
/* LinienGeometrie */
CREATE OR REPLACE TYPE LinienGeometrie_objtyp
/
/* LinienAggregat */
CREATE OR REPLACE TYPE LinienAggregat_objtyp AS OBJECT
(
LinienGeom_ref
REF LinienGeometrie_objtyp
) NOT FINAL
/
CREATE OR REPLACE TYPE LinienAggregat_ntabtyp AS TABLE OF
LinienAggregat_objtyp
/
/* Kante */
CREATE OR REPLACE TYPE Kante_objtyp
/
/* KantenListe */
CREATE OR REPLACE TYPE KantenListe_objtyp AS OBJECT
(
SortVar
NUMBER,
Kante_ref
REF Kante_objtyp
97
98
KAPITEL 8 – ANHANG
) NOT FINAL
/
CREATE OR REPLACE TYPE KantenListe_ntabtyp AS TABLE OF Kantenliste_objtyp
/
/* Ring */
CREATE OR REPLACE TYPE Ring_objtyp
/
/* RingListe */
CREATE OR REPLACE TYPE RingListe_objtyp AS OBJECT
(
Ring_ref
REF Ring_objtyp
) NOT FINAL
/
CREATE OR REPLACE TYPE RingListe_ntabtyp AS TABLE OF Ringliste_objtyp
/
/* FlaechenGeometrie */
CREATE OR REPLACE TYPE FlaechenGeometrie_objtyp
/
/* FlaechenAggregat */
CREATE OR REPLACE TYPE FlaechenAggregat_objtyp AS OBJECT
(
FlaechenGeom_ref
REF FlaechenGeometrie_objtyp
) NOT FINAL
/
CREATE OR REPLACE TYPE FlaechenAggregat_ntabtyp AS TABLE OF
FlaechenAggregat_objtyp
/
/* Material RGB */
CREATE OR REPLACE TYPE RGB_objtyp
/
/* Material Textur */
CREATE OR REPLACE TYPE Matrix_vartyp AS VARRAY(9) OF NUMBER
/
8. SQL-DATEI ZUR ERSTELLUNG DER DATENBANK
CREATE OR REPLACE TYPE Textur_objtyp
/
/* Material */
CREATE OR REPLACE TYPE Material_objtyp
/
/* Orientierung */
CREATE OR REPLACE TYPE Orientierung_vartyp AS VARRAY(3) OF
NUMBER
/
/* Masche */
CREATE OR REPLACE TYPE Masche_objtyp
/
/* MaschenListe */
CREATE OR REPLACE TYPE MaschenListe_objtyp AS OBJECT
(
Masche_ref
REF Masche_objtyp
) NOT FINAL
/
CREATE OR REPLACE TYPE MaschenListe_ntabtyp AS TABLE OF
MaschenListe_objtyp
/
/* VolumenGeometrie */
CREATE OR REPLACE TYPE VolumenGeometrie_objtyp
/
/* VolumenAggregat */
CREATE OR REPLACE TYPE VolumenAggregat_objtyp AS OBJECT
(
VolumenGeom_ref
REF VolumenGeometrie_objtyp
) NOT FINAL
/
CREATE OR REPLACE TYPE VolumenAggregat_ntabtyp AS TABLE OF
VolumenAggregat_objtyp
/
/* Volumen */
99
100
KAPITEL 8 – ANHANG
CREATE OR REPLACE TYPE Volumen_objtyp
/
/* Hier bekommen die Typen alle Attribute, */
/* da jetzt alle Typen namentlich definiert */
/* sind.
*/
/* PunktGeomtrie */
CREATE OR REPLACE TYPE PunktGeometrie_objtyp AS OBJECT
(
ID_Punkt
NUMBER,
Knoten_ref
REF Knoten_objtyp
) NOT FINAL
/
/* Knoten */
CREATE OR REPLACE TYPE Knoten_objtyp AS OBJECT
(
ID_Knoten
NUMBER,
x
NUMBER,
y
NUMBER,
z
NUMBER
) NOT FINAL
/
/* LinienGeometrie */
CREATE OR REPLACE TYPE LinienGeometrie_objtyp AS OBJECT
(
ID_Linie
NUMBER,
Kante_ref
REF Kante_objtyp,
LinienAggregat_ntab LinienAggregat_ntabtyp,
is_aggr
NUMBER
) NOT FINAL
/
/* Kante */
CREATE OR REPLACE TYPE Kante_objtyp AS OBJECT
(
ID_Kante
NUMBER,
Anfang_ref
REF Knoten_objtyp,
Ende_ref
REF Knoten_objtyp
) NOT FINAL
/
8. SQL-DATEI ZUR ERSTELLUNG DER DATENBANK
/* Ring */
CREATE OR REPLACE TYPE Ring_objtyp AS OBJECT
(
ID_Ring
NUMBER,
KantenListe_ntab
KantenListe_ntabtyp
) NOT FINAL
/
/* Material RGB */
CREATE OR REPLACE TYPE RGB_objtyp AS OBJECT
(
R
NUMBER,
G
NUMBER,
B
NUMBER
) NOT FINAL
/
CREATE OR REPLACE TYPE Textur_objtyp AS OBJECT
(
Bitmap
BLOB,
Transformation Matrix_vartyp
) NOT FINAL
/
/* Material Objekt */
CREATE OR REPLACE TYPE Material_objtyp AS OBJECT
(
Textur
Textur_objtyp,
RGB
RGB_objtyp
) NOT FINAL
/
/* FlaechenGeometrie */
CREATE OR REPLACE TYPE FlaechenGeometrie_objtyp AS OBJECT
(
ID_Flaeche
NUMBER,
Masche_ref
REF Masche_objtyp,
FlaechenAggregat_ntab
FlaechenAggregat_ntabtyp,
MaterialOben
Material_objtyp,
MaterialUnten
Material_objtyp,
is_aggr
NUMBER
101
102
KAPITEL 8 – ANHANG
) NOT FINAL
/
/* Masche */
CREATE OR REPLACE TYPE Masche_objtyp AS OBJECT
(
ID_Masche
NUMBER,
Aussen_ref
REF Ring_objtyp,
Innen_ntab
Ringliste_ntabtyp,
Orientierung
Orientierung_vartyp
) NOT FINAL
/
/* VolumenGeometrie */
CREATE OR REPLACE TYPE VolumenGeometrie_objtyp AS OBJECT
(
ID_VolumenGeom
NUMBER,
Volumen_ref
REF Volumen_objtyp,
VolumenAggregat_ntab
VolumenAggregat_ntabtyp,
IS_AGGR
NUMBER
) NOT FINAL
/
/* Volumen */
CREATE OR REPLACE TYPE Volumen_objtyp AS OBJECT
(
ID_Volumen
NUMBER,
MaschenListe_ntab MaschenListe_ntabtyp
) NOT FINAL
/
/*
/*
/*
/*
Bisher sind nur Objekt-Typen definiert
worden, aber es wurde noch kein Speicher
zur Verfügung gestellt. Daher werden
jetzt die Tablespaces definiert.
/* Knoten */
CREATE TABLE Knoten_objtab OF Knoten_objtyp
(
PRIMARY KEY (ID_Knoten)
)
OBJECT IDENTIFIER IS PRIMARY KEY
/
*/
*/
*/
*/
8. SQL-DATEI ZUR ERSTELLUNG DER DATENBANK
103
/* PunktGeometrie */
CREATE TABLE PunktGeometrie_objtab OF PunktGeometrie_objtyp
(
PRIMARY KEY (ID_Punkt),
FOREIGN KEY (Knoten_ref) REFERENCES Knoten_objtab ON DELETE CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
/
/* Kante */
CREATE TABLE Kante_objtab OF Kante_objtyp
(
PRIMARY KEY (ID_Kante),
FOREIGN KEY (Anfang_ref) REFERENCES Knoten_objtab ON DELETE CASCADE,
FOREIGN KEY (Ende_ref) REFERENCES Knoten_objtab ON DELETE
CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
/
/* LinienGeometrie */
CREATE TABLE LinienGeometrie_objtab OF LinienGeometrie_objtyp
(
PRIMARY KEY (ID_Linie),
FOREIGN KEY (Kante_ref) REFERENCES Kante_objtab ON DELETE
CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE LinienAggregat_ntab STORE AS LinienAggregat_stortab
/
/* Ring */
CREATE TABLE Ring_objtab OF Ring_objtyp
(
PRIMARY KEY (ID_Ring)
)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE KantenListe_ntab STORE AS RingKante_stortab
104
KAPITEL 8 – ANHANG
/
/* Masche */
CREATE TABLE Masche_objtab OF Masche_objtyp
(
PRIMARY KEY (ID_Masche),
FOREIGN KEY (Aussen_ref) REFERENCES Ring_objtab ON DELETE
CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE Innen_ntab STORE AS MascheInnen_stortab
/
/* FlaechenGeometrie */
CREATE TABLE FlaechenGeometrie_objtab OF
FlaechenGeometrie_objtyp
(
PRIMARY KEY (ID_Flaeche),
FOREIGN KEY (Masche_ref) REFERENCES Masche_objtab ON DELETE CASCADE
)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE FlaechenAggregat_ntab STORE AS FlaechenAggregat_stortab
/
/* Volumen */
CREATE TABLE Volumen_objtab OF Volumen_objtyp
(
PRIMARY KEY (ID_Volumen)
)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE MaschenListe_ntab STORE AS VolumenMaschen_stortab
/
/* VolumenGeometrie */
CREATE TABLE VolumenGeometrie_objtab OF VolumenGeometrie_objtyp
(
PRIMARY KEY (ID_VolumenGeom),
FOREIGN KEY (Volumen_ref) REFERENCES Volumen_objtab ON DELETE CASCADE
8. SQL-DATEI ZUR ERSTELLUNG DER DATENBANK
)
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE VolumenAggregat_ntab STORE AS VolumenAggregat_stortab
/
/* Objekt (sdo_geometry kann nicht als
*/
/* Objekttyp erstellt werden, daher hier */
/* als relationale Tabelle
*/
CREATE TABLE Objekt_reltab
(
ID_Objekt
NUMBER,
Volumen_ref
NUMBER,
Flaeche_ref
NUMBER,
Linie_ref
NUMBER,
World
mdsys.sdo_geometry,
FOREIGN KEY (Volumen_ref) REFERENCES Volumengeometrie_objtab(ID_Volumengeom) ON DELETE CASCADE,
FOREIGN KEY (Flaeche_ref) REFERENCES
Flaechengeometrie_objtab(ID_Flaeche) ON DELETE CASCADE,
FOREIGN KEY (Linie_ref) REFERENCES
Liniengeometrie_objtab(ID_Linie) ON DELETE CASCADE,
PRIMARY KEY (ID_Objekt)
)
/
/* Koordinatensystem uns Genauigkeit festlegen */
insert into user_sdo_geom_metadata values
(
'Objekt_reltab','world', mdsys.sdo_dim_array
(
mdsys.sdo_dim_element('X', 0, 10000000, 0.001),
mdsys.sdo_dim_element('Y', 0, 10000000, 0.001),
mdsys.sdo_dim_element('Z', 0, 10000000, 0.001)
),
NULL
)
/
/* Ein Objekt erzeugen, um Index erstellen zu können */
insert into Objekt_reltab values
(
1, NULL, NULL, NULL,
105
106
KAPITEL 8 – ANHANG
mdsys.sdo_geometry
(
3004, NULL, NULL,
mdsys.sdo_elem_info_array(1, 1003, 1),
mdsys.sdo_ordinate_array
(
1,1,1, 1,1,1, 1,1,1,
2,2,2, 2,2,2, 2,2,2,
3,3,3, 3,3,3, 3,3,3,
1,1,1, 1,1,1, 1,1,1
)
)
)
/
/* Index erzeugen, danach nur noch "ALTER INDEX" */
create index world_spatial_idx
on Objekt_reltab(world)
indextype is mdsys.spatial_index parameters('sdo_indx_dims =
3')
/
/* Ändern der REF SCOPE Anweisung für Nested Tables */
/* LinienGeometrie */
ALTER TABLE LinienAggregat_stortab
ADD (SCOPE FOR (LinienGeom_ref) IS LinienGeometrie_objtab)
/
/* Ring */
ALTER TABLE RingKante_stortab
ADD (SCOPE FOR (Kante_ref) IS Kante_objtab)
/
/* FlächenGeometrie */
ALTER TABLE FlaechenAggregat_stortab
ADD (SCOPE FOR (FlaechenGeom_ref) IS FlaechenGeometrie_objtab)
/
/* Masche */
ALTER TABLE MascheInnen_stortab
ADD (SCOPE FOR (Ring_ref) IS Ring_objtab)
/
8. SQL-DATEI ZUR ERSTELLUNG DER DATENBANK
107
/* VolumenGeometrie */
ALTER TABLE VolumenAggregat_stortab
ADD (SCOPE FOR (VolumenGeom_ref) IS VolumenGeometrie_objtab)
/
/* Volumen */
ALTER TABLE VolumenMaschen_stortab
ADD (SCOPE FOR (Masche_ref) IS Masche_objtab)
/
/* Prozeduren */
CREATE OR REPLACE PROCEDURE INSERT_GEOM(GEOM
MDSYS.SDO_GEOMETRY, objid INTEGER) IS
BEGIN
update objekt_reltab set world = (GEOM) where id_objekt = objid;
COMMIT;
END;
/
Literaturverzeichnis
[Are03]
C. Arens, J. Stoter, P. van Oosterom, Modelling 3D spatial objects in a GEODBMS using a 3D primitive, AGILE conference, April 2003, Lyon, France
[Bru02]
A. Brunn, T. Kolbe, G. Gröger, W. Förstner, L. Plümer, Konzeption und Dokumentation eines Verfahrens zur Ableitung von 3D-Stadtmodellen aus der Regengelderfassung, Unveröffentlichter Abschlussbericht zur wissenschaftlichtechnischen Zusammenarbeit mit der Stadt Wuppertal, 2002
[Ege90]
M. J. Egenhofer, J. R. Herring, Categorizing Binary Topological Relations
Between Regions, Lines, and Points in Geographic Databases. Technical report, Department of Surveying Engineering, University of Maine, 1990.
[Fol95]
J. Foley, A. van Dam, S. Feiner, J. Hughes (1995), Computer Graphics,
Principles and Practice, Addison Wesley Longman, 2. Auflage.
[Fra02]
K.-H. Franke, 2002, Primitive Instancing, Institut für Praktische Informatik
und Medieninformatik TU-Ilmenau: http://kb-bmts.rz.tu-ilmenau.de/franke/
Scripte/Grafik/Ergaenzung_Primitive_Instancing.pdf
[Gut84]
A. Guttman, R-trees: a dynamic index structure for spatial searching. SIGMOD Record (ACM Special Interest Group on Management of Data),
14(2):47-57, 1984
[Kim89]
W. Kim, F.H. Lochovsky, Herausgeber. Object-Oriented Concepts, Databases
and Applications. ACM Press Frontier Series, Addison Wesley, Reading, MA,
1989
[Kin89]
R. King, My Cat is object-oriented. In [Kif89] Kapitel 2, Seiten 23-30, Addison-Wesley, 1989
[Klo98]
J. Kloss, VRML97, der neue Standard für Interaktive 3D Welten im World
Wide Web, Addison Wesley, Bonn, 1998
[Män88]
M. Mäntyla, 1988, An Introduction to Solid Modeling, Rockville, Maryland:
Computer Science Press
[McC02]
C. MCCullough-Dieter, Oracle 9i für Dummies, mitp-Verlag, Bonn, 2002
[Mol92]
M. Molenaar, 1992, A topology for 3D vector maps, ITC Journal 1992-1
108
LITERATURVERZEICHNIS
109
[OGCa]
Open GIS Consortium, OpenGIS Simple Features Specification for SQL,
http://www.opengis.org/techno/specs/99-049.pdf
[Oraa]
Oracle 9i Application Developer’s Guide – Object-relational Features,
Release 2 (9.2), März 2002,
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96594.pdf
[Orab]
Oracle 9i JDBC Developer’s Guide and Reference, Release 2(9.2), März 2002,
http://download.oracle.com/docs/cd/B10501_01/java.920/a96654.pdf
[Orac]
Oracle Spatial – User’s Guide and Reference, Release 9.2, März 2002,
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96630.pdf
[Orad]
Oracle Spatial – Java Library User’s Guide, Release 8.1.7, Juli 2002,
http://otn.oracle.com/docs/products/spatial/pdf/sdoapi.pdf
[Pfu02]
M. Pfund, 3D GIS Architecture, A Topological Data Structure, GIM International, Vol 16. Feb. 2002
[Pfu02b]
M. Pfund, 3D Geographic Information Systems, Institut für Geodäsie und Photogrammetrie, ETH Zürich,
http://www.gis.ethz.ch/research/gis/gis_3dgis.htm
[Rik94]
R. Rikkers et al., A query orientated implementation of a topologic data structure for 3-dimensional vector maps, Int. J. Geographical Information Systems,
Vol . 8, 1994
[RJB99]
J. Rumbaugh, I. Jacobson, G. Booch, The Unified Modeling Language Reference Manual, Addison-Wesley, Reading, 1999
[Sto03]
J.E. Stoter and S. Zlatanova, Visualisation and editing of 3D objects organised
in a DBMS, Proceedings of the EuroSDR Com V. Workshop on Visualisation
and Rendering, 22-24 January, Enschede, The Netherlands
[Ull88]
J.D. Ullman, Principles of Database and Knowledge-Base Systems, volume 1,
Computer Science Press, 1988
Herunterladen