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
-- Angelegt von: Sofia Segers
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 thmatischen Attribut, das
-- eine ID zur Verknüpfung der Geometrie mit den anderen genannten zewntralen
-- Anwendungsobjekten enthält.
class Betrachtungsobjekt
attributes
id : Integer
-- Reale Objektgröße gegeben in Millimetern (Länge, Breite, Höhe):
extentX : Integer
extentY : Integer
extentZ : Integer
end
-- Spezielle Typen von Betrachtungsobjekten:
class Handstueck < Betrachtungsobjekt end
class Bohrkern < Betrachtungsobjekt end
class Fossil < Handstueck end
class Scan3dModel
attributes
uri : String
end
class Steckbrief
attributes
uri : String
end
class PktObjekt
attributes
id: Integer -- im Shape des HLNUG das Attribut PROBE
xCoord: Real
yCoord: Real
zCoord: Real
crs: String
end
association Betrachtungsobjekt_PktObjekt between
Betrachtungsobjekt[1] role bobj
PktObjekt[0..1] role location
end
association Betrachtungsobjekt_Steckbrief between
Betrachtungsobjekt[1] role bobj
Steckbrief[0..1] role profile
end
association Betrachtungsobjekt_Scan3dModel between
Betrachtungsobjekt[1] role bobj
Scan3dModel[0..*] role scan
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 sizeHandstueck:
self.extentX > 85 and self.extentX < 100 and
self.extentY > 115 and self.extentY < 150
class Erdzeitalter
attributes
zeitalter: String
end
association Steckbrief_Zeitalter between
Steckbrief[1] role profile
Erdzeitalter[1..*] role age
end
constraints
context Erdzeitalter
-- Erzeitalter kann nur einen der in der nachstehenden (unvollständigen)
-- Liste angegebenen Werte enthalten:
inv ageNameList:
Set{
'Praekambrium', 'Kambrium', 'Ordovizium', 'Silur', 'Devon', 'Karbon',
'Perm', 'Trias', 'Jura', 'Teritaer', 'Quartaer'}
->includes(zeitalter)
-- Jedes Handstück bezieht sich auf ein Erdzeitalter:
context Handstueck
inv handSampleHasAge:
self.profile.age->size() = 1
-- Bohrkerne können mehr als ein Erdzeitalter abdecken:
context Bohrkern
inv handSampleHasAges:
let ages = self.profile.age in
ages->size() >= 1
class Geodienst
end
class WMS < Geodienst
end
class WFS < Geodienst
end
class Map
end
class Tag
end
class TagVerzeichnis
end
-- Klasse DI-Paar beinhaltet die Key-Value Paare, die im Steckbrief enthalten sein können
class DIPair
end
class KeyData < DIPair
end
class InputValue < DIPair
end
association Pkt_Geodienst between
PktObjekt[0..*]
Geodienst[1] role services
end
association Map_Geodienst between
Map[1]
Geodienst[1..*] role mapping
end
association Steckbrief_Tag between
Steckbrief[1..] role profile
Tag[0..] role tagging
end
association Tag_TagVerzeichnis between
Tag[0..*]
TagVerzeichnis[1] role tagRegister
end
association Steckbrief_DIPair between
Steckbrief[1] role profile
DIPair[1..*] role InputPairs
end
-- Weitere spezielle Constraints:
constraints
context PktObjekt
-- x- und y-Koordinate müssen gesetzt sein:
inv xyCoordsSet:
self.xCoord.oclIsUndefined() = false and
self.yCoord.oclIsUndefined() = false
-- Falls z gesetzt ist, muss der Wert unterhalb der Geländeoberfläche
-- liegen (Ausnahmen?):
inv ZCoordBelowGround:
self.zCoord.oclIsUndefined() = true or
self.zCoord < 0 -- wäre noch zu prüfen/vereinbaren... -> ToDo
context Betrachtungsobjekt
inv extentsSet:
--Koordinatendimension == 3
-- Maße für das Betrachtungsobjekt müssen gesetzt sein
self.extentX.oclIsUndefined() = false and
self.extentY.oclIsUndefined() = false and
self.extentZ.oclIsUndefined() = false
-- eof