- Fachgebiet Datenbanken und Informationssysteme

Werbung
Entwurf und Implementierung einer
kartographischen Datenbank nach dem
AFIS-ALKIS-ATKIS-Referenzmodell
Studienarbeit von
Heike Opitz
Betreut von
Dipl.-Math. Sascha Klopp
28. Februar 2003
Inhaltsverzeichnis
1 Einleitung
3
2 Übersicht über das derzeitige ATKIS-Schema
2.1 Konzeptionelles Schema . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Relationales Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
5
3 Konzeptionelles Datenbank-Schema
3.1 Übersicht . . . . . . . . . . . . . .
3.2 Einteilung in REO und ZUSO . . .
3.3 Objektnamen . . . . . . . . . . . .
3.4 Attribute . . . . . . . . . . . . . .
3.5 Folie und Objektarten . . . . . . .
.
.
.
.
.
6
6
8
8
8
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
11
12
13
13
14
14
15
16
16
16
17
17
17
.
.
.
.
.
4 Objektrelationales Datenbankschema
4.1 Benutzung des Datentyp REF . . . .
4.2 Objektklasse aa object . . . . . . . .
4.3 Objektklasse aa REO . . . . . . . . .
4.4 Objektklasse aa ZUSO . . . . . . . .
4.5 Objektklasse geom . . . . . . . . . .
4.6 Objektklasse above obj . . . . . . . .
4.7 Objektklasse ap gpo . . . . . . . . . .
4.8 Objektklasse präsentationsobjekt . . .
4.9 Objektklasse attr . . . . . . . . . . .
4.10 Objektklasse attr type . . . . . . . .
4.11 Objektklasse attr value . . . . . . . .
4.12 Objektklasse object race . . . . . . .
4.13 Objektklasse layer . . . . . . . . . .
4.14 Übersicht über die Objekttabellen . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Verwirklichung des Modells
19
5.1 Erstellung der Objektklassen und ihrer Tabellen . . . . . . . . . . . . . 19
5.2 Import der Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2.1 aaa attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1
5.2.2
5.2.3
5.2.4
aaa object name . . . . . . . . . . . . . . . . . . . . . . . . . . 22
aaa REO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
aaa ZUSO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
A PL/SQL-Code zur Erzeugung des Datenbank-Schemas
27
B PL/SQL-Code zum Import der
B.1 aaa attribute . . . . . . . . .
B.2 aaa REO . . . . . . . . . . .
B.3 aaa ZUSO . . . . . . . . . . .
B.4 aaa object name . . . . . . .
B.5 Update aaa REO . . . . . . .
B.6 Update aaa ZUSO . . . . . .
33
33
34
35
37
38
39
Daten
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Kapitel 1
Einleitung
In Deutschland sind die Vermessungs- und Katasterverwaltungen der Bundesländer
dafür zuständig, raumbezogene Basisdaten für Verwaltung, Wirtschaft und private
Nutzer zu liefern. Diese Daten werden digital erfasst, was es notwendig macht, sie in
angemessener Form zu speichern.
Für diesen Zweck wurden schon früh die Projekte ALK und ALB für Daten des
Liegenschaftskatasters und auch das Projekt ATKIS für die Daten der Topographischen Landesaufnahme ins Leben gerufen. Dies geschah in den 70er und 80er Jahren.
Inzwischen haben die Hersteller und Nutzer dieser Daten umfangreiche Erfahrungen
gesammelt und auch die Technik und die Anforderungen der Nutzer haben sich weiterentwickelt. Aus diesem Grund wurde ein neues Konzept von der Arbeitsgemeinschaft
der Vermessungsverwaltungen der Länder der Bundesrepublik Deutschland (AdV) in
Angriff genommen.
Hieraus entsteht zur Zeit das AFIS-ALKIS-ATKIS-Referenzmodell, in dem nun
die AdV-Projekte Amtliches Festpunktinformationssystem (AFIS), Amtliches Liegenschaftskatasterinformationssytem (ALKIS) und Amtliches Topographisch-Kartographisches Informationssystem (ATKIS) zueinander in Beziehung gebracht werden.
Ziel der Studienarbeit ist es nun, eine objektrelationale Datenbank für ATKISDaten zu entwickeln, die diesem Referenzmodell entspricht. Außerdem sollen die Daten der bisherigen ATKIS-Datenbank, die am Institut für Informationssysteme, Fachgebiet Datenbankensysteme genutzt wird, in die neue übertragen werden. Auf das
Schema, welches der bisherigen Datenbank zu Grunde liegt, wird im Kapitel 2 dieser
Studienarbeit noch einmal eingegangen.
In Kapitel 3 der Arbeit wird zunächst das konzeptionelle Schema beschrieben,
welches der Datenbank zu Grunde liegt. Daran schließt sich die Beschreibung des
objektrelationalen Schemas mit seinen Objekten und Relationen an. Als letztes folgt
dann eine Beschreibung der Übertragung der Daten.
Für die Erstellung der Datenbank wird Oracle 9i und PL/SQL verwendet.
3
Kapitel 2
Übersicht über das derzeitige
ATKIS-Schema
In diesem Kapitel soll noch einmal eine Übersicht über das zur Zeit verwendete Schema gegeben werden. Für ausführliche Informationen kann in der Studienarbeit von
Stephan Falke [Fal00] oder im Informatik-Bericht vom August 2000 [KFL00] nachgelesen werden.
Im weiteren wird dieses Schema als ’altes Schema’ bezeichnet.
2.1
Konzeptionelles Schema
Zentrale Klasse ist hier die Klasse Objekt, die alle zu erfassenden Landschaftsobjekte
in ATKIS enthält. Jedem Objekt können mehrere Namen zugeordnet werden, sowie
mehrere Attribute. Des weiteren gehört es zu einer Folie und einer Objektart. Die
Klasse Objektgeometrie ist für Geometrieinformationen, die sowohl zu Objekten selbst
aber auch nur zu Objektteilen gehören können, zuständig. Im Modell gibt es auch
noch komplexe Objekte, die über die Beziehung ist Bestandteil von modelliert werden.
Objekte können auch über bzw. untereinander liegen, was über die Beziehung liegt
oberhalb von modelliert wird.
Die folgende Abbildung 2.1 entspricht der Abbildung 4.1 aus dem InformatikBericht.
4
Objektname
#Typ: VARCHAR2(2)
+Wert: VARCHAR2(31)
+GeometrieArt/Angabe: Geo_Table_Type
0..*
ist Bestandteil von
0..*
bezeichnet
1..1
0..*
Objekt
Objektart
#ObjID: VARCHAR2(7)
Folie
gehört zu
gehört zu
#Nummer: VARCHAR2(4)
+Modelltyp: VARCHAR2(2)
#Nummer: VARCHAR2(4)
1..1 +Bezeichnung: VARCHAR2(100)
0..* +Entstehungsdatum: Date 0..*
1..1
+Bezeichnung: VARCHAR2(100)
+Koordinaten: Punkt
1..1
1..1
0..1
ist Teil von
besitzt
gibt 2D-Lage an
0..1
Objektgeometrie
+Geometrie: SDO_GEOMETRY
0..*
0..*
gibt Lage an
0..1
0..1
0..*
Objektteil
#ObjektteilID: VARCHAR2(3)
besitzt
0..1
0..*
0..*
Objektattribut
0..* 0..*
hat
ist von
liegt oberhalb von
beschrieben durch
1..1
1..*
Attributtyp
#Typnummer: VARCHAR2(4)
#Name: VARCHAR2(100) 1..1
1..1
Attributwert
#Wert: VARCHAR2(4)
#Bezeichnung: VARCHAR2(100)
Abbildung 2.1: Altes Schema nach dem Informatik-Bericht [KFL00]
2.2
Relationales Schema
Aus dem konzeptionellen Schema gehen folgende Relationen hervor:
• object(ObjNo, LayerNo → layer, ObjectRaceNo → object race, CoordinateX,
CoordinateY, Actual, ModType, BuildDate)
• object geometry(ObjectNo → object, ObjectPartNo, ObjectGeometry)
• above(TopNo → object, TopPartNo, DownNo → object, DownPartNo)
• complex object(BigNo → object, SmallNo → object)
• object name(ObjectNo → object, TypeNo, Value, Geo)
• attribute(ObjectNo → object, ObjectPartNo, Type, Value)
• object race(ObjectRaceNo, Name)
• layer(LayerNo, Name)
• attribute type(AttTypeNo, Name)
• attribute value(Type, Value, Name)
5
Kapitel 3
Konzeptionelles
Datenbank-Schema
3.1
Übersicht
Dieses Datenbank-Schema ist abgeleitet aus dem AFIS-ALKIS-ATKIS-Referenzmodell.
So finden sich hier die Objekte unterteilt in räumlich Elementarobjekt und zusammengesetzte Objekte, die Präsentationsobjekte, Attribute, Layer und Objektarten
wieder.
Räumliche Elementarobjekte (REO) sind die Objekte, denen eine Geometrie zugeordnet wird und nicht weiter zerlegbar sind. Im Gegensatz dazu gibt es die zusammengesetzten Objekte (ZUSO), die wieder aus ZUSOs und REOs zusammengesetzt sind.
Jedes Objekt ist eindeutig einem Layer zugeordnet. Objekte der gleichen Objektart
liegen alle auf demselben Layer, zusammen mit Objekten anderer Objektarten. Diese
Objektarten gehen aus einem Objektartenkatalog hervor. Außerdem kann es zu jedem
Objekt noch Präsentationsobjekte geben, die zur Darstellung des Objektes dienen. Sie
enthalten die Bezeichnung und die Darstellung dieser Bezeichung in der fertigen Karte.
Im Signaturnummernkatalog sind bestimmte Signaturen für gewisse Objekte bereits
vordefiniert.
Die REOs haben außerdem noch die Eigenschaft, über bzw. untereinander zu
liegen, was in der Unter- bzw. Überführungfunktion modelliert wird.
Für andere Maßstäbe gibt es noch die Funktion ist abgeleitet aus, um das gleiche
Objekt in anderen Maßstäben zu identifizieren.
6
Abbildung 3.1: Konzeptionelles Schema
7
Folie
1..1
gehört zu
gehört zu
1..1
AU_Object
Unterführung
+Geometrie: SDO_GEOMETRY
Ueberführung
0..n
Objekt
1..1
hat
+Wert: VARCHAR2(4)
+Bezeichnung: VARCHAR2(100)
Attributwert
besitzt
0..*
1..1
1..1
Attributtyp
ist von
+Typnummer: VARCHAR2(4)
+Bezeichnung: VARCHAR2(100)
beschrieben durch
1..*
0..*
ObjektAttribut
0..*
0..*
besitzt
AP_TPO
+Geometrie: SDO_GEOMETRY
Präsentationsobjekt
+Schriftinhalt: VARCHAR2(31)
+fontSperrung: NUMBER = 0
+skalierung[0..1]: NUMBER = 1
+horizontaleAusrichtung: AP_HorizontaleAusrichtung = linksbündig
+vertikaleAusrichtung: AP_VertikaleAusrichtung = Basis
0..1
istTeilVon
0..n
ZUSO
AP_GPO
+signaturnummer: VARCHAR2
+darstellungsprioritätLinie[0..1]: NUMBER
+darstellungprioritaetFlaeche[0..1]: NUMBER
Zusammensetzung
bestehtAus
1..n
dientZurDarstellungVon
+Identifikator: VARCHAR2(7)
+Lebenszeitintevall: AA_Lebenszeitintervall
+anlass[0..1]: Sequence<AA_Anlassart>
0..* +zeigtAufExternes[0..1]: Set<Fachdatenverbindung>
0..*
+modellartenZugehoerigkeit: AA_Modellartenerkennung
hatDirektUnten
hatDirektOben
0..1
0..n
0..n
REO
+Nummer: VARCHAR2(4)
+Bezeichnung: VARCHAR2(100)
ist abgeleitet aus
0..n
Kartengeometrie
Objektart
+Nummer: VARCHAR2(4)
+Bezeichnung: Varchar2(100)
3.2
Einteilung in REO und ZUSO
Im alten Schema werden alle Objekte in einer Klasse spezifiziert. Diese Objekte sind
später in einigen Tabellen, wie zum Beispiel geometry, nochmal in Objektteile zerlegt,
oder können komplexe Objekte sein. Im neuen Schema gibt es jetzt zwei Klassen, in
denen Objekte definiert werden. Dabei fällt die Unterteilung in Objektteile weg. Im
neuen Schema sind die REOs Objekte, die nicht weiter zerlegt werden können. Daher
wurde der siebenstelligen Objektnummer jeweils die dreistellige Objektteilnummer
angehängt. So erhält man einen zehnstellige Objektidentifikator. Zusammengesetzte
Objekte bekommen den String ’000’ angehängt. So ergibt sich eine eindeutige Unterteilung in REO und ZUSO bei dem Identifikator.
Auf diese Weise enstehen aus den Objektteilen eigenständige Objekte und ihr
Oberobjekt wird zu einem zsammengesetzten Objekt.
Komplexe Objekte werden in diesem Schema einfach zu ZUSOs.
3.3
Objektnamen
Für Bezeichnungen und Beschreibungen der erfassten Objekte sind Präsentationsobjekte zuständig. Nach dem Referenzmodell erbt die Klasse Präsentatinsobjekt von den
Klassen ap tpo und ap gpo. In den Präsentationsobjekten werden alle Texte und Kartensignaturen definiert, die nicht vollautomatisch für einen bestimmten Zielmaßstab
erzeugt und platziert werden können. Die Informationen die hier aufgenommen wurden sind weit ausführlicher, als die des alten Schemas. So gab es in dem alten Schema
keine Signaturnummern und keine weiteren Angaben zu der Darstellung des Objektnamens. Jetzt gibt es noch die Eigenschaften Fontsperrung, Skalierung, horizontale
Ausrichtung und vertikale Ausrichtung, die die Darstellung des Objektnames noch
weiter beschreiben.
3.4
Attribute
Attribute werden sowohl REOs wie auch ZUSOs zugewiesen. Jedes Attribut hat einen
Wert und ist von einem bestimmten Attributtyp. Die Attributtypen sind für jeden
Maßstab fest definiert und daher unabhängig von den jeweiligen Daten. Ähnlich ist
es mit den Attributwerten. Eine ganze Reihe von Attributwerten sind bereits fest zu
Attributtypen angelegt und daher genauso unabhängig von den Daten. Zu einigen
Attributen wird aber auch direkt ein Wert angegeben, der dann nicht vorher schon
festgelegt war.
Die Attribute, Attributtypen und Attributwerte gab es bereits in genau der gleichen Form im alten Schema.
8
3.5
Folie und Objektarten
Die Folie und die Objektart sind ebenfalls statische Daten, die unabhängig von den
konkreten Daten sind. Auch diese Klassen gab es schon im alten Schema.
Jedes Objekt wird einer Objektart und einer Folie zugeordnet. Objekte der gleichen Objektart liegen auch auf der gleichen Folie. Zu jedem ATKIS-Modell eines
Maßstabs gibt es einen Objektartenkatalog. Die Folien sagen etwas über die Funktion der Objektart aus. Die Gliederung ist, anders als die Gliederung, die aus den
Objektartennummern hervorgeht, nicht hierarchisch. Daher wird die Folienzuordnung
vorgenommen, obwohl diese bereits aus der Objektartenzugehörigkeit hervor geht.
9
Kapitel 4
Objektrelationales
Datenbankschema
In diesem Kapitel wird auf die Implementation der Datenbank eingegangen. Es werden
die Klassen des erstellten Schemas beschrieben, sowie die Bedingungen der zugehörigen Objekttabellen. Zu jeder Klasse werden die einzelnen Einträge mit ihren Datentypen aufgeführt. Zusätzlich gibt es eine kurze Beschreibung, welche Informationen
der jeweilige Eintrag enthält.
Zuerst jedoch eine kleine Einführung zum Datentyp REF:
4.1
Benutzung des Datentyp REF
An vielen Stellen des Schemas wird jetzt der Datentyp REF benutzt. Er ersetzt frühere Fremdschlüsselbeziehungen. Einträge dieses Datentyps sind Zeiger auf Objekte. Bei
der Initialisierung des Datentyps muss eine Objektklasse angegeben werden, auf die
der Zeiger verweist. Wird so ein Datentyp in einer Tabelle verwendet, kann ihm eine
konkrete Zieltabelle zugewiesen werden. Diese Tabelle muss Objekte des Typs enthalten, der vorher dem Zeiger zugewiesen wurde oder aber Subtypen dieses Typs. Diese
Zuweisung wird als SCOPE bezeichnet. Durch die Zuweisung eines solchen SCOPES
wird der Speicherplatzbedarf dieses Zeigers in der Tabelle um einiges reduziert.
Man erhält einen Zeiger durch anwenden der integrierten Funktion REF(). Dies
soll einmal an einem Beispiel verdeutlicht werden.
SELECT REF(p)
FROM aaa_layer p;
Diese Anfrage liefert Zeiger, die auf die Objekte in der Tabelle aaa layer verweisen.
Die Zeiger können dann in anderen Tabellen als Eintrag gespeichert werden.
Um später auf die Daten, auf die der Zeiger zeigt direkt zuzugreifen, wird einfach
die integrierte Funktion DEREF() verwendet. Eine entsprechende Anfrage würde folgendermaßen aussehen:
10
SELECT DEREF(layer_ref)
FROM aaa_REO;
Diese Anfrage liefert die Objekte der Tabelle aaa layer, auf die die Referenzen
verweisen.
Die Funktionen REF() und DEREF() werden in der Oracle-Dokumentation noch
näher beschrieben.
4.2
Objektklasse aa object
Name
Obj ID
lebenszeitintervall
anlass
zeigtAufExternes
ObjRace ref
CoordinateX
CoordinateY
modType
layer ref
name ref
attr ref
Klasse aa
Name
beginnt
endet
Datentyp
Beschreibung
VARCHAR2(10)
Identifikation des Objekts
aa lebenszeitintervall
VARCHAR2(50)
VARCHAR2(50)
REF race
Referenz auf die zugehörige
Objektart (4.12)
NUMBER(9)
NUMBER(9)
VARCHAR2(2)
REF aa layer
Referenz auf den zugehörigen
Layer (4.13)
name ref table type Tabelle mit Referenzen auf zugehörige
Präsentationsobjekte (4.8)
attr ref table type
Tebelle mit Referenzen auf zugehörige
Attribute (4.9)
lebenszeitintervall:
Datentyp Beschreibung
DATE
DATE
Diese Klasse ist die zentrale Klasse zur Definition der Objekte. Sie definiert die gemeinsamen Eigenschaften der REOs und ZUSOs. Die Klasse wird als NOT FINAL
deklariert, damit die Klassen aa REO und aa ZUSO noch von ihr erben können. In
ihnen werden die Objekte noch einmal differenziert. Zu dieser Klasse gibt es keine
direkte Objekttabelle.
Die Obj ID ist ein zehnstelliger Charakterstring der zur Identifikation des Objektes
dient. Dabei sind die ersten sieben Stellen vom alten Schema übernommen. Die letzten
drei Stellen ergeben sich aus der neuen Zuordnung der Objekte zu REOs und ZUSOs.
Hierauf wurde in Kapitel 3.2 bereits näher eingegangen.
Das Lebenszeitintervall gibt an, wann das Objekt erstellt wurde, und wann es eventuell seine Gültigkeit verliert. anlass und zeigtAufExternes sind neu in dem ATKIS-
11
Referenzmodell vorgesehen. Die beiden Einträge CoordinateX und CoordinateY sind
zusätzlich aus dem alten Schema in diese Klasse mit aufgenommen worden, da sie
unter Umständen noch benötigt werden.
Die vier Einträge ObjRace ref, layer ref, name ref und attr ref enthalten jeweils
Referenzen des Datentyps REF. Dieser Datentyp implementiert Zeiger auf andere Tabellen. Eine nähere Beschreibung dieses Datentyps fand bereits in Kapitel 4.1 statt.
Da es bei den letzten beiden Einträgen vorkommen kann, dass auf mehrere Objekte
referenziert werden muss, werden hier geschachtelte Tabellen (nested tables) verwendet.
4.3
Objektklasse aa REO
Name
Datentyp
Beschreibung
modellartenZugehörigkeit VARCHAR2(7)
geo ref
REF geom
Referenz zur zugehörigen
Geometrie (4.5)
Diese Klasse erbt von der Klasse aa object. Sie dient zur Spezifikation von räumlichen
Elementarobjekten (REO). Jedes REO besitzt eine es beschreibende Geometrie. Diese
Geometrie wird, anders als nach dem allgemeinen Schema, nicht direkt in der Klasse
selbst abgelegt, sondern in der separaten Klasse geom (4.5). Dies fördert die Übersicht
und verringert die Datenmenge dieser Klasse.
Diese Klasse besitzt außerdem noch zwei Funktionen.
• hatDirektOben
Diese Funktion liefert eine Tabelle des Typs object table type zurück. Diese Tabelle enthält alle Obj IDs von Objekten, die über diesem Objekt liegen.
• hatDirektUnten
Diese Funktion liefert ebenfalls eine Tabelle des Typs object table type zurück.
In diesem Falle mit Obj IDs von Objekten, die unter diesem Objekt liegen.
Die Funktionen greifen dafür auf die Objekttabelle above (4.6) zu, in der diese Verhältnisse beschrieben sind.
Zu dieser Klasse gehört die Objekttabelle REO. Für ihre Spalten gelten noch folgende Bedingungen:
• Obj ID ist Primärschlüssel
• ObjRace ref darf nicht leer sein und hat als Zieltabelle object race
• layer ref darf nicht leer sein und hat als Zieltabelle layer
• geo ref darf nicht leer sein und hat als Zieltabelle geometry
12
• Die Einträge der nested table attr ref haben als Zieltabelle attribute
• Die Einträge der nested table name ref haben als Zieltabelle object name
4.4
Objektklasse aa ZUSO
Name
Datentyp
modellartenZugehörigkeit VARCHAR2(7)
combined of
combined of table type
Beschreibung
Referenzen zu zugehörigen
Unterobjekten
Diese Klasse erbt ebenfalls von der Klasse aa object. Sie dient zur Spezifikation von
zusammengesetzten Objekten (ZUSO). Diese Objekte haben Unterobjekte aus denen
sie zusammengesetzt sind. Dies können REOs aber auch wieder ZUSOs sein. Diese
Objekte werden in der nested table combined of referenziert. Dementsprechend enthält sie Objekte vom Typ REF aa object.
Zu dieser Klasse gehört die Objekttabelle ZUSO. Für diese sind folgende Bedingungen
definiert:
• Obj ID Primärschlüssel
• ObjRace ref darf nicht leer sein und hat als Zieltabelle object race
• layer ref darf nicht leer sein und hat als Zieltabelle layer
• Die Einträge der nested table attr ref haben als Zieltabelle attribute
• Die Einträge der nested table name ref haben als Zieltabelle object name
Für die Spalte combined of kann keine Zieltabelle angegeben werden, da die Zeiger
auf unterschiedliche Tabellen verweisen müssen.
4.5
Objektklasse geom
Name
Datentyp
Beschreibung
Obj ID
VARCHAR2(10)
Identifikator des Objekts
geometry mdsys.sdo geometry Geometrie des Objekts
Diese Klasse dient als Unterlage für eine Objekttabelle, in der die ausgelagerten
Geometrien aus der Tabelle ZUSO gespeichert werden. Die Geometrien werden in dem
Datentyp mdsys.sdo geometry gespeichert. In diesem Datentyp sind sie auch bereits in
der alten Datenbank gespeichert und können daher einfach übernommen werden. Eine
13
genauere Beschreibung dieses Datentyps kann man in der Studienarbeit von Stephan
Falke [Fal00] finden.
Für die Objekttabelle gelten noch folgende Bedingungen:
• Obj ID Primärschlüssel
• geometry darf nicht leer sein
4.6
Objektklasse above obj
Name
Datentyp
Beschreibung
top ID
VARCHAR2(10) Identifikator des oben liegenden Objekts
down ID VARCHAR2(10) Identifikator des unten liegenden Objekts
Objekte können sich gegenseitig überlappen, das heißt, ein Objekt liegt über dem
anderen. Diese Klasse dient dazu dieses zu modellieren. Auf die Objekttabelle dieser
Klasse wird von den beiden Funktionen der Klasse aa REO (4.3) zugegriffen.
In der Objekttabelle sind beide Einträge gemeinsam Primärschlüssel.
4.7
Objektklasse ap gpo
Name
Obj ID
Datentyp
VARCHAR2(10)
signaturnummer
darstellungsprioritätsLinie
darstellungprioritätsFläche
VARCHAR2(100)
NUMBER
NUMBER
Beschreibung
Identifikation des zugehörigen
Objekts
Diese Klasse ist im Referenzmodell vorgesehen. Sie dient nur als Oberklasse für die
Präsentationsobjekte. Die Signaturnummern sind im Signaturenkatalog definiert und
dienen zur Steuerung der Darstellung der Präsentationsobjekte.
14
4.8
Objektklasse präsentationsobjekt
Name
TypeNo
schriftinhalt
fontSperrung
skalierung
horizontaleAusrichtung
vertikaleAusrichtung
geometry
name count
Datentyp
VARCHAR2(2)
VARCHAR2(31)
NUMBER
NUMBER
VARCHAR2(13)
Beschreibung
Art des Namens
Bezeichnung des Objektes
0
1
Mögliche Werte: linksbündig,
rechtsbündig,
zentriert
VARCHAR2(5)
Mögliche Werte: Basis,
Mitte,
oben
mdsys.sdo geometry Geometrische Beschreibung des
Präsentationsobjekts
NUMBER
Zähler, der jeweils über Einträge
zum gleichen Objekt läuft
Diese Klasse dient zur Spezifikation von Präsentationsobjekten und erbt von der Klasse ap gpo. Präsentationsobjekte sind Objekte, die zur Beschreibung der eigentlichen
Objekte dienen. So enthalten sie im schriftinhalt die Bezeichnung des Objekts und
wie diese Bezeichnung auf der späteren Karte gestalltet werden soll. Dafür sorgen die
Werte bei fontSperrung, skalierung, horizontaleAusrichtung und vertikaleAusrichtung.
Der Grund für die Einführung der Spalte name count liegt in der Vergabe des Primärschlüssels in der zugehörigen Objekttabelle. Spalten des Datentyps
mdsys.sdo geometry können nicht zu einem Primärschlüssel hinzugenommen werden.
Ohne diese Spalte ließ sich keine Eindeutigkeit herstellen.
Der Eintrag TypeNo wurde aus dem alten Schema übernommen. Er kann drei
Werte annehmen, die folgende Bedeutung haben:
• GN: geographischer Name
• KN: Klassifizierungsname
• ZN: Zweitname
Die in der obigen Tabelle unterstrichenen Werte sind die Standardwerte die im
Referenzmodell festgelegt sind.
Zu den Präsentationsobjekten gehört nun die Objekttabelle object name. Für die
Tabelle gelten folgende Bedingungen:
• Primärschlüssel sind die Spalten Obj ID und name count
• TypeNo darf nicht leer sein
• schriftinhalt darf nicht leer sein
15
4.9
Name
Obj ID
Type
Value
Objektklasse attr
Datentyp
VARCHAR2(10)
REF attr type type
VARCHAR2(7)
Beschreibung
Identifikation des zugehörigen Objekts
Referenz zum zugehörigen Attributtyp (4.10)
Wert des Attributs
Diese Klasse dient zur Spezifikation von Attributen. Attribute sind immer von einem
bestimmten Typ und haben einen Wert.
Dieser Wert, der in der Spalte Value steht, ist entweder ein Verweis auf die Objekte
der Klasse attr value, welche dann die tatsächlichen Werte enthalten oder sind bereits
die Werte selbst. Aus diesem Grund kann hier kein Zeiger verwendet werden. Die
Typen hingegen sind alle in der Tabelle attribute type abgelegt und können in dieser
referenziert werden.
Die Objekttabelle attribute ist die zugehörige Objekttabelle, in der noch folgende
Bedingung gilt:
• Zieltabelle von Type ist attribute type
4.10
Objektklasse attr type
Name
Datentyp
Beschreibung
AttrTypeNo VARCHAR2(4)
Attributtypennummer
Name
VARCHAR2(100) Bezeichnung des Attributtyps
Diese Klasse dient zur Spezifikation von Attributtypen. In der zugehörigen Objekttabelle ist die AttrTypeNo Primärschlüssel.
Attributtypen sind für jeden Maßstab standardisiert und unabhängig von den
tatsächlich gespeicherten Informationen.
4.11
Name
Type
Value
Name
Objektklasse attr value
Datentyp
VARCHAR2(4)
VARCHAR2(7)
VARCHAR2(100)
Beschreibung
Verweis auf den zugehörigen Attributtyp
Attributwert
Bezeichnung
Diese Klasse dient zur Spezifikation von Attributwerten. In der zugehörigen Objekttabelle sind die Spalten Type und Value gemeinsam Primärschlüssel.
In der Tabelle werden Werte zu bestimmten Attributtypen abgelegt. Diese sind
dann ebenfalls standardisiert und unabhängig von den tatsächlich gespeicherten In-
16
formationen. Es gibt jedoch auch Attribute bei denen der Attributwert direkt beim
Attribut gespeichert wird.
4.12
Objektklasse object race
Name
Datentyp
Beschreibung
ObjectRaceNo VARCHAR2(4)
Identifikation der Objektart
Name
VARCHAR2(100) Bezeichnung der Objektart
Diese Klasse dient zur Spezifikation von Objektarten. Diese Objektarten sind für jeden
Maßstab in einem Objektartenkatalog definiert.Objektarten sind ebenfalls, wie auch
bereits in Kapitel 3.5 beschrieben, standardisiert.
Zu dieser Klasse gehört die Objekttabelle object race, welche als Primärschlüssel
ObjectRaceNo besitzt.
4.13
Objektklasse layer
Name
Datentyp
Beschreibung
LayerNo VARCHAR2(3)
Identifikation des Layer
Name
VARCHAR2(100) Bezeichnung des Layer
Diese Klasse dient zur Spezifikation der Layer. Jede Objektart ist einer Folie (Layer)
zugeordnet. Also liegen zum Beispiel alle Objekte der gleichen Objektart auf der
gleichen Folie. Die Folien sind auch standardisiert für die unterschiedlichen Maßstäbe.
Zu dieser Klasse gehört die Objekttabelle layer, welche als Primärschlüssel
LayerNo besitzt.
4.14
Übersicht über die Objekttabellen
Im folgenden Diagramm soll noch einmal ein Überblick über die Objekttabellen gegeben werden. Dabei sind zur Förderung der Übersichtlichkeit die Spalten der Tabellen
weggelassen worden. Auf diese wurde in diesem Kapitel auch schon ausführlich eingegangen. In dem Diagramm geht es vorallem um eine Übersicht, in welchen Beziehungen
die Tabellen zueinander stehen.
17
object_name
M
M
geometry
bezeichnet
bezeichnet
1
1
1
beschreibt
M
1
ZUSO
besteht aus
M
hat oben
1
1
M
REO
M
above
1
M
M
hat unten
liegt auf
liegt auf
1
1
Layer
M
M
ist von
1
ist von
1
1
1
object_race
besitzt
M
besitzt
M
attribute
M
hat
M
ist von
1
1
attribute_type
attribute_value
Abbildung 4.1: Beziehungen zwischen den Objekttabellen
18
Kapitel 5
Verwirklichung des Modells
Im folgenden wird beschrieben, wie die Daten von der alten Datenbank in die neue
Datenbank importiert werden. Damit es nicht zu Überschneidungen mit den Bezeichnungen der Tabellen aus dem alten Schema kommt, wird den Tabellen des neuen
Schemas ’aaa’ vorangestellt.
5.1
Erstellung der Objektklassen und ihrer Tabellen
Zunächst werden die Objektklassen und ihre Objekttabellen erzeugt. Dies soll hier
einmal am Beispiel der Tabelle aaa reo erläutert werden. Der vollständige Quelltext
steht in Anhang A.
Zunächst werden die Objektklassen aa object und aa reo implementiert:
CREATE TYPE aa_object AS OBJECT (
Obj_ID VARCHAR2(10),
lebenszeitintervall aa_lebenszeitintervall,
anlass VARCHAR2(50),
zeigtAufExternes VARCHAR2(50),
ObjRace_ref REF race,
CoordinateX NUMBER(9),
CoordinateY NUMBER(9),
modType VARCHAR2(2),
layer_ref REF aa_layer,
name_ref name_ref_table_type,
attr_ref attr_ref_table_type
) NOT FINAL;
/
19
CREATE TYPE aa_reo UNDER aa_object (
modellartenZugehoerigkeit VARCHAR2(7),
geo_ref REF geom,
MEMBER FUNCTION hatDirektOben RETURN object_table_type,
MEMBER FUNCTION hatDirektUnten RETURN object_table_type);
/
Diese Klassen dürfen in der Reihenfolge erst nach den Klassen aa lebenszeitintervall,
race, aa layer, name ref tabel type, attr ref tabel type und geom erzeugt werden, damit auf sie in dieser Klasse zugegriffen werden kann. So ergibt sich für alle Klassen
eine Reihenfolge in der sie implementiert werden müssen. Auch für die Vererbungen
ist dies wichtig.
Die Objekttabelle wird dann wie folgt erzeugt:
CREATE TABLE aaa_reo OF aa_reo (
Obj_ID PRIMARY KEY,
layer_ref NOT NULL SCOPE IS aaa_layer,
geo_ref NOT NULL SCOPE IS aaa_geometry,
ObjRace_ref NOT NULL SCOPE IS aaa_object_race
)
Da dies eine Objekttabelle ist, müssen nur noch die Bedingungen festgelegt werden. In dieser Tabelle bekommen zum Beispiel die Spalten layer ref, geo ref und
ObjRace ref, die vom Datentyp REF sind, Zieltabellen zugewiesen.
Bei dieser Klasse ist es nun so, dass auch die Funktionen noch näher definiert
werden müssen. Dies geschieht nachdem alle Objekttabellen erzeugt wurden.
CREATE OR REPLACE TYPE BODY aa_reo AS
MEMBER FUNCTION hatDirektOben RETURN object_table_type IS
TYPE ObjCurTyp IS REF CURSOR;
obj_cv ObjCurTyp;
tab object_table_type;
BEGIN
OPEN obj_cv FOR
SELECT top_ID
FROM aaa_above
WHERE SELF.Obj_ID = down_ID;
FETCH obj_cv BULK COLLECT INTO tab;
CLOSE obj_cv;
RETURN tab;
END;
20
MEMBER FUNCTION hatDirektUnten RETURN object_table_type IS
TYPE ObjCurTyp IS REF CURSOR;
obj_cv ObjCurTyp;
tab object_table_type;
BEGIN
OPEN obj_cv FOR
SELECT down_ID
FROM aaa_above
WHERE SELF.Obj_ID = top_ID;
FETCH obj_cv BULK COLLECT INTO tab;
CLOSE obj_cv;
RETURN tab;
END;
END;
/
Bei einer MEMBER FUNCTION gibt es den Parameter SELF, der als das Objekt
initialisiert wird, für das die Funktion aufgerufen wurde. Mit Hilfe dieses Parameters
liefern die SELECT-Anweisungen entsprechend zu dem Objekt, zu dem die Funktion aufgerufen wurde, die Objektnummern der Objekte, die über bzw. unter diesem
Objekt liegen. Diese werden in der Variable tab gespeichert und zurückgegeben.
Die Funktionen können zum Beispiel folgendermaßen benutzt werden:
SELECT value(p).hatdirektoben()
FROM aaa_reo p
WHERE lower(obj_id)=’n01a5yf002’;
Diese Anfrage liefert OBJECT_TABLE_TYPE(’N0061KV001’) zurück.
5.2
Import der Daten
In die so erstellten Tabellen müssen nun noch die Daten aus der alten Datenbank
übertragen werden. Dabei ist besonderes Augenmerk auf die korrekte Verteilung der
Objekte, komplexen Objekte und Objektteile auf REO und ZUSO zu legen.
Bei den Tabellen aaa object race, aaa layer, aaa attribute value und
aaa attribute type hat sich die Struktur der Tabelle nicht geändert, daher können
die Daten eins zu eins übertragen werden. Ähnlich einfach ist es bei den Tabellen
aaa above und aaa geometry. Hier müssen nur die Objektteilnummern an zugehörige
Objektnummer angehängt werden.
Hier ein Beispiel:
INSERT INTO aaa_above
SELECT topno || toppartno, downno ||downpartno
FROM above;
21
Auf die restlichen Tabellen wird separat eingegangen.
5.2.1
aaa attribute
In dieser Tabelle wird beim Attributtyp der Datentyp REF verwendet. Es muß also
über die Funktion REF() der Zeiger zur Tabelle aaa attribute type erzeugt werden. Da
dies nur für jeden Eintrag einzeln geschehen kann, wird ein Cursor über die Tabelle
attribute der alten Datenbank verwendet. Die Referenz bekommt man folgendermaßen:
SELECT REF(p) INTO type_ref
FROM aaa_attribute_type p
WHERE p.AttrTypeNo = attr_record.type;
Die Attribute sind zur Zeit zu Objektnummer und Objektteilnummer gespeichert.
Also kann die neue Objektnummer auch hier einfach aus den beiden Teilen zusammengesetzt werden. Der Attributwert wird übernommen.
5.2.2
aaa object name
Bei den Objektnamen ist es so, dass im alten Schema jedem Objekt mehrere Objektnamen zugeordnet sein können. Diese Objekte können in drei Kategorien eingeteilt
werden, die in der neuen Tabelle separat zu betrachten sind.
• Objekte, die komplexe Objekte waren:
Diese Objekte werden zu ZUSOs und die Objektnummer bekommt daher ’000’
angehängt.
• Objekte, die noch einmal aus Objektteilen bestanden:
Auch diese Objekte werden zu ZUSO und bekommen ’000’ an die Objektnummer
angehängt. Die REOs, die aus den Objektteilen hervorgehen, bekommen als
Objektnamen den des ZUSO zugewiesen, an dem sie beteiligt sind.
• Objekte, die nicht aus Objektteilen bestanden, aber auch nicht komplexes Objekt waren:
Die Objektnummern dieser Objekte enden auf ’001’ und sind jetzt REOs. Beim
Übertragen der Daten ist es besonders schwer, diese Objekte zu identifizieren, da
in der Tabelle object name keine Unterscheidung in Objektteile getroffen wurde. So ist nur schwer herauszufinden, welche Objekte nicht mehr in Objektteile
unterteilt sind.
Um die Probleme beim Identifizieren der Objekte zu umgehen, werden zunächst
die Tabellen aaa REO und aaa ZUSO vervollständigt. Danach kann für die Unterscheidung auf diese beiden Tabellen zurückgegriffen werden. Dies hat aber
zur Folge, dass wiederum die Referenzen, die in den beiden Tabellen auf die Tabelle mit den Objektnamen genommen werden, erst nachträglich erstellt werden
können.
22
Damit ergeben sich zwei Cursor, die durchlaufen werden müssen:
--alle, die jetzt ein ZUSO sind
CURSOR name_zuso_cursor IS
SELECT n.objectno || ’000’ id,n.type,p.*
FROM object_name n, TABLE(n.geometries) p,aaa_zuso z
WHERE n.objectno || ’000’=z.Obj_ID;
--alle, die jetzt kein zuso, also nur einmal im reo vorkommen
CURSOR name_reo_cursor IS
SELECT n.objectno || ’001’ id,n.type,p.*
FROM object_name n, TABLE(n.geometries) p,
(SELECT distinct substr(obj_id,1,7) id
FROM aaa_reo
MINUS
SELECT substr(obj_id,1,7) from aaa_reo
WHERE substr(obj_id,8,10)=’002’) r
WHERE n.objectno=r.id ;
Die geschachtelte Tabelle innerhalb der Ursprungstabelle wird innerhalb der Cursor aufgelöst. Um die Einträge zu selektieren, die in die letzte der oben genannten
Kategorie fallen, werden zunächst die alten Objektnummern (die ersten sieben Stellen) ausgewählt. Von diesen werden dann alle abgezogen, die auch auf ’002’ enden.
Dies sind alle, wo das alte Objekt mehrere Teilobjekte hatte.
Um die laufende Nummer zu erzeugen, wird in einer Variablen jeweils die im
letzten Durchlauf aktuelle Objektnummer gespeichert. Im nächsten Durchlauf wird die
Objektnummer mit dieser Variablen verglichen und entsprechend ein Zähler verändert.
Die Spalten signaturnummer, darstellungsprioritaetsLine und darstellungsprioritaetsFlaeche bleiben leer, da für sie keine Daten in der alten Datenbank vorhanden
sind. Die Spalten fontSperrung, skalierung, horizontaleAusrichtung und vertikaleAusrichtung werden auf die im Referenzmodell forgesehenen Standardwerte gesetzt. Diese
sind:
• fontSperrung=0
• skalierung=1
• horizontaleAusrichtung=’linksbuendig’
• vertikaleAusrichtung=’Basis’
Die restlichen Spalten können von der Ausgangstabelle übernommen werden.
23
5.2.3
aaa REO
Die REOs sind diejenigen Objekte des alten Schemas, die eine Geometrie haben. Daher
können die neuen Objekte einfach aus der Tabelle object in Kombination mit der Tabelle object geometry erzeugt werden, da die Zuordnung in der Tabelle object geometry
bereits zu den Objektteilen erfolgt.
Auch hier müssen die Referenzen vor dem Einfügen erzeugt werden. In den Spalten, wo geschachtelte Tabellen zum Einsatz kommen, wird zunächst eine leere Tabelle eingefügt. Diese Tabellen werden später gemeinsam gefüllt, nachdem die Tabelle
aaa object name vervollständigt wurde.
Die Spalten anlass, zeigtAufExternes und modellartenZugehoerigleit bleiben auf
Grund fehlender Daten leer.
Das Einfügen in die geschachtelten Tabellen geschieht mit einem Cursor Zeile für
Zeile. Die Einfügeoperation sieht dabei folgendermaßen aus:
INSERT INTO TABLE(SELECT attr_ref
FROM aaa_reo
WHERE Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_attribute p
WHERE p.Obj_ID=update_rec.Obj_ID);
Entsprechend für die geschachtelte Tabelle mit den Verweisen zu den Namen.
5.2.4
aaa ZUSO
Die ZUSOs sind die Objekte, die entweder vorher aus Objektteilen bestanden haben
oder ein komplexes Objekt waren. Diese werden mit Hilfe von zwei unterschiedlichen
Originaltabellen selektiert. Daher sind hier zwei Cursor für das Übertragen der Daten
notwendig. Alle in diese Tabelle aufgenommenen Objektnummern bekommen ’000’
hinten angehängt.
Die Cursor sehen wie folgt aus:
• CURSOR zuso_cursor IS
SELECT o.*
FROM object o, object_geometry g
WHERE o.objno=g.objectno and g.objectpartno=’002’;
Hier werden alle Objekte ausgewählt, die mehr als eine Objetteilnummer besitzen. Diese gehören nun zu den ZUSOs, bestehen in ihrer Zusammensetzung
aber nur aus REOs.
24
• CURSOR zuso_complex_cursor IS
SELECT distinct o.*
FROM object o, complex_object c
WHERE o.objno=c.bigno;
Hier werden alle Objekte ausgewählt, die in der Tabelle complex onbject als
Oberobjekt ausgewiesen sind. Diese Objekte können jetzt aus REOs und ZUSOs
zusammengesetzt sein.
In dieser Tabelle bleiben ebenfalls die Spalten anlass, zeigtAufExternes und modellartenZugehoerigleit leer. Wie bei der Tabelle REO werden zunächst die geschachtelten
Tabellen leer initialisiert und nach der Bearbeitung der Tabelle aaa object name noch
einem Update unterzogen.
Das Update der beiden Spalten name ref und attr ref werden wie bei der Tabelle
aaa REO durchgeführt. Das Update der Spalte combined of ist um einiges schwieriger.
Dies liegt an den unterschiedlichen Möglichkeiten der Zusammensetzung der ZUSOs.
• Wenn das ZUSO früher ein Objekt mit Objektteilen war, ist es jetzt nur aus
Einträgen in der Tabelle aaa REO zusammengesetzt. Diese können einfach über
die alte Objektnummer, also sie ersten sieben Zeichen, ausgewählt werden.
INSERT INTO TABLE(select combined_of
from aaa_zuso
where Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_reo p
WHERE substr(Obj_ID,1,7)=substr(update_rec.Obj_ID,1,7));
• Wenn das ZUSO aus einem früheren komplexen Objekt entstanden ist, besteht
es nun aus ZUSOs, die früher Objekte mit mehreren Teilobjekten waren, sowie
aus REOs, die früher Objekte ohne Teilobjekte waren.Es sind also Referenzen
zu zwei unterschiedlichen Tabellen, also werden zwei INSERT-Operationen benötigt. Die Verknüpfung geschieht hier über die alte Tabelle complex object, in
der ja gerade die alten Teilobjekte enthalten sind.
INSERT INTO TABLE(select combined_of
from aaa_zuso
where Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_zuso p,complex_object c
WHERE substr(p.Obj_ID,1,7)=c.smallno
AND c.bigno=substr(update_rec.Obj_ID,1,7));
25
INSERT INTO TABLE(select combined_of
from aaa_zuso
where Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_reo p, complex_object c
WHERE substr(p.Obj_ID,1,7)=c.smallno
AND c.bigno=substr(update_rec.Obj_ID,1,7));
26
Anhang A
PL/SQL-Code zur Erzeugung des
Datenbank-Schemas
--------Erzeugen der Objekttypen--------------CREATE TYPE race AS OBJECT (
ObjectRaceNo VARCHAR2(4),
Name VARCHAR2(100));
/
CREATE TYPE aa_layer AS OBJECT (
LayerNo VARCHAR2(3),
Name VARCHAR2(100));
/
CREATE TYPE above_obj AS OBJECT (
top_ID VARCHAR2(10),
down_ID VARCHAR2(10));
/
CREATE TYPE attr_type_type AS OBJECT (
AttrTypeNo VARCHAR2(4),
Name VARCHAR2(100));
/
CREATE TYPE attr_value_type AS OBJECT (
Type VARCHAR2(4),
Value VARCHAR2(7),
Name VARCHAR2(100));
/
27
CREATE TYPE attr AS OBJECT (
Obj_ID VARCHAR2(10),
Type REF attr_type_type,
Value VARCHAR2(7));
/
CREATE TYPE ap_gpo AS OBJECT (
Obj_ID VARCHAR2(10),
signaturnummer VARCHAR2(100),
darstellungsprioritaetsLinie NUMBER,
darstellungsprioritaetsFlaeche NUMBER
) NOT FINAL;
/
CREATE TYPE praesentationsobjekt UNDER ap_gpo (
TypeNo VARCHAR2(2),
schriftinhalt VARCHAR2(31),
fontSperrung NUMBER,
skalierung NUMBER,
horizontaleAusrichtung VARCHAR2(13),
vertikaleAusrichtung VARCHAR2(5),
geometry mdsys.sdo_geometry,
name_count NUMBER);
/
CREATE TYPE aa_lebenszeitintervall AS OBJECT (
beginnt DATE,
endet DATE);
/
CREATE TYPE ref_praes AS OBJECT (
ref REF praesentationsobjekt);
/
CREATE TYPE ref_attr AS OBJECT (
ref REF attr);
/
CREATE TYPE name_ref_table_type AS TABLE OF ref_praes;
/
28
CREATE TYPE attr_ref_table_type AS TABLE OF ref_attr;
/
CREATE TYPE aa_object AS OBJECT (
Obj_ID VARCHAR2(10),
lebenszeitintervall aa_lebenszeitintervall,
anlass VARCHAR2(50),
zeigtAufExternes VARCHAR2(50),
ObjRace_ref REF race,
CoordinateX NUMBER(9),
CoordinateY NUMBER(9),
modType VARCHAR2(2),
layer_ref REF aa_layer,
name_ref name_ref_table_type,
attr_ref attr_ref_table_type
) NOT FINAL;
/
CREATE TYPE geom AS OBJECT (
Obj_ID VARCHAR2(10),
geometry mdsys.sdo_geometry);
/
CREATE TYPE combined_of_table_type AS TABLE OF REF aa_object;
/
CREATE TYPE object_table_type AS TABLE OF VARCHAR2(10);
/
CREATE TYPE aa_reo UNDER aa_object (
modellartenZugehoerigkeit VARCHAR2(7),
geo_ref REF geom,
MEMBER FUNCTION hatDirektOben RETURN object_table_type,
MEMBER FUNCTION hatDirektUnten RETURN object_table_type);
/
CREATE TYPE aa_zuso UNDER aa_object (
modellartenZugehoerigkeit VARCHAR2(7),
combined_of combined_of_table_type);
/
29
--------Erzeugen der Tabellen---------------------CREATE TABLE aaa_layer OF aa_layer(
LayerNo NOT NULL constraint pk_layer_obj PRIMARY KEY
);
CREATE TABLE aaa_object_race OF race(
ObjectRaceNo PRIMARY KEY
);
CREATE TABLE aaa_geometry OF geom(
Obj_ID PRIMARY KEY,
geometry NOT NULL
);
CREATE TABLE aaa_above OF above_obj (
constraint pk_above PRIMARY KEY (top_ID,down_ID)
);
CREATE TABLE aaa_attribute_type OF attr_type_type(
AttrTypeNo NOT NULL constraint pk_attr_type PRIMARY KEY
);
CREATE TABLE aaa_attribute_value OF attr_value_type(
Type NOT NULL,
Value NOT NULL,
constraint pk_attr_value PRIMARY KEY (Type, Value)
);
CREATE TABLE aaa_attribute OF attr(
Obj_ID NOT NULL,
type NOT NULL SCOPE IS aaa_attribute_type,
value NOT NULL,
constraint pk_attr PRIMARY KEY (Obj_ID,type,value)
);
30
CREATE TABLE aaa_object_name OF praesentationsobjekt(
Obj_ID NOT NULL,
TypeNo NOT NULL,
schriftinhalt NOT NULL,
name_count NOT NULL,
constraint pk_obj_name PRIMARY KEY (Obj_ID, name_count)
);
CREATE TABLE aaa_reo OF aa_reo (
Obj_ID PRIMARY KEY,
layer_ref NOT NULL SCOPE IS aaa_layer,
geo_ref NOT NULL SCOPE IS aaa_geometry,
ObjRace_ref NOT NULL SCOPE IS aaa_object_race
)
NESTED TABLE name_ref STORE AS name_ref_reo_table,
NESTED TABLE attr_ref STORE AS attr_ref_reo_table;
CREATE TABLE aaa_zuso OF aa_zuso (
Obj_ID PRIMARY KEY,
layer_ref NOT NULL SCOPE IS aaa_layer,
ObjRace_ref NOT NULL SCOPE IS aaa_object_race
)
NESTED TABLE combined_of STORE AS combined_of_table,
NESTED TABLE name_ref STORE AS name_ref_zuso_table,
NESTED TABLE attr_ref STORE AS attr_ref_zuso_table;
ALTER TABLE name_ref_reo_table
ADD (SCOPE FOR (ref) IS aaa_object_name);
ALTER TABLE name_ref_zuso_table
ADD (SCOPE FOR (ref) IS aaa_object_name);
ALTER TABLE attr_ref_reo_table
ADD (SCOPE FOR (ref) IS aaa_attribute);
ALTER TABLE attr_ref_zuso_table
ADD (SCOPE FOR (ref) IS aaa_attribute);
31
CREATE OR REPLACE TYPE BODY aa_reo AS
MEMBER FUNCTION hatDirektOben RETURN object_table_type IS
TYPE ObjRecTyp IS RECORD (obj_ID VARCHAR2(10));
TYPE ObjCurTyp IS REF CURSOR RETURN ObjRecTyp;
obj_cv ObjCurTyp;
tab object_table_type;
BEGIN
OPEN obj_cv FOR
SELECT top_ID
FROM aaa_above
WHERE SELF.Obj_ID = down_ID;
FETCH obj_cv BULK COLLECT INTO tab;
RETURN tab;
END;
MEMBER FUNCTION hatDirektUnten RETURN object_table_type IS
TYPE ObjRecTyp IS RECORD (obj_ID VARCHAR2(10));
TYPE ObjCurTyp IS REF CURSOR RETURN ObjRecTyp;
obj_cv ObjCurTyp;
tab object_table_type;
BEGIN
OPEN obj_cv FOR
SELECT down_ID
FROM aaa_above
WHERE SELF.Obj_ID = top_ID;
FETCH obj_cv BULK COLLECT INTO tab;
RETURN tab;
END;
END;
/
32
Anhang B
PL/SQL-Code zum Import der
Daten
Zunächst der Code für die Tabellen, die fast eins zu eins übernommen werden:
INSERT INTO aaa_object_race SELECT * FROM object_race;
INSERT INTO aaa_attribute_value SELECT * FROM attribute_value;
INSERT INTO aaa_attribute_type SELECT * FROM attribute_type;
INSERT INTO aaa_layer SELECT * FROM layer;
INSERT INTO aaa_above
SELECT topno || toppartno, downno ||downpartno
FROM above;
INSERT INTO aaa_geometry
SELECT ObjectNo || ObjectPartNo, ObjectGeometry
FROM object_geometry;
B.1
aaa attribute
DECLARE
CURSOR attr_cursor IS
SELECT *
FROM attribute;
type_ref REF attr_type_type;
BEGIN
FOR attr_record IN attr_cursor LOOP
SELECT REF(p) INTO type_ref
33
FROM aaa_attribute_type p
WHERE p.AttrTypeNo = attr_record.type;
INSERT INTO aaa_attribute VALUES (
attr_record.objectno || attr_record.ObjectPartNo,
type_ref,
attr_record.value);
END LOOP;
END;
/
B.2
aaa REO
DECLARE
CURSOR reo_cursor IS
SELECT *
FROM object o,object_geometry g
WHERE o.objno = g.objectno;
layer_ref REF aa_layer;
geo_ref REF geom;
race_ref REF race;
BEGIN
FOR reo_record IN reo_cursor LOOP
--Referenz zur Layer-Tabelle-SELECT REF(p) INTO layer_ref
FROM aaa_layer p
WHERE p.layerno = reo_record.layerno;
--Referenz zur object_race Tabelle-SELECT REF(p) INTO race_ref
FROM aaa_object_race p
WHERE p.ObjectRaceNo = reo_record.ObjectRaceNo;
--Referenz zur Geometrietabelle-SELECT REF(p) INTO geo_ref
FROM aaa_geometry p
WHERE p.obj_ID = reo_record.objno || reo_record.objectpartno;
INSERT INTO aaa_reo VALUES(
reo_record.objno || reo_record.objectpartno,
aa_lebenszeitintervall(reo_record.builddate,NULL),
NULL,
NULL,
race_ref,
reo_record.coordinatex,
reo_record.coordinatey,
34
reo_record.modtype,
layer_ref,
name_ref_table_type(),
attr_ref_table_type(),
NULL,
geo_ref
);
END LOOP;
END;
/
B.3
aaa ZUSO
DECLARE
--Objekte die aus früheren Objektteilen bestehen
CURSOR zuso_cursor IS
SELECT o.*
FROM object o, object_geometry g
WHERE o.objno=g.objectno and g.objectpartno=’002’;
--Objekte die schon vorher zusammengesetzte Objekte waren
CURSOR zuso_complex_cursor IS
SELECT distinct o.*
FROM object o, complex_object c
WHERE o.objno=c.bigno;
layer_ref REF aa_layer;
race_ref REF race;
combined_zuso_ref REF aa_zuso;
combined_reo_ref REF aa_object;
BEGIN
FOR zuso_record IN zuso_cursor LOOP
--Referenz zur Layer-Tabelle-SELECT REF(p) INTO layer_ref
FROM aaa_layer p
WHERE p.layerno = zuso_record.layerno;
--Referenz zur object_race Tabelle-SELECT REF(p) INTO race_ref
FROM aaa_object_race p
WHERE p.ObjectRaceNo = zuso_record.ObjectRaceNo;
INSERT INTO aaa_zuso VALUES(
zuso_record.objno || ’000’,
aa_lebenszeitintervall(zuso_record.builddate,NULL),
NULL,
35
NULL,
race_ref,
zuso_record.coordinatex,
zuso_record.coordinatey,
zuso_record.modtype,
layer_ref,
name_ref_table_type(),
attr_ref_table_type(),
NULL,
combined_of_table_type()
);
END LOOP;
FOR zuso_complex_record IN zuso_complex_cursor LOOP
--Referenz zur Layer-Tabelle-SELECT REF(p) INTO layer_ref
FROM aaa_layer p
WHERE p.layerno = zuso_complex_record.layerno;
--Referenz zur object_race Tabelle-SELECT REF(p) INTO race_ref
FROM aaa_object_race p
WHERE p.ObjectRaceNo = zuso_complex_record.ObjectRaceNo;
INSERT INTO aaa_zuso VALUES(
zuso_complex_record.objno || ’000’,
aa_lebenszeitintervall(zuso_complex_record.builddate,NULL),
NULL,
NULL,
race_ref,
zuso_complex_record.coordinatex,
zuso_complex_record.coordinatey,
zuso_complex_record.modtype,
layer_ref,
name_ref_table_type(),
attr_ref_table_type(),
NULL,
combined_of_table_type()
);
END LOOP;
END;
/
36
B.4
aaa object name
DECLARE
--alle, die jetzt ein zuso sind
CURSOR name_zuso_cursor IS
SELECT n.objectno || ’000’ id,n.type,p.*
FROM object_name n, TABLE(n.geometries) p,aaa_zuso z
WHERE n.objectno || ’000’=z.Obj_ID;
--alle, die jetzt kein zuso, also nur einmal im reo vorkommen
CURSOR name_reo_cursor IS
SELECT n.objectno || ’001’ id,n.type,p.*
FROM object_name n, TABLE(n.geometries) p,
(SELECT distinct substr(obj_id,1,7) id
FROM aaa_reo
MINUS
SELECT substr(obj_id,1,7) from aaa_reo
WHERE substr(obj_id,8,10)=’002’) r
WHERE n.objectno=r.id ;
objno VARCHAR2(10);
objno_alt VARCHAR2(10) :=’’;
x NUMBER:=1;
ind NUMBER :=1;
i NUMBER :=1;
BEGIN
FOR name_zuso_record IN name_zuso_cursor LOOP
IF objno_alt = name_zuso_record.id
THEN ind:=ind+1;
ELSE objno_alt:=name_zuso_record.id;
ind:=1;
END IF;
INSERT INTO aaa_object_name VALUES (
name_zuso_record.id,
NULL,
NULL,
NULL,
name_zuso_record.Type,
name_zuso_record.name,
0,
1,
’linksbuendig’,
’basis’,
name_zuso_record.geo,
ind
37
);
END LOOP;
FOR name_reo_record IN name_reo_cursor LOOP
IF objno_alt = name_reo_record.id
THEN ind:=ind+1;
ELSE objno_alt:=name_reo_record.id;
ind:=1;
END IF;
INSERT INTO aaa_object_name VALUES (
name_reo_record.id,
NULL,
NULL,
NULL,
name_reo_record.Type,
name_reo_record.name,
0,
1,
’linksbuendig’,
’basis’,
name_reo_record.geo,
ind
);
END LOOP;
END;
/
B.5
Update aaa REO
DECLARE
CURSOR update_cursor IS
SELECT Obj_ID
FROM aaa_reo;
BEGIN
FOR update_rec IN update_cursor LOOP
INSERT INTO TABLE(SELECT attr_ref
FROM aaa_reo
WHERE Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_attribute p
WHERE p.Obj_ID=update_rec.Obj_ID);
INSERT INTO TABLE(SELECT name_ref
FROM aaa_reo
38
WHERE Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_object_name p
--sollte ein reo kein eigenes Präsentationsobjekt
--zugewiesen haben, so wird es dem des zugehörigen zuso
--zugeordnet, zu welchem es dann auch gehört.
WHERE substr(Obj_ID,1,7)=substr(update_rec.Obj_ID,1,7));
END LOOP;
END;
/
B.6
Update aaa ZUSO
DECLARE
CURSOR update_cursor IS
SELECT Obj_ID
FROM aaa_zuso;
BEGIN
FOR update_rec IN update_cursor LOOP
INSERT INTO TABLE(SELECT attr_ref
FROM aaa_zuso
WHERE Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_attribute p
WHERE p.Obj_ID=update_rec.Obj_ID);
INSERT INTO TABLE(SELECT name_ref
FROM aaa_zuso
WHERE Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_object_name p
WHERE p.Obj_ID=update_rec.Obj_ID);
INSERT INTO TABLE(select combined_of
from aaa_zuso
where Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_reo p
WHERE substr(Obj_ID,1,7)=substr(update_rec.Obj_ID,1,7));
INSERT INTO TABLE(select combined_of
from aaa_zuso
where Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_zuso p,complex_object c
39
WHERE substr(p.Obj_ID,1,7)=c.smallno
AND c.bigno=substr(update_rec.Obj_ID,1,7));
INSERT INTO TABLE(select combined_of
from aaa_zuso
where Obj_ID=update_rec.Obj_ID)
(SELECT REF(p)
FROM aaa_reo p, complex_object c
WHERE substr(p.Obj_ID,1,7)=c.smallno
AND c.bigno=substr(update_rec.Obj_ID,1,7));
END LOOP;
END;
/
40
Literaturverzeichnis
[dV02]
A. der Vermessungsverwaltungen. Dokumentation zur Modellierung der
Geoinformationen des amtlichen Vermessungswesens (GeoInfoDok) Version
1.0. 2002.
[Fal00]
S. Falke: Entwurf und Implementierung einer räumlichen Datenbank für
ATKIS-Daten mit Datenimport. Studienarbeit, Institut für Informatik, Universität Hannover, 2000.
[Gie01]
B. Gietz. Oracle9i Application Developer’s Guide - Object-Relational Features. Oracle Corporation, 2001.
[KFL00] C. Kleiner, S. Falke, U. W. Lipeck: Verwaltung geographischer Basisdaten
durch objekt-relationale Datenbanken am Beispiel von ATKIS und Oracle
8i. Informatik-Berichte DB-02/2000, Institut für Informatik, Universität
Hannover, 2000.
[PR01]
T. Portfolio, J. Russell. PL/SQL User’s Guide and Reference. Oracle Corporation, 2001.
[Rus01] J. Russell. Oracle9i Application Developer’s Guide - Fundamentals. Oracle
Corporation, 2001.
[Wat01] S. Watt. SQL*Plus User’s Guide and Reference. Oracle Corporation, 2001.
41
Herunterladen