Quellcode (USE-Modell; die SOIL-Testumgebung folgt demnächst...):
-----------------------------------------------------------------------------
-- UML/OCL-Modellierung für das Projekt "Web3dScans"
-- Lehrveranstaltung "Datenmodellierung für raumbezogene Fachanwendungen"
-- des Masterstudiengangs Geoinformatik der Hochschule Bochum im SoSe 2022
-- Ursprünglich angelegt von: Sofia Segers
-- Weiterentwickelt im GI-Projekt des WiSe 2022/23
model Web3dScans
-----------------------------------------------------------------------------
-- Wesentliche Anwendungsobjekte sind:
-- Betrachtungsobjekt (das kann zunächst ein Handstück, Bohrkern oder Fossil
-- sein), der zugehörige 3D-Scan und der zugehörige Steckbrief sowie ein
-- Objekt mit punktförmiger Geometrie und einem thematischen Attribut, das
-- eine ID zur Verknüpfung der Geometrie mit den anderen genannten zentralen
-- Anwendungsobjekten enthält.
class Betrachtungsobjekt -- Impl.: ExaminationObject
attributes
id : Integer
-- Reale Objektgröße gegeben in Millimetern (Länge, Breite, Höhe):
groesseX : Integer
groesseY : Integer
groesseZ : Integer -- Impl.: sizeX, sizeY, sizeZ
end
-- Spezielle Typen von Betrachtungsobjekten:
class Handstueck < Betrachtungsobjekt end -- Impl.: HandSample
class Bohrkern < Betrachtungsobjekt end -- Impl.: CoreSample
class Fossil < Handstueck end -- Impl.: Fossil
class SteinModel3d -- Impl.: RockModel3d
attributes
uri : String
end
class Steckbrief -- Impl.: Profile
attributes
uri : String
end
class PktObjekt -- Impl.: PointObject
attributes
id: Integer -- im Shape des HLNUG das Attribut PROBE
xKoord: Real
yKoord: Real
zKoord: Real -- Impl.: sizeX, sizeY, sizeZ
crs: String
end
association Betrachtungsobjekt_PktObjekt between
Betrachtungsobjekt[1] role bobj
PktObjekt[0..1] role lokation
end
association Betrachtungsobjekt_Steckbrief between
Betrachtungsobjekt[1] role bobj
Steckbrief[0..1] role steckbrief
end
association Betrachtungsobjekt_Scan3dModel between
Betrachtungsobjekt[1] role bobj
SteinModel3d[0..*] role smodell
end
-----------------------------------------------------------------------------
-- Einige grundlegende fachliche Konzepte und Constraints der Anwendung:
constraints
-- Alle Betrachtungsobjekte und Punktobjekte haben eine eindeutige ID:
context Betrachtungsobjekt
inv uniqueID:
Betrachtungsobjekt.allInstances -> isUnique(id)
context PktObjekt
inv uniqueID:
PktObjekt.allInstances -> isUnique(id)
context Handstueck
-- Als Handstück wird in der Geologie eine Gesteinsprobe und in der Minera-
-- logie eine Mineralstufe in "Handgröße" bezeichnet, was etwa einer Größe
-- zwischen 8,5 cm × 11,5 cm und 10 cm × 15 cm entspricht.
inv groesseHandstueck:
self.groesseX > 85 and self.groesseX < 100 and
self.groesseY > 115 and self.groesseY < 150
class Erdzeitalter < Tag -- Impl.: GeologicalAge
attributes
name: String
end
association Steckbrief_Zeitalter between
Steckbrief[1] role steckbrief
Erdzeitalter[1..*] role zeitalter
end
constraints
context Erdzeitalter
-- Erzeitalter kann nur einen der in der nachstehenden (unvollständigen)
-- Liste angegebenen Werte enthalten:
inv gueltigesZeitalter:
Set{
'Praekambrium', 'Kambrium', 'Ordovizium', 'Silur', 'Devon', 'Karbon',
'Perm', 'Trias', 'Jura', 'Tertiaer', 'Quartaer'}
->includes(name)
-- Jedes Handstück bezieht sich auf ein Erdzeitalter:
context Handstueck
inv gesetztesHandstueckAlter:
self.steckbrief.zeitalter->size() = 1
-- Bohrkerne können mehr als ein Erdzeitalter abdecken:
context Bohrkern
inv gesetzteBohrkernAlter:
let ages = self.steckbrief.zeitalter in
ages->size() >= 1
-----------------------------------------------------------------------------
-- Einbindung des Punkt-Layers in die Kartenkomponente:
class PktObjektLayer -- Impl.: PointObjectLayer
end
association PktObjekt_PktObjektLayer between
PktObjekt[0..*] role punkt
PktObjektLayer[1] role layer
end
-- Der Punkt-Layer wird über einen geeigneten Dienst in die interaktive Karte
-- der Anwendung eingebunden, z. B. über einen OGC-WMS mit GetFeatureInfo-
-- Operation oder einen OGC-WFS.
class Geodienst -- Impl.: GeoWebService
end
class WMS < Geodienst end
class WFS < Geodienst end
association PktObjektLayer_Geodienst between
PktObjektLayer[1] role layer
Geodienst[1] role layer
end
class Karte -- Impl.: Map
end
association Karte_Geodienst between
Karte[1] role map
Geodienst[1] role service
end
-----------------------------------------------------------------------------
-- Steckbrief-Konzept:
class Tag
attributes
name: String
end
class TagVerzeichnis -- Impl.: TagDirectory
end
-- Klasse DI-Paar beinhaltet die Tag/Inhalts-Paare (Key-Value-Paare), die im
-- Steckbrief enthalten sein können.
class TIPaar -- Impl.: TIPair
attributes
tag: Tag
inhalt: String -- Impl.: content
end
association Steckbrief_TIPaar between
Steckbrief[1] role steckbrief
TIPaar[1..*] role inhalt
end
association Tag_TagVerzeichnis between
Tag[0..*]
TagVerzeichnis[1] role register
end
-----------------------------------------------------------------------------
-- Weitere spezielle Constraints:
constraints
context PktObjekt
-- x- und y-Koordinate müssen gesetzt sein:
inv gesetzteXYKoordinaten:
self.xKoord.oclIsUndefined() = false and
self.yKoord.oclIsUndefined() = false
-- Falls z gesetzt ist, muss der Wert unterhalb der Geländeoberfläche
-- liegen (Ausnahmen?):
inv ZKoordUnterGrund:
self.zKoord.oclIsUndefined() = true or
self.zKoord < 0 -- wäre noch zu prüfen/vereinbaren... -> ToDo
context Betrachtungsobjekt
inv definierteObjektGroesse:
--Koordinatendimension == 3
-- Maße für das Betrachtungsobjekt müssen gesetzt sein
self.groesseX.oclIsUndefined() = false and
self.groesseY.oclIsUndefined() = false and
self.groesseZ.oclIsUndefined() = false
-- eof
