|
|
 |
|
|
\ No newline at end of file |
|
|

|
|
|
|
|
|
Quellcode (USE-Modell; die SOIL-Testumgebung folgt demnächst...):
|
|
|
|
|
|
<code>
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- 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
|
|
|
</code> |