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