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 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', 'Tertiaer', '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 coreSampleHasAges: 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