2. Grundprinzipien
2.1. Übersicht
INTERLIS dient der Zusammenarbeit von Informationssystemen, insbesondere von geografischen Informationssystemen oder Landinformationssystemen. Wie der Name sagt, steht INTERLIS zwischen (INTER) Land-Infomations-Systemen. Zentral hierfür ist, dass alle beteiligten Systeme eine klare Vorstellung von jenen Konzepten besitzen, die für die Zusammenarbeit relevant sind.
INTERLIS umfasst aus diesem Grund eine konzeptionelle Beschreibungssprache. Mit dieser Sprache kann der Ausschnitt der Realwelt beschrieben werden, der für eine bestimmte Anwendung von Interesse ist. Eine solche Beschreibung heisst (konzeptionelles) Anwendungsmodell oder Anwendungsschema, bzw. kurz Modell oder Schema. Mit wenigen Konzepten mit genau definierter Bedeutung werden Klassen von Objekten mit ihren Eigenschaften und ihren Beziehungen beschrieben (modelliert). Zudem erlaubt die Beschreibungssprache von INTERLIS, Klassen von abgeleiteten Objekten einzuführen, die als Sichten auf andere Klassen von Objekten definiert werden. Sowohl echte als auch abgeleitete Klassen von Objekten können als Grundlage von Darstellungsbeschreibungen dienen, wobei INTERLIS eine strikte Trennung von Darstellungsbeschreibung und Beschreibung der zu Grunde liegenden Datenstruktur (Objektmodell) sicherstellt.
INTERLIS ist nicht auf eine bestimmte Anwendung ausgerichtet. Beim Entwurf, der sich an allgemeinen objekt-orientierten Prinzipien orientiert, wurde jedoch darauf geachtet, dass jene Konzepte besonders gut unterstützt werden, die für geografische Informationssysteme wichtig sind. So sind Koordinaten, Linien und Flächen als Datentypen Grundkonstrukte von INTERLIS, und es stehen Sprachelemente zur Beschreibung von Messgenauigkeiten und Einheiten zur Verfügung. Dennoch können durchaus auch nicht-geografische Anwendungen mit INTERLIS bearbeitet werden.
Aspekte, die für ein Anwendungsgebiet grundlegend sind, können in einem Basismodell beschrieben werden. Dieses Basismodell wird anschliessend z.B. gemäss den spezifischen Bedürfnissen eines Landes, in weiteren Stufen gemäss denen einer bestimmten Gegend (wie Kanton, Region oder Gemeinde) spezialisiert (siehe Abbildung 2). INTERLIS 2 bietet als Mittel zur Spezialisierung die objekt-orientierten Konzepte der Vererbung und des Polymorphismus an. So ist sichergestellt, dass bereits erfolgte Definitionen nicht wiederholt werden müssen oder gar irrtümlicherweise in Frage gestellt werden können.
Das Hauptziel von INTERLIS ist die Interoperabilität von Daten. Daten, die in einem System gemäss einem konkreten INTERLIS-Modell erfasst wurden, sollen ohne Probleme in ein anderes System transferiert werden können. Da INTERLIS nicht unnötig in die Systeme hinein regeln will, können numerische Daten (inkl. Koordinaten und Linien) in Systemen, in den Transferdaten und in den Prüfprogrammen durchaus unterschiedlich gerundet sein. Damit dies nicht zu Problemen führt, wird der Rundungsproblematik speziell Rechnung getragen (vgl. Kapitel 2.8, “Umgang mit Rundung von numerischen Werten und Koordinaten”).
Grössere Anwendungen müssen nicht in einer einzigen Beschreibung definiert werden. Sie können vielmehr in mehrere Beschreibungseinheiten (Modelle, Schemas) aufgeteilt werden. Eine Beschreibungseinheit kann mehrere Themen umfassen. Im Interesse der Lesbarkeit der Modelle ist es auch möglich, Modelle als reine Übersetzungen von anderen Modellen zu definieren.
2.2. Nutzung von Modellen
Ein INTERLIS-Modell (bzw. INTERLIS-Schema) ist primär eine Verständigungshilfe für Anwender. Die Sprache ist so gestaltet, dass ein Modell leicht von Menschen gelesen werden kann. Dennoch sind INTERLIS-Modelle präzis, eindeutig und ohne Missverständnisse interpretierbar. Die textuelle INTERLIS-Sprache bietet sich daher geradezu an als notwendige Ergänzung der grafischen Beschreibungssprache Unified Modeling Language (UML, www.omg.org/uml).
INTERLIS geht aber noch einen Schritt weiter: Da ein Modell eine formal klar definierte Bedeutung besitzt, ist die Implementation eines Dienstes in einem Computersystem automatisch aus diesem (konzeptionellen) Modell ableitbar. Beispielsweise umfasst INTERLIS einen XML-basierten Transfer-Dienst, dessen Definitionen regelbasiert aus den jeweiligen Modellen erzeugt werden. Die Nutzung der Datenmodellierung in enger Verbindung mit systemneutralen Schnittstellendiensten nennt man den modell-basierten oder den modell-getriebenen Ansatz (siehe «Model-Driven Architecture» von OMG, www.omg.org/mda/).
Modelle können auf gemeinsamen Basiskonzepten aufbauen. Da INTERLIS erlaubt, dies durch die Benutzung von Vererbung und Polymorphismus explizit zu beschreiben, ist jederzeit klar, welche Konzepte gemeinsam und welche jeweils spezifisch sind. Dies ist im Hinblick auf eine angestrebte semantische Interoperabilität von grosser Bedeutung. Beispielsweise kann die Transferdatei einer Gemeinde problemlos von einer übergeordneten Verwaltungseinheit (Kanton, Bund) interpretiert werden, ohne dass sich die Beteiligten dafür auf ein einziges Modell einigen müssten. Es genügt, wenn jede Stufe ihr Modell auf jenem der übergeordneten Einheit aufbaut.
Es ist denkbar und durchaus erwünscht, dass neue Dienste auf der Basis von INTERLIS entwickelt werden. Dies wird erheblich durch einen INTERLIS 2-Compiler erleichtert. Dieses Programm liest und schreibt INTERLIS-Modelle, erlaubt deren Änderung und überprüft, ob Modelle den syntaktischen und semantischen Bedingungen von INTERLIS entsprechen. Dieser Compiler kann – gemäss dem aktuellen INTERLIS-Transferdienst mit XML – unter anderem aus INTERLIS-Modellen automatisch XML-Schema-Dokumente (www.w3.org/XML/Schema) generieren. Damit können die konkreten INTERLIS-XML-Daten durch entsprechende allgemeine XML-Werkzeuge noch breiter genutzt werden. Solange die Nutzungsbedingungen nicht verletzt werden, steht dieser INTERLIS-Compiler zum Erstellen neuer Werkzeuge zur Verfügung.
2.3. Gliederung in Modelle und Thema
In einem Modell (bzw. Schema) wird eine Vorstellung der Welt beschrieben, wie sie für eine bestimmte Anwendung von Bedeutung ist. Ein Modell ist in sich abgeschlossen, darf aber Teile von anderen Modellen verwenden oder erweitern. Ein INTERLIS-Modell ist dadurch in gewisser Weise mit den Modulen oder «Packages» mancher Programmiersprachen vergleichbar.
Primär können Modelle unterschieden werden, die nur typenmässige Definitionen (Einheiten, Wertebereiche, Strukturen) enthalten und solchen, zu denen Daten existieren können. Modelle enthalten nebst ihrem Namen auch einen Herausgeber und eine Versionsangabe. Die Beschreibungen, zu denen Daten existieren können, werden in Themen gegliedert. Diese Gliederung erfolgt gemäss den Vorstellungen, in welchen Organisationseinheiten und durch wen die Daten verwaltet und gebraucht werden. Daten, die typischerweise durch unterschiedliche Stellen verwaltet oder gebraucht werden, sollen auch in verschiedenen Themen definiert werden. Themen dürfen voneinander abhängig sein. Solche Abhängigkeiten sollen sich jedoch auf das Minimum beschränken. Beziehungen zwischen Themen, deren Daten durch verschiedene Stellen verwaltet werden, sollen möglichst vermieden werden, da für die Erhaltung der Konsistenz mit speziellem Aufwand zu rechnen ist. Zyklische Abhängigkeiten sind in jedem Fall ausgeschlossen. Themen können nebst den eigentlichen Datendefinitionen auch Definitionen für Sichten und Grafiken umfassen.
Ein Thema kann ein anderes erweitern. Damit werden alle Konzepte, welche das Basisthema definiert, übernommen und können ergänzt bzw. spezialisiert werden.
Beispielsweise könnte ein Modell der Amtlichen Vermessung eines Landes unter anderem die Themen «Adressen» und «Gebäude» umfassen (siehe Abbildung 3). Diese Konzepte sind voneinander unabhängig; der Bezug wird algorithmisch über Koordinaten hergestellt. Personen weisen Adressen auf, so dass das Personen-Modell dieses Landes auf dem Landesmodell der Amtlichen Vermessung aufbaut, wobei das Thema «Personen» vom Thema «Adressen» des Vermessungsmodells abhängt.
Nun möchte man die Personen in einer Gegend A präziser beschreiben, als es das Landes-Personen-Modell vorsieht. Diese Gegend A verfasst daher ihr eigenes Modell, in dem das Thema «Personen» aus dem landesweiten Personen-Modell übernommen und erweitert wird.
In einer Gegend B will man einerseits eine explizite Beziehung zwischen Gebäuden und Adressen herstellen, andererseits wird auch hier das Landes-Personen-Modell als zu grob erachtet. Wiederum werden die jeweiligen Themen übernommen und spezialisiert. Beide Erweiterungen werden in einem einzigen Modell – der «Weltsicht» der Gegend B – zusammengefasst.
2.4. Objekt-Konzept
2.4.1. Objekte und Klassen
Ein Objekt (auch Objektinstanz oder einfach Instanz genannt) besteht aus den Daten eines Gegenstandes der realen Welt und ist eindeutig identifizierbar. Typischerweise besitzen zahlreiche Objekte gleichartige Eigenschaften und können daher zusammengefasst werden. Eine Menge von Objekten (Objektmenge) mit gleichartigen Eigenschaften wird als Klasse bezeichnet. Jeder Eigenschaft entspricht (mindestens) ein Attribut. INTERLIS 1 verwendete anstelle des Begriffs Klasse den Begriff Tabelle. Andere Begriffe für Klasse sind Entitätsmenge, Entitätstyp, Feature(typ).
Mit der Beschreibung einer Klasse wird unter anderem auch festgehalten, welche Eigenschaften oder Merkmale die einzelnen Objekte tragen. Diese werden Attribute genannt. Die Attributwerte der einzelnen Objekte sind dabei nicht beliebig, sondern müssen bestimmten Bedingungen genügen, die zur Beschreibung eines Attributes gehören.
INTERLIS bietet dafür eine Reihe von grundlegenden Datentypen an (Basis-Datentypen: Zeichenketten, numerische Datentypen, Aufzählungen, kartesische und elliptische 2D- bzw. 3D-Koordinaten, Linien, Flächen), auf deren Basis neue, komplexere Datenstrukturen definiert werden können. Um die Aussage noch zu präzisieren, können numerische Attribute mit einer Masseinheit versehen und auf ein Referenzsystem bezogen werden; Koordinaten können auf ein Koordinatensystem bezogen werden.
Datum und Zeit sind eigentlich Anwendungen von formatierten Wertebereichen. Weil Zeitangaben aber häufig vorkommen, wurde für Datum und Zeit eine eigene Struktur definiert (XMLTime, XMLDate und XMLDateTime).
Neben diesen Basis-Datentypen kann ein Attribut auch Unterstrukturen enthalten. Die einzelnen Elemente der Unterstruktur sind als Strukturelemente aufzufassen, die nur im Zusammenhang mit ihrem Hauptobjekt existieren und auch nur über dieses auffindbar sind. Der Aufbau der Strukturelemente wird ähnlich wie jener von Klassen beschrieben.
Abgesehen davon, dass alle Attributwerte ihrem jeweiligen Typ entsprechen müssen, können weitere Bedingungen formuliert werden. INTERLIS unterscheidet zwischen folgenden Arten von Konsistenzbedingungen:
-
Solchen, die sich auf ein einzelnes Objekt beziehen. Diese werden weiter untergliedert in Bedingungen, die jedes Objekt einer Klasse erfüllen muss («harte» Konsistenzbedingungen), und Bedingungen, deren Verletzung zwar an sich möglich, aber selten ist («weiche» Konsistenzbedingungen).
-
Solchen, welche die Eindeutigkeit von Attributkombinationen aller Objekte einer Klasse fordern.
-
Solchen, welche die Existenz eines Attributwertes in einer Instanz einer anderen Klasse fordern.
-
Kompliziertere Bedingungen, die sich auf Objektmengen beziehen und mittels Sichten formuliert werden.
2.4.2. Klassenerweiterung
Klassen sind entweder eigenständig oder erweitern (spezialisieren, erben) eine Basisklasse. D.h. die Beschreibung einer Klasse ist entweder unabhängig oder enthält Erweiterungen von einer anderen, ererbten Beschreibung. Eine Klassenerweiterung (auch Unterklasse oder Subklasse genannt) kann einerseits zusätzliche Attribute und Konsistenzbedingungen haben, andererseits übernommene Bedingungen (Datentypen, Konsistenzbedingungen) verschärfen.
Jedes einzelne Objekt gehört zu genau einer Klasse (man sagt auch: ist Objektinstanz oder Instanz einer Klasse). Es erfüllt aber immer auch sämtliche Bedingungen, welche die Basisklassen (d.h. die Oberklassen) stellen. Zu jeder Klasse gibt es eine Menge von Objekten, die Instanzen der Klasse oder einer ihrer Erweiterungen sind. Im Falle konkreter Klassen besteht eine normalerweise kleinere Untermenge von Instanzen, die exakt zu dieser Klasse gehören.
Die Elemente von Unterstrukturen sind keine eigentlichen selbständigen Objekte, sondern Strukturelemente und gehören damit auch nicht zur Menge der Instanzen irgendeiner Klasse.
2.4.3. Meta-Modelle und Meta-Objekte
Koordinaten- und Referenzsysteme sowie Grafiksignaturen stellen sich aus der Sicht der Anwendung als Modellelement (bzw. Schemaelement) dar, die in den Anwendungsdefinitionen verwendet werden können. Da aber verschiedene Koordinaten- und Referenzsysteme und vor allem verschiedene Grafiksignaturen auf die gleiche Art beschrieben werden können, macht es Sinn, ihre Eigenschaften ebenfalls innerhalb von Modellen mittels Klassen zu beschreiben. Jedem einzelnen System, bzw. jeder Grafiksignatur (z.B. ein Punktsymbol, eine Linienart) entspricht dann ein Objekt.
Meta-Objekte müssen in einem Meta-Modell definiert sein (s. Kapitel 3.10.1, “Allgemeine Aussagen zu Metaobjekten”). Die verwendbaren Objekte müssen explizit als Meta-Objekte gekennzeichnet sein (Erweiterungen der vordefinierten Klasse METAOBJECT) und können dann von der Anwendung über den Namen referenziert werden. Dafür ist es nötig, dass die Meta-Objekte dem Werkzeug, das die Anwendungsdefinition verarbeitet, mittels Behältern (vgl. Kapitel 2.4.5, “Behälter, Replikation und Datentransfer”) zur Verfügung stehen.
2.4.4. Beziehungen zwischen Objekten
INTERLIS 2 unterscheidet (im Gegensatz zu INTERLIS 1) zwei Arten von Beziehungen zwischen Objekten: eigentliche Beziehung und Referenzattribut.
Als eigentliche Beziehung wird eine Menge von Objektpaaren (bzw. im allgemeinen Fall von Objekt-n-Tupeln) bezeichnet. Das erste Objekt jedes Paares gehört zu einer ersten Klasse A, das zweite zu einer zweiten Klasse B. Dabei soll die Zuordnung von Objekten zu den Paaren vorgegeben sein, sie muss also nur beschrieben, d.h. modelliert werden. Wie weiter unten im Kapitel 2.5, “Sichten-Konzept” gezeigt wird, ist es im Gegensatz dazu auch möglich, Zuordnungen algorithmisch z.B. aufgrund von Attributwerten zu berechnen.
Eigentliche Beziehungen werden als eigenständige Konstrukte, so genannte Beziehungsklassen (bzw. Assoziationsklassen), beschrieben, die auch selbst wieder erweiterbar sind. INTERLIS 2 unterstützt nicht nur Zweierbeziehungen, sondern erlaubt auch mehrfache Beziehungen und solche mit eigenen Attributen. Eine Beziehungsklasse ist damit auch selbst wieder eine Objektklasse.
Wichtige Eigenschaften solcher Beziehungen sind:
-
Kardinalität – Wie viele Objekte der Klasse B (bzw. A) können einem Objekt der Klasse A (bzw. B) durch die Beziehung zugeordnet werden? D.h. wie viele Paare von Objekten kann es mit einem bestimmten Objekt an erster bzw. zweiter Stelle geben. Im allgemeinen Fall: Wie viele n-Tupel kann es mit bestimmten Objekten an n-1 Stellen geben?
-
Stärke – INTERLIS 2 unterscheidet zwischen Assoziation, Aggregation und Komposition. In allen Fällen sind die beteiligten Objekte individuell ansprechbar. Bei Assoziation und Aggregation existieren die beteiligten Objekte unabhängig voneinander. Bei Aggregation und Komposition gibt es eine Asymmetrie zwischen den beteiligten Klassen: Die Objekte der einen Klasse (der Oberklasse) werden als Ganze (bzw. als Oberobjekte)) bezeichnet, die Objekte der anderen Klasse (der Unterklasse) als Teile (bzw. als Unterobjekte). Bei Assoziation sind die Objekte gleichberechtigt und lose miteinander verbunden. Aggregation und Komposition sind konzeptionell gerichtete Beziehungen: Einem Ganzen (Oberobjekt der Oberklasse) sind mehrere Teile (Unterobjekte der Unterklasse) zugeordnet. Anders als bei der Assoziation werden im Fall der Aggregation beim Kopieren eines Ganzen auch alle zugeordneten Teile mitkopiert, während bei der Löschung des Ganzen die Teile erhalten bleiben. Für eine Komposition gilt gegenüber der Aggregation zusätzlich, dass im Falle der Löschung des Ganzen auch die Teile gelöscht werden. Wie sich Beziehungen zu anderen Objekten beim Kopieren verhalten, ist im Kapitel 3.7.2, “Stärke der Beziehung” beschrieben. Hinweis: Die Unterobjekte (Teile) von Kompositionen sind im Gegensatz zu Strukturelementen von Unterstrukturen identifizierbare Objekte.
-
Rolle – Welche Bedeutung besitzen die beteiligten Klassen aus der Sicht der Beziehung? Das wird für jede der beteiligten Klassen mit Hilfe der Rolle festgelegt.
Mit einem Referenzattribut wird der Bezug von einem Objekt bzw. einem Strukturelement zu einem anderen Objekt geschaffen. Eine solche Beziehung ist nur dem referenzierenden, nicht aber dem referenzierten Objekt bekannt. Sie ist also einseitig.
Ohne die Unabhängigkeit der Themen zu verletzen, können mittels spezieller Kennzeichnung (EXTERNAL) auch Beziehungen (d.h. eigentliche Beziehungen und Referenzattribute) definiert werden, die einen Bezug zu Objekten eines anderen Behälters des gleichen oder eines anderen Themas schaffen. Voraussetzung dazu ist allerdings, dass die Struktur, in der die Beziehung definiert wird, zu einem Thema gehört, das von demjenigen, zu dessen Klasse es verweist, abhängig ist.
Im Interesse einer klaren Ordnung können sich Beziehungen nur auf Klassen beziehen, die an der Stelle wo die Beziehungsklasse (bzw. das Referenzattribut) definiert wird, bereits bekannt sind.
2.4.5. Behälter, Replikation und Datentransfer
Als Behälter wird eine abgeschlossene Sammlung von Objekten bezeichnet, die zu einem Thema oder zu dessen Erweiterungen gehören. Abgeschlossen heisst, dass ein Behälter alle Objekte enthalten soll, die innerhalb des Themas zueinander in Beziehung stehen. Typischerweise wird ein Behälter alle Objekte einer bestimmten Gegend (z.B. einer Gemeinde, eines Kantons oder gar des ganzen Landes) enthalten. Ein Behälter kann insbesondere auch Daten verschiedener Erweiterungen (z.B. verschiedener Kantone mit eigenen Themenerweiterungen) enthalten. Dies bedingt allerdings, dass im Rahmen einer solchen Transfergemeinschaft, die Bezeichnungen der Modelle, Themen und Themenerweiterungen eindeutig sind.
Im Rahmen von Konsistenzbedingungen wird häufig von «allen» Objekten einer Klasse gesprochen. Konzeptionell meint man damit auch grundsätzlich alle Objekte, die die gewünschte Eigenschaft haben und die es überhaupt, d.h. behälterübergreifend gibt. Es ist aber aus verschiedenen Gründen (Effizienz, Verfügbarkeit, Zugriffsberechtigung, etc.) offensichtlich, dass eine Überprüfung nur innerhalb der lokal zugänglichen Behälter möglich ist. Im Falle von Behältern mit Meta-Objekten gelten die Konsistenzbedingungen ausdrücklich nur innerhalb eines Behälters, da davon ausgegangen wird, dass die Meta-Daten beschreibenden Charakter haben und deshalb jeweils vollständig (quasi als Bibliothek) in einem Behälter zur Verfügung stehen müssen.
Es werden verschiedene Arten von Behältern unterschieden:
-
Daten-Behälter – Umfasst die Instanzen von Klassen des Themas.
-
Sicht-Behälter – Umfasst die Instanzen von Sichten des Themas.
-
Behälter mit den Basis-Daten für die Grafik – Umfasst die Instanzen aller Daten oder Sichten, die für die Grafiken des Themas benötigt werden. Damit kann eine Grafik-Umsetzer-Software bedient werden.
-
Behälter mit den Grafik-Elementen – Umfasst die Instanzen aller Grafikobjekte (= Signaturen), die gemäss den Grafiken des Themas benötigt werden. Damit kann eine Grafik-Darstellungs-Software (Renderer) bedient werden (siehe Abbildung 5).
INTERLIS regelt nicht, wie die Objekte in den Systemen gehalten werden müssen. Die Regelungen betreffen nur die Schnittstelle zwischen den Systemen. Aktuell ist eine Schnittstelle zum Transfer von Behältern als XML-Dateien definiert. Dabei wird nicht nur der vollständige Transfer des ganzen Behälters, sondern auch die inkrementelle Nachlieferung unterstützt.
Beim vollständigen Transfer wird davon ausgegangen, dass der Empfänger neue, eigenständige Objektkopien aufbaut, die keinen unmittelbaren Zusammenhang zum Ursprungsobjekt aufweisen. Im Rahmen des vollständigen Transfers müssen die Objekte darum nur mit einer temporären Transferidentifikation (Transferidentifikator, abgekürzt TID) versehen werden. Diese wird zum Transferieren von Beziehungen genutzt.
Beim inkrementellen Transfer wird davon ausgegangen, dass der Sender einmal einen Initialzustand eines Datenbehälters (andere Behälterarten sind ausgeschlossen) liefert und den Empfänger anschliessend mit Nachlieferungen versorgt, die diesem erlauben, seine Daten zu aktualisieren (siehe Abbildung 4). Die Objekte werden damit repliziert und behalten den Zusammenhang zum Originalobjekt, d.h. sie können nicht unabhängig vom Original verändert werden und erhalten keine neue Identifikation.
Dabei geht man davon aus, dass zwischen den Betreibern der Primär- und der Sekundär-Datenbanken vertragliche Abmachungen getroffen werden (unter anderem Umfang, Häufigkeit der Nachlieferung), die aktuell nicht mit Instrumenten von INTERLIS beschrieben werden können. Für die eigentliche Nachlieferung stellt INTERLIS aber die nötigen Mittel zur Verfügung. Neue Objekte werden wie beim ersten Transfer mitgeteilt. Ihnen ist eine eindeutige Objektidentifikation (Objektidentifikator, abgekürzt OID) zugeordnet, die über die Zeit erhalten bleiben muss. Bei Änderungen wird auf diesen eindeutigen OID Bezug genommen und alle Attribute des Objektes (inkl. aller Strukturelemente von Strukturattributen) werden neu geliefert. Auf die gleiche Art werden auch Löschungen mitgeteilt. Dabei trägt primär der Sender die Verantwortung für die Konsistenz der Objekte (z.B. Einhaltung von Konsistenzbedingungen, Korrektheit und Kardinalität von Beziehungen). Er meldet dazu den Empfängern, welche Objekte geändert oder gelöscht und welche neu erzeugt wurden. Bei themenübergreifenden Referenzattributen wird – im Interesse der Unabhängigkeit der Themen – nicht vorausgesetzt, dass die Integrität jederzeit gewährleistet ist. Es ist Sache des Empfängers, damit zurechtzukommen, dass vorübergehend Inkonsistenzen zwischen Basisthemen und abhängigen Themen bestehen, d.h. dass ein referenziertes Objekt nicht existiert.
Der Rahmen, in dem die Eindeutigkeit des OID gewährleistet ist, ist durch INTERLIS selbst nicht bestimmt. Eine Möglichkeit, wie ein solcher OID aufgebaut sein kann, ist in Anhang F Aufbau von Objektidentifikatoren (OID) beschrieben. Andere Möglichkeiten sind aber ohne weiteres denkbar. Wichtig ist, dass der OID durch die verschiedenen Datenerfasser einer Transfergemeinschaft bei korrekter Anwendung der Regel zum Aufbau des OID immer im Rahmen der Transfergemeinschaft eindeutig ist. Je nach Aufbau des OID ist der inkrementelle Datenaustausch in einem grösseren (z.B. weltweit) oder in einem kleineren (z.B. organisationsintern) Rahmen möglich. Das gewählte Verfahren zur Bestimmung des OID definiert somit die potenzielle Transfergemeinschaft.
Ein Objekt darf nur in seinem Originalbehälter bzw. ausserhalb nur mit Erlaubnis dessen Verwalters verändert werden. Alle anderen, sekundären Behälter dürfen ein Objekt nur als Folge einer Nachlieferung verändern. INTERLIS 2 verlangt darum, dass – im Rahmen der inkrementellen Nachlieferung – nebst den Objekten auch die Behälter eindeutig und dauerhaft identifizierbar sein müssen. Die Behälter erhalten dann ebenfalls einen OID. Beim vollständigen Transfer braucht auch der Behälter nur eine Transferidentifikation (TID). Wo die Unterscheidung zum normalen OID (bzw. TID) wesentlich ist, wird vom Behälteridentifikator BOID (bzw. vom Behältertransferidentifikator BID) gesprochen.
Es muss davon ausgegangen werden, dass verschiedene Objekte zunächst in Behältern z.B. einer Gemeinde geführt werden, diese Behälter dann als Ganzes an den Kanton übermittelt und dort in Behälter, die pro Thema den ganzen Kanton enthalten, integriert werden. Allenfalls werden diese Behälter dann wieder z.B. an den Bund weitergegeben. Damit jederzeit klar ist, welches der Originalbehälter ist, wird dessen BOID bei jedem replizierten Objekt mitgegeben. Ein Empfänger kann damit eine Behälter-Verwaltung aufbauen, in dem er festhält, in welchen eigenen Behältern er replizierte Objekte von welchen Originalbehältern aufbewahrt (INTERLIS 2 bietet auch die nötigen Mittel an, dass solche Behälter mit INTERLIS selbst beschrieben und wie normale Objekte ausgetauscht werden können). Nutzt der Empfänger die Eigenschaft von INTERLIS 2, dass bei themenübergreifenden Beziehungen nicht nur die OID des Bezugsobjektes sondern auch die BOID dessen Originalbehälters transferiert wird, kann er auf effiziente Art bestimmen, in welchem seiner Behälter das Bezugsobjekt liegt.
2.5. Sichten-Konzept
Mit INTERLIS 2 können neben den eigentlichen Sachobjekten auch Sichten modelliert werden. Sichten sind im Prinzip virtuelle Klassen, deren Instanzen nicht Daten eines eigentlichen Gegenstandes der realen Welt sind, sondern rechnerisch aus anderen Objekten abgeleitet werden.
Eine Sichtdefinition besteht aus folgenden Teilen:
-
Basismengen – Von welchen Klassen bzw. Sichten fliessen die Objekte in die Berechnung der Sicht-Objekte ein? Bei Klassen werden jeweils nicht nur die eigentlichen Instanzen herangezogen, sondern auch im Sinne des Polymorphismus alle Instanzen von Erweiterungen. INTERLIS definiert nicht, welche Behälter ein System zum Errechnen einer Sicht berücksichtigen muss.
-
Verknüpfungsvorschrift – Wie werden die Basismengen verknüpft? INTERLIS 2 kennt Verbindungen (Join), Vereinigungen (Union), Zusammenfassungen (Aggregation) und Aufschlüsselungen (Inspection) von Unterstrukturen. Mengentheoretisch gesehen bilden Verbindungen das Kreuzprodukt und Vereinigungen die Vereinigungsmenge der Basismengen. Zusammenfassungen erlauben es, Objekte der Basismenge zu einem neuen Sichtobjekt zusammenzufassen, wenn sie definierbare Kriterien erfüllen. Inspektionen von Unterstrukturen ermöglichen es, die Strukturelemente einer Unterstruktur als Menge von Strukturelementen zu sehen. Verbindungen und Zusammenfassungen können auch als virtuelle Assoziationen aufgefasst werden.
-
Selektion – Welche errechneten Objekte sollen tatsächlich zur Sicht gehören? INTERLIS erlaubt es, hierfür komplexe Bedingungen anzugeben.
2.6. Grafik-Konzept
Darstellungsbeschreibungen bauen auf Klassen oder Sichten auf und deklarieren in so genannten Grafikdefinitionen (siehe Abbildung 5 und Anhang M Glossar) welche Grafiksignaturen (z.B. Punktsymbol, Linie, Flächenfüllung oder Textanschrift) den Objekten der Sicht zugeordnet werden sollen, damit ein Grafikumsetzer darstellbare Grafikobjekte erzeugen kann. Die Grafiksignaturen sind in einem eigenen Signaturenmodell definiert, wo auch die Signatur-Eigenschaften beschrieben sind.
Der Verweis auf die gefragten Grafiksignaturen erfolgt mittels Namen (siehe Signaturobjektnamen in Abbildung 5). Die Grafiksignaturen selbst (auch Signaturobjekte genannt) sind als Meta-Objekte (Daten) in entsprechenden Behältern enthalten. Einen Behälter mit solchen Signaturobjekten nennt man oft auch Signaturenbibliothek.
Im Signaturenmodell wird für jede Signaturart in der entsprechenden Signaturklassen-Definition festgelegt, welche Parameter (z.B. Lage und Orientierung einer Signatur) für die Darstellung nötig sind. Damit wird die Schnittstelle zum Grafiksubsystem (der Grafik-Umsetzer-Software) der jeweiligen Systeme nicht durch INTERLIS selbst, sondern durch die Signaturenmodelle festgelegt. In diesem Rahmen können zudem globale Laufzeit-Parameter deklariert werden (z.B. der Darstellungsmassstab), die zur Laufzeit dem Grafiksubsystem bekannt sind und den Entscheid, mit welchen Signaturen die Darstellung erfolgen soll, beeinflussen können.
Eine Darstellungsbeschreibung muss die Umsetzung in Signaturen nicht abschliessend regeln. Sie kann vielmehr durch eine andere Darstellungsbeschreibung geerbt werden. Darin können Parameter, die in Basisdefinitionen offen gelassen worden sind, ergänzt werden oder es können bereits erfolgte Darstellungsanweisungen ersetzt werden.
2.7. Dienste, Werkzeugfähigkeit und Konformität
INTERLIS 2 ermöglicht die konzeptionelle Beschreibung von Daten und definiert einen systemneutralen Daten-Transfer. INTERLIS 2 verzichtet bewusst darauf, die Implementation vorzuschreiben und bleibt damit systemunabhängig. In der Praxis wird sich damit häufig die Frage stellen, ob ein bestimmtes Werkzeug oder ein bestimmter Dienst INTERLIS 2-konform ist oder nicht.
INTERLIS 2 geht nicht davon aus, dass nur ein Ja (d.h. vollständige Erfüllung) oder ein Nein (d.h. Nichterfüllung) möglich ist. Vielmehr kann ein Dienst für bestimmte Aspekte INTERLIS 2-konform sein, während er andere Anforderungen nicht erfüllt.
Im einfachsten Fall erfüllt ein bestimmtes System die INTERLIS-Spezifikationen für einen bestimmten Fall (für eine bestimmte Menge von Modellen, nur für das Lesen oder nur für das Schreiben oder beides, etc.).
Im Idealfall kann einem INTERLIS-Werkzeug eine Menge von INTERLIS-Modellen übergeben und damit erreicht werden, dass das Werkzeug damit seine Dienste und Fähigkeiten automatisch der durch die Modelle definierten Situation anpasst. In vielen Fällen wird diese Anpassung jedoch mit weiteren manuellen Tätigkeiten (System-Konfigurierung oder gar Programmierung) verbunden sein. Zur Basisfunktionalität (Basisdienst) solcher Werkzeuge gehört sicher, dass sie INTERLIS-Modell-Beschreibungen korrekt einlesen können. Dazu gehört vor allem, dass die Systemfähigkeiten korrekt gemäss den INTERLIS-Konstrukten, insbesondere den Vererbungskonstrukten angeboten werden.
Aus der Sicht von INTERLIS können die Fähigkeiten solcher Werkzeuge wie folgt gegliedert werden (so genannte Werkzeugfähigkeiten, Funktionalitäten oder Dienste):
-
Daten einlesen (inkl. gespeicherte Sichten, ohne Sicht-Objekte erzeugen)
-
Daten einlesen (inkl. gespeicherte Sichten, mit Sicht-Objekte erzeugen)
-
Konsistenzen prüfen
-
Sichten (Views) schreiben
-
Grafik erzeugen (inkl. Sichten (Views) lesen)
-
Daten bearbeiten und schreiben
-
Objektidentifikatoren (OID) erzeugen
-
Nachlieferung lesen (inkrementelle Nachlieferung)
-
Nachlieferung schreiben (inkrementelle Nachlieferung)
Es ist auch durchaus möglich, dass ein bestimmtes Werkzeug oder ein bestimmter Dienst für einzelne Modelle und Themen (Daten oder Sichten) bestimmte Fähigkeiten (z.B. inkrementelle Nachlieferung) aufweist, sie aber bei anderen Modellen oder Themen nicht unterstützt.
Betrachtet man ein Beispiel des Zusammenwirkens verschiedener Beteiligter, ist es offensichtlich, dass je nach Einsatzgebiet und Rolle eines Beteiligten unterschiedliche Werkzeugfähigkeiten oder Dienste von INTERLIS 2 gefragt sind (siehe Abbildung 6). Ein einzelner Beteiligter kann in einer Anwendung (d.h. INTERLIS-Modell) mit verschiedenen Themen (TOPICS) mehrere Rollen einnehmen:
-
Erstdatenerfasser – Daten bearbeiten und schreiben; gegebenenfalls OID erzeugen.
-
Geodatenveränderer (Nachführen, Ergänzen) – Daten einlesen; Daten bearbeiten und schreiben; OID erzeugen; Inkremente produzieren; Inkremente lesen; Konsistenzen (lokal) prüfen.
-
Geodatenverwalter/Geodatenzentrale – Daten einlesen; Daten bearbeiten und schreiben; OID erzeugen; Inkremente lesen; Konsistenzen prüfen (global).
-
Geodatenabnehmer – Daten einlesen; Inkremente lesen.
-
Geodatenviewer – Daten einlesen; Sicht-Objekte und grafische Darstellungen erzeugen.
-
Planproduzent – Daten einlesen; Inkremente lesen; Sichten lesen und grafische Darstellungen erzeugen.
2.8. Umgang mit Rundung von numerischen Werten und Koordinaten
In INTERLIS wird von numerischen Werten, von Punkten, Linien und Flächen / Flächennetzen gesprochen. Dabei kann definiert werden, welche Stellenzahl die Werte aufweisen sollen. Da INTERLIS nicht in die Systeme hinein regulieren will, ist es den Systemen überlassen, wie sie die Werte (Zahlen, Koordinaten) intern speichern. Die Speicherung muss nur in der Lage sein, Werte gemäss der Wertebereichdefinition festzuhalten.
Numerische Werte weisen in digitaler Form eine endliche Genauigkeit auf, die von der Form der Speicherung abhängt. Für 2D-Koordinaten kann man sich bildlich ein kariertes Papier („Hüslipapier“) vorstellen: Speicherbare Koordinaten können nur auf den Kreuzungspunkten der Karo-Linien liegen.
Betrachtet man nun eine gespeicherte Gerade, deren Anfangs- und Endpunkte auf Kreuzungspunkten unterschiedlicher Karo-Linien liegen, und teilt diese an einer Zwischen-Stelle auf, ergibt sich (ausser in Ausnahmefällen) geometrisch ein Punkt, der im Innern eines Karos liegt. Um ihn zu speichern, wird zwangsläufig auf den nächstliegenden Kreuzungspunkt gerundet. Eine berechnete Koordinate liegt also (ausser in Ausnahmefällen) nicht exakt an der Stelle des geometrischen Ortes, für den sie berechnet wurde. Dies führt insbesondere bei Berechnungen, welche die Koordinaten nutzen, zwangsläufig zu Differenzen.
Typische Folgen der Rundung sind etwa:
-
Punkte können zu einem Punkt zusammenfallen
-
Kreisbogen-Overlaps ausserhalb der Toleranz
-
Verlangte Schnittfreiheit von Linien nicht mehr erfüllt
-
Abgeleitete Attribute (insbesondere Längen, Flächenmasse) stimmen nicht mehr mit der geometrischen Auswertung überein
Mit einer höheren Speichergenauigkeit können solche Probleme auch nicht behoben werden. Es sinkt nur die Wahrscheinlichkeit, dass solche Differenzen als störend betrachtet werden. Numerische Werte werden darum im INTERLIS2-Transfer gemäss der Wertebereichsdefinition im Daten-Modell dargestellt. Konsistenzbedingungen müssen mit den gerundeten Werten (auf- oder abgerundet) eingehalten sein. Funktional abgeleitete Attribute müssen (sofern nicht transient) dem auf- oder abgerundeten Funktionswert entsprechen. Prüfprogramme müssen also bei ihrer Prüfung auf- und abgerundete Werte als in Ordnung taxieren.
2.9. Das kleine Beispiel Roads als Einstieg
Im Anhang E Das kleine Beispiel Roads ist ein kleines Beispiel beigefügt, das die wichtigsten INTERLIS-Sprachelemente im Rahmen einer einfachen Anwendung vorstellt.
2.10. Weitere Gliederung des Referenzhandbuchs
Im nächsten Kapitel 3 wird die Beschreibungssprache formal definiert. Im Kapitel 4 wird der sequentielle Transfer von Geodaten spezifiziert. Dieses Kapitel enthält einen allgemeinen Teil, der für alle aktuellen und künftigen sequentiellen INTERLIS 2-Transferdienste gilt und einen speziellen Teil, der für den INTERLIS 2-Transferdienst mit XML gilt.
Die Anhänge gliedern sich in vier normative Anhänge A bis D, ergänzt durch einen informativen Anhang E, in die Standard-Erweiterungsvorschläge F bis L sowie ein Glossar (Anhang M) und einen Index (Anhang N).
Die normativen Anhänge sind integrierender Bestandteil dieser Spezifikation. Die Standard-Erweiterungsvorschläge (Anhänge F bis L) sind sehr zur Implementation empfohlen. Es sind dies informative (nicht-normative) Anhänge mit eigenständigem Charakter. Die entsprechenden Fragestellungen können von Implementationen auch anders gelöst werden, sie sind dadurch immer noch INTERLIS 2-konform. In diesen Fällen ist es dann aber Sache der am Transfer Beteiligten, sich über die Spezifikation zu einigen.
3. Beschreibungssprache
3.1. Verwendete Syntax
Zur Festlegung des konzeptionellen Datenmodells (Datenschemas) und der Transferparameter eines Datentransfers wird in den folgenden Kapiteln eine formale Sprache definiert. Diese Sprache ist selbst formal definiert. Syntaxregeln beschreiben dabei die zulässige Reihenfolge von Symbolen.
Die Beschreibung folgt damit der Art und Weise, die bei der Beschreibung moderner Programmiersprachen üblich ist. Hier wird deshalb nur eine knappe, für das Verständnis nötige Darstellung angegeben. Für Einzelheiten wird auf die Literatur verwiesen. Eine kurze Einführung befindet sich z.B. in «Programmieren in Modula-2» von Niklaus Wirth.
Eine Formel wird im Sinne der erweiterten Backus-Naur-Notation (EBNF) wie folgt aufgebaut:
Formel-Name = Formel-Ausdruck.
Der Formel-Ausdruck ist eine Kombination von:
- fixen Wörtern (inkl. Spezialzeichen) der Sprache. Sie werden in Apostrophe eingeschlossen, z.B. 'BEGIN'
.
- Referenzen von anderen Formeln durch Angabe des Formelnamens.
Als Kombination kommen in Frage:
a b c zuerst a, dann b, dann c.
( a ) runde Klammern gruppieren Formel-Ausdrücke.
a | b | c a, b oder c.
[ a ] a oder nichts (leer).
{ a } beliebige Folgen von a oder nichts (leer).
(* a *) beliebige Folge von a, aber mindestens eins.
(a|b)(c|d) ac, ad, bc oder bd a[b]c abc oder ac a{ba} a, aba, ababa, abababa, ... {a|b}c c, ac, bc, aac, abc, bbc, bac, ... a(*b*) ab, abb, abbb, abbbb, ... (*ab|[c]d*) ab, d, cd, abd, dab, cdab, ababddd, cdababcddcd, ...
Häufig möchte man eine syntaktisch gleiche Formel in verschiedenen Zusammenhängen, für verschiedene Zwecke verwenden. Um diesen Zusammenhang auch ausdrücken zu können, müsste man eine zusätzliche Formel schreiben:
Example = 'CLASS' Classname '=' Classdef. Classname = Name.
Damit dieser Umweg vermieden werden kann, wird folgende abgekürzte Schreibweise angewendet:
Example = 'CLASS' Class-Name '=' Classdef.
Die Formel Class-Name wird nicht definiert. Syntaktisch kommt direkt die Regel "Name" zur Anwendung (vgl. Kapitel 3.2.2, “Namen”). Von der Bedeutung her ist der Name jedoch ein Klassenname. "Class" wird damit quasi zu einem Kommentar.
3.2. Grundsymbole der Sprache
Die Beschreibungssprache weist die folgenden Symbol-Klassen auf: Namen, Zeichenketten, Zahlen, Erläuterungen, Sonderzeichen, reservierte Wörter und Kommentare.
3.2.1. Zeichenvorrat, Zwischenräume und Zeilenenden
Die eigentliche Sprache verwendet nur die druckbaren US-ASCII-Zeichen (32 bis 126). Welche Zeichen nebst dem Leerzeichen als Zwischenräume gelten, ist durch die konkrete Compiler-Implementation festzulegen. Diese legt auch fest, welche Zeichen oder Zeichenkombinationen als Zeilenende gelten. Wie die Zeichen gespeichert werden (Zeichensatz) ist Sache der Implementation des Compilers. Sie kann insbesondere je nach Plattform unterschiedlich sein.
Im Rahmen von Kommentaren dürfen auch weitere Zeichen (z.B. Umlaute und Akzente) vorkommen.
3.2.2. Namen
Ein Name ist definiert als eine Folge von maximal 255 Buchstaben, Ziffern und Unterstrichen, wobei das erste Zeichen ein Buchstabe sein muss. Gross- und Kleinbuchstaben werden dabei unterschieden. Namen, die mit reservierten Wörtern der Sprache (vgl. Kapitel 3.2.7, “Sonderzeichen und reservierte Wörter”) zusammenfallen, sind unzulässig.
Name = Letter { Letter | Digit | '_' }. Letter = ( 'A' | .. | 'Z' | 'a' | .. | 'z' ). Digit = ( '0' | '1' | .. | '9' ). HexDigit = ( Digit | 'A' | .. | 'F' | 'a' | .. | 'f' ).
Näheres zur Eindeutigkeit und zum Gültigkeitsbereich von Namen ist im Kapitel 3.5.4, “Namensräume” beschrieben.
3.2.3. Zeichenketten
Zeichenketten (Strings) kommen im Zusammenhang mit Konstanten vor. Sie beginnen und enden mit einem Anführungszeichen und dürfen sich nicht über mehrere Zeilen erstrecken. \"
steht für ein Anführungszeichen und \\
für einen «Backslash» innerhalb des Strings.
Eine Sequenz von \u
, unmittelbar gefolgt von exakt vier Hexadezimalziffern, steht für ein beliebiges Unicode-Zeichen. Zeichen ab U+10000 sind wie in der UTF-16-Codierung mit zwei Surrogatcodes zu bezeichnen (siehe https://www.unicode.org).
String = '"' { <any character except '\' or '"'> | '\"' | '\\' | '\u' HexDigit HexDigit HexDigit HexDigit } '"'.
3.2.4. Zahlen
Zahlen kommen in verschiedener Weise vor: Positive ganze Zahlen inklusive 0 (PosNumber), ganze Zahlen (Number), Dezimalzahlen (Dec) und strukturierte Zahlen. Bei Dezimalzahlen kann die Skalierung als Zehnerpotenz angegeben werden (z.B. 1E2 ist 100, 1E-1 ist 0.1). Strukturierte Zahlen machen nur im Zusammenhang mit entsprechenden Einheiten und Wertebereichen (z.B. Uhrzeit) einen Sinn. Wesentlich ist der Wert der Zahl, nicht deren Darstellung. So ist etwa 007 dieselbe Zahl wie 7.
PosNumber = (* Digit *). Number = [ '+' | '-' ] PosNumber. Dec = ( Number [ '.' PosNumber ] | Float ). Float = [ '+' | '-' ] '0.' ( ( '1' | '2' | .. | '9' ) [ PosNumber ] | (* '0' *) ) Scaling. Scaling = ( 'e' | 'E' ) Number.
PosNumber: 5134523 1 23 Number: 123 -435 +5769 Dec: 123.456 0.123456e4 -0.123e-2 Float: 0.1e7 -0.123456E+4 0.987e-100
3.2.5. Eigenschaftsmengen
Für verschiedene Zwecke müssen einem Beschreibungsgegenstand Eigenschaften zugeordnet werden. Dies kann mit einer generellen Syntax erfolgen:
Properties = [ '(' Property { ',' Property } ')' ].
Um zu definieren, dass an einer bestimmten Stelle einer Syntaxregel solche Eigenschaften definiert werden sollen, wird in der Syntax folgendes Konstrukt eingefügt:
'Properties' '<' Property-Keyword { ',' Property-Keyword } '>'
Man schreibt also "Properties" und definiert in spitzen Klammern die zulässigen Schlüsselwörter. Nimmt man als Beispiel die Regel ClassDef (vgl. Kapitel 3.5.3, “Klassen und Strukturen”) werden mit "Properties<ABSTRACT,EXTENDED,FINAL>"
die Schlüsselwörter "ABSTRACT"
, "EXTENDED"
und "FINAL"
für die Beschreibung von Eigenschaften akzeptiert. In einer INTERLIS 2-Definition wären dann unter anderem folgende Definitionen möglich:
CLASS A (ABSTRACT) = ..... CLASS A (EXTENDED, FINAL) = .....
3.2.6. Erläuterungen
Erläuterungen werden dort verlangt, wo ein Sachverhalt näher beschrieben werden muss. Aus der Sicht des Standard-Mechanismus wird die Erläuterung nicht weiter interpretiert, also als Kommentar aufgefasst. Es ist aber durchaus zulässig, Erläuterungen detaillierter zu formalisieren und damit einer weitergehenden maschinellen Verarbeitung zugänglich zu machen. Als Anfang und Abschluss einer Erläuterung wurde //
gewählt. Innerhalb der Erläuterung dürfen zwei aufeinander folgende Schrägstriche nie vorkommen.
Explanation = '//' any character except // '//'.
3.2.7. Sonderzeichen und reservierte Wörter
Sonderzeichen und reservierte Wörter sind in den Syntaxregeln der Sprache (nicht aber bei einer Datenbeschreibung) immer zwischen Apostrophen geschrieben, z.B. ','
oder 'MODEL'
. Die reservierten Wörter werden grundsätzlich mit Grossbuchstaben geschrieben. Konflikte zwischen Namen und reservierten Wörtern sind vermeidbar, wenn Namen nicht ausschliesslich aus Grossbuchstaben bestehen.
Es werden folgende reservierten Wörter verwendet (einige davon wurden in INTERLIS 1 bzw. 2.3 benutzt und bleiben aus Gründen der Kompatibilität reserviert; sie sind nicht fett und kursiv dargestellt):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3.2.8. Kommentare
Es werden zwei Kommentarformen angeboten:
3.2.8.1. Zeilenkommentar
Ein Zeilenkommentar wird mit zwei Ausrufezeichen eröffnet, die unmittelbar aufeinander folgen. Der Zeilenkommentar wird durch das Zeilenende abgeschlossen.
!! Line comment; goes until end of line
3.2.8.2. Blockkommentar
Der Blockkommentar wird durch einen Schrägstrich und einen Stern eingeleitet; abgeschlossen wird er durch einen Stern und einen Schrägstrich. Er darf sich über mehrere Zeilen hinweg erstrecken und seinerseits Zeilenkommentare enthalten. Geschachtelte Blockkommentare sind zugelassen.
/* Block comment, additional line comment */
3.3. Hauptregel
Jede Beschreibungseinheit beginnt mit der Angabe der Sprach-Version. Damit wird die Basis für spätere Sprachzusätze gelegt. Die in diesem Dokument beschriebene Version von INTERLIS ist 2.4.
Nachher folgen die Modellbeschreibungen.
INTERLIS2Def = 'INTERLIS' Version-Dec ';' { ModelDef }.
3.4. Vererbung
Verschiedene Konstrukte von INTERLIS können im Sinne der objekt-orientierten Denkweise erweitert werden: Eine erste Definition schafft die Grundlage, die dann in mehreren Schritten spezialisiert werden kann.
Themen, Klassen, Sichten, Grafikdefinitionen, Einheiten und Wertebereiche können die entsprechenden Grundkonstrukte erweitern (Schlüsselwort EXTENDS
bzw. EXTENDED
) und erben damit alle ihre Eigenschaften. Ein zuvor definiertes Konstrukt kann in bestimmten Fällen durch Angabe von EXTENDED
unter Beibehaltung des Namens erweitert werden.
Mit FINAL
wird das Erweitern einer Definition verhindert. Verschiedene Konstrukte können in einer noch unvollständigen Form (Schlüsselwort ABSTRACT
) definiert werden; sie werden später in einer Erweiterung zu einer konkreten Definition ergänzt.
Um die in einem bestimmten Kontext zulässigen Schlüsselwörter anzugeben, wird jeweils die generelle Property-Schreibweise verwendet (vgl. Kapitel 3.2.5, “Eigenschaftsmengen”).
3.5. Modelle, Themen, Klassen
3.5.1. Modelle
Als Modell wird eine in sich geschlossene, vollständige Definition bezeichnet. Je nach Art des Modells kann es verschiedene Konstrukte enthalten.
Ein reines Typenmodell (TYPE MODEL
) darf nur Masseinheiten, Wertebereiche, Funktionen und Linienformen deklarieren.
Ein Referenzsystem-Modell (REFSYSTEM MODEL
) soll nebst den Definitionen eines Typenmodells nur Themen und Klassen deklarieren, die im Bezug zu Erweiterungen der vordefinierten Klassen AXIS
bzw. REFSYSTEM
stehen (vgl. Kapitel 3.10.3, “Referenzsysteme”). Die Einhaltung dieser Regel kann durch die Sprache nicht erzwungen werden. Es ist Sache des Anwenders, sich daran zu halten.
Ein Signaturenmodell (SYMBOLOGY MODEL
) soll nebst den Definitionen eines Typenmodells nur Themen und Klassen, die im Bezug zu Erweiterungen der vordefinierten Klasse SIGN
stehen, sowie Laufzeitparameter deklarieren (vgl. Kapitel 3.16, “Darstellungsbeschreibungen” und Kapitel 3.11, “Laufzeitparameter”). Die Einhaltung dieser Regel ist ebenfalls Sache des Anwenders.
Wird keine solche einschränkende Modelleigenschaft definiert, darf ein Modell alle möglichen Konstrukte enthalten.
Nach dem Modellnamen kann optional die Sprache angegeben werden. Wenn möglich sollte die Angabe anhand der durch die ISO-Norm 639 standardisierten zwei-buchstabigen Bezeichnungen in Kleinbuchstaben erfolgen (siehe https://www.iso.org); zum Beispiel steht "de" für Deutsch, "fr" für Französisch, "it" für Italienisch, "rm" für Rätoromanisch und "en" für Englisch. Durch einen Unterstrich getrennt darf ein Ländercode gemäss ISO-Norm 3166 nachgestellt werden, um die in einem bestimmten Land benutzte Varietät einer Sprache zu bezeichnen: "de_CH" steht für das in der Schweiz verwendete (Schrift-)Deutsch. Diese Angabe hat dokumentarischen Wert. Sie steht im Zusammenhang mit der Möglichkeit, ein Modell als eine Übersetzung eines anderen zu deklarieren (TRANSLATION OF
). Die beiden Modelle müssen dann strukturell exakt übereinstimmen. Sie dürfen sich also nur in den verwendeten Namen unterscheiden. Die Deklaration als Übersetzung ist aber nicht an die Sprachangabe gebunden. Um z.B. lokale oder branchenspezifische Sprachgebräuche zu unterstützen, sind insbesondere auch Übersetzungen in die gleiche Sprache wie die Ursprungsbeschreibung zulässig.
Mit der Angabe NOINCREMENTALTRANSFER
wird definiert, dass beim Datentransfer (vgl. Kapitel 4, “Sequentieller Transfer”) kein inkrementeller Transfer unterstützt werden muss.[1] Insbesondere enthält das aus dem Modell generierte XML-Schema keine entsprechenden Möglichkeiten.
Anschliessend wird mittels Angabe des entsprechenden URI (vgl. Kapitel 3.2.3, “Zeichenketten”) der Herausgeber des Modells identifiziert. Es wird erwartet, dass der Modellname in diesem Kontext eindeutig ist.
ModelDef = [ 'CONTRACTED' ] [ 'TYPE' | 'REFSYSTEM' | 'SYMBOLOGY' ] 'MODEL' Model-Name [ '(' Language-Name ')' ] [ 'NOINCREMENTALTRANSFER' ] 'AT' URI-String 'VERSION' ModelVersion-String [ Explanation ] [ 'TRANSLATION' 'OF' Model-Name '[' ModelVersion-String ']' ] '=' [ 'CHARSET' IANA-Name-String ';' ] [ 'XMLNS' XMLNS-String ';' ] { 'IMPORTS' [ 'UNQUALIFIED' ] Model-Name { ',' [ 'UNQUALIFIED' ] Model-Name } ';' } { MetaDataBasketDef | UnitDef | FunctionDef | LineFormTypeDef | DomainDef | ContextDef | RunTimeParameterDef | ClassDef | StructureDef | TopicDef } 'END' Model-Name '.'.
Mit der Modellversion können verschiedene Versionen (insbesondere verschiedene Entwicklungsstufen) eines Modells unterschieden werden. In der Erläuterung können zusätzliche Angaben wie Hinweise zur Kompatibilität mit früheren Versionen gemacht werden. In einem bestimmten Zeitpunkt soll aber nur eine Modellversion bestehen. Deshalb wird beim Import von Modellen auch keine Version angegeben. Ist ein Modell eine Übersetzung eines anderen, ist dessen Version in eckigen Klammern anzugeben. Mit der Versionsangabe im Rahmen einer Übersetzungsdefinition (TRANSLATION OF
) wird nur dokumentiert, auf Grund welcher Basisversion die Übersetzung erstellt wurde und mit welcher sie also auch strukturell exakt übereinstimmt.
Das Schlüsselwort CONTRACTED
hat keine Funktion mehr, bleibt zur Kompatibilität hier aber zulässig.
Optional kann - eingeleitet durch das Schlüsselwort CHARSET
- der Name eines Zeichensatzes definiert werden. Zulässige Namen werden durch IANA festgelegt.[2] Fehlt die Angabe, gilt der Zeichensatz gemäss Anhang D. Die Definition des Zeichensatzes definiert den Umfang an Zeichen die eine Software verarbeiten (wie z.B. Speichern, Suchen, Sortieren, Ausdrucken) können muss und nicht den im Transfer zulässigen Zeichensatz oder die zulässige Zeichencodierung (vgl. Kapitel 4.3.2, “Zeichencodierung”).
Mit der Angabe nach XMLNS kann optional für den XML-Transfer gemäss Kapitel 3 der XML-Namensraum[3] festgelegt werden.[4] Ohne Angabe ergibt sich der XML-Namensraum nach einer fixen Regel (vgl. Kapitel 4, “Sequentieller Transfer”) aus dem Namen des Modells.
Bezieht sich ein INTERLIS-Konstrukt auf eine Definition, die in einem anderen Modell vorgenommen wurde, muss dieses Modell importiert werden (Schlüsselwort IMPORTS
). So können beispielsweise Themen erweitert und der Bezug auf Klassen geschaffen werden. IMPORTS
eröffnet aber nur die Möglichkeit des Gebrauchs. Bei der Verwendung der importierten Definitionen, sind diese dennoch mit qualifiziertem Namen (Modell, Thema) zu referenzieren, ausser man verwendet das Schlüsselwort UNQUALIFIED
. Themen gehören nur dann zu einem Modell (und können entsprechend Kapitel 4.3.6, “Codierung von Themen” transferiert werden), wenn sie innerhalb dieses Modells definiert sind (Regel TopicDef).
Mit der Sprache verbunden ist auch ein vordefiniertes Basis-Modell "INTERLIS" (vgl. Anhang A Das interne INTERLIS-Datenmodell). Dieses muss nicht importiert werden. Hingegen stehen auch dessen Elemente nur dann mit unqualifizierten Namen zur Verfügung, wenn das Modell mit IMPORTS UNQUALIFIED INTERLIS
eingeführt wird.
3.5.2. Themen
Ein Thema (Schlüsselwort TOPIC
) enthält alle zur Beschreibung eines bestimmten sachlichen Teils der Realwelt nötigen Definitionen. Ein Thema kann auch Typen wie Masseinheiten, Wertebereiche oder Strukturen definieren oder diese vom umhüllenden Modell oder einem importierten Modell benützen. In runden Klammern können die Vererbungseigenschaften definiert werden. Enthält ein Thema abstrakte Definitionen, die nicht im selben Thema konkretisiert werden, muss das Thema als ABSTRACT deklariert werden. Abstrakte Definitionen müssen dann in konkreten Erweiterungen des Themas noch konkretisiert werden. Für einen Datentransfer braucht es ein konkretes Thema. Da sich eine Erweiterung eines Themas immer auf ein Thema mit einem anderen Namen bezieht, macht EXTENDED
keinen Sinn und ist deshalb nicht zulässig.
TopicDef = [ 'VIEW' ] 'TOPIC' Topic-Name Properties<ABSTRACT,FINAL> [ 'EXTENDS' TopicRef ] '=' [ 'BASKET' 'OID' 'AS' OID-DomainRef ';' ] [ 'OID' 'AS' OID-DomainRef ';' ] { 'DEPENDS' 'ON' TopicRef { ',' TopicRef } ';' } [ 'DEFERRED' 'GENERICS' GenericRef { ',' GenericRef } ';' ] Definitions 'END' Topic-Name ';'. Definitions = { MetaDataBasketDef | UnitDef | FunctionDef | DomainDef | ClassDef | StructureDef | AssociationDef | ConstraintsDef | ViewDef | GraphicDef }. TopicRef = [ Model-Name '.' ] Topic-Name. GenericRef = GenericCoordType-DomainRef.
Zu einem bestimmten Thema, das konkrete Klassen enthält, können beliebig viele Behälter (Datenbanken etc.) existieren. Sie weisen alle die dem Thema entsprechende Struktur auf, enthalten aber unterschiedliche Objekte.
In einem Datenbehälter kommen dabei nur die Instanzen von Klassen (und ihrer Unterstrukturen) vor. Enthält ein Thema Darstellungsbeschreibungen, können drei Arten von Behältern gebildet werden:
-
Datenbehälter.
-
Behälter mit den Basisdaten für die Grafik. Solche Behälter enthalten die Instanzen von Klassen oder Sichten, welche die Grundlage der Darstellungsbeschreibungen bilden.
-
Grafikbehälter. Solche Behälter enthalten die umgesetzten Grafikobjekte (entsprechend der Parameter-Definition der verwendeten Signaturen).
Datenbehälter und Objekte weisen in der Regel eine Objektidentifikation auf. Ihr Wertebereich ergibt sich aus der entsprechenden Definition: BASKET OID AS
für die Objektidentifikationen der Datenbehälter, OID AS
für die Objektidentifikationen der Objekte, sofern bei der jeweiligen Klasse keine spezifische Definition dafür gemacht wird. Wurde einem Thema ein OID-Wertebereich zugeordnet, kann die Zuordnung in Erweiterungen nicht mehr geändert werden. In vielen Fällen wird es Sinn machen, den Standardwertebereich STANDARDOID
(vgl. Kapitel 3.8.9, “Wertebereiche von Objektidentifikationen” sowie Anhänge A und F) zu verwenden. Fehlt die OID-Definition für ein Thema oder eine bestimmte Klasse, erhalten diese Behälter bzw. Objekte keine stabilen Objektidentifikationen. Der inkrementelle Datenaustausch ist dann für sie nicht möglich.
Ohne weitere Angaben ist ein Thema datenmässig unabhängig von anderen Themen. Datenmässige Abhängigkeiten entstehen als Folge von Beziehungen bzw. Referenzattributen, die in einen anderen Behälter verweisen, durch spezielle Konsistenzbedingungen oder durch den Aufbau von Sichten oder Grafikdefinitionen auf Klassen oder anderen Sichten, nicht aber durch die Verwendung von Metaobjekten (vgl. Kapitel 3.10.1, “Allgemeine Aussagen zu Metaobjekten”). Im Interesse der klaren Erkennbarkeit solcher Abhängigkeiten, müssen diese aber bereits im Themenkopf explizit deklariert werden (Schlüsselwort DEPENDS ON
). Die detaillierten Definitionen (z.B. Beziehungsdefinitionen) dürfen dann die Abhängigkeitsdeklaration nicht verletzen. Zyklische Abhängigkeiten sind nicht erlaubt. Ein erweitertes Thema besitzt ohne zusätzliche Deklarationen dieselben Abhängigkeiten wie sein Basis-Thema.
Referenziert ein Thema direkt oder indirekt generische Festlegungen, die letztlich erst im Transfer festgelegt werden, müssen sie explizit aufgeführt werden (DEFERRED GENERICS
). Aktuell besteht diese Möglichkeit nur für Koordinaten-Wertebereiche (vgl. Kapitel 3.8.8, “Koordinaten”).
3.5.3. Klassen und Strukturen
Eine Klassendefinition (Schlüsselwort CLASS) deklariert die Eigenschaften aller zugehörigen Objekte. Eine Klasse wird in einem Thema abschliessend definiert. Klassendefinitionen sind erweiterbar, wobei eine Erweiterung primär sämtliche Attribute ihrer Basis-Klasse erbt. Deren Wertebereiche dürfen eingeschränkt werden. Zudem dürfen weitere Attribute oder zusätzliche Konsistenzbedingungen definiert werden.
Der Wertebereich der Objektidentifikationen aller Objekte dieser Klasse kann explizit festgelegt werden (OID AS
oder NO OID
). Fehlt die Definition, gilt diejenige des Themas, es sei denn, es werde explizit festgelegt, dass keine Objektidentifikationen gefragt sind (NO OID
). Fehlt die Definition auch beim Thema, gilt implizit NO OID
. NO OID
bedeutet, dass die Objektidentifikation nicht stabil ist. Als Folge ist es weder möglich, Objekte dieser Klasse inkrementell nachzuliefern, noch Referenzen (Beziehungen, Beziehungsattribute) auf diese Klasse zu definieren. Eine bereits gemachte OID-Definition kann nicht erweitert werden, ausser dass ein geerbtes NO OID
durch ANY
, und ein geerbtes ANY
durch eine konkrete Definition ersetzt werden kann. Ein geerbtes ANY
kann jedoch nicht durch NO OID
ersetzt werden. (vgl. Kapitel 3.8.9, “Wertebereiche von Objektidentifikationen”).
Als Teil einer Klassendefinition können Konsistenzbedingungen angegeben werden. Die Bedingungen stellen Regeln dar, welchen die Objekte zusätzlich genügen müssen. Ererbte Konsistenzbedingungen können nicht ausser Kraft gesetzt werden, sondern gelten immer zusätzlich zu den lokal deklarierten.
Die Objekte einer Klasse sind immer selbständig und individuell identifizierbar. Strukturen (Schlüsselwort STRUCTURE
) sind zwar formal gleich wie Klassen definiert, ihre Strukturelemente sind jedoch unselbständig und können nicht einzeln identifiziert werden. Sie kommen entweder innerhalb von Unterstrukturen von Objekten vor (vgl. Kapitel 3.6, “Attribute”), oder sie existieren nur temporär als Ergebnisse von Funktionen. Strukturen dürfen zu Klassen erweitert werden; Objekte solcher Klassen sind wie normale Objekte selbständig und identifizierbar. Klassen dürfen nicht zu Strukturen erweitert werden.
Spezielle Klassen wie diejenigen für Referenzsysteme, Koordinatensystem-Achsen und Grafik-Signaturen (also Erweiterungen der vordefinierten Klasse METAOBJECT
) werden im Kapitel 3.10, “Umgang mit Metaobjekten” beschrieben.
In runden Klammern (Regel Properties) können die Vererbungseigenschaften definiert werden. Es sind alle Möglichkeiten zulässig. Enthält eine Klasse oder Struktur abstrakte Attribute, ist sie als ABSTRACT
zu deklarieren. Abstrakte Attribute müssen dann in konkreten Erweiterungen der Klasse noch konkretisiert werden. Es ist aber auch zulässig, Klassen als abstrakt zu erklären, deren Attribute vollständig definiert sind. Objektinstanzen können nur für konkrete Klassen existieren, die innerhalb eines Themas definiert wurden, d.h. für einen Datentransfer braucht es konkrete Klassen, die in einem konkreten Thema definiert sind.
Wird eine einzelne Klasse und nicht ein ganzes Thema geerbt, dürfen keine Beziehungen (vgl. Kapitel 3.7, “Eigentliche Beziehungen”) zu ihr definiert sein.
Erweitert ein Thema ein anderes, werden alle Klassen des geerbten Themas übernommen. Sie werden also zu Klassen des aktuellen Themas und haben denselben Namen wie im geerbten Thema. Eine solche Klasse kann auch unter Beibehaltung ihres Namens erweitert werden (EXTENDED
). Erweitert z.B. ein Thema T2 das Thema T1, das die Klasse C enthält, gibt es mit C (EXTENDED) innerhalb von T2 nur eine Klasse, nämlich C. Neue Klassen, die sich namensmässig von den geerbten unterscheiden müssen, dürfen auch geerbte erweitern. Mit C2 EXTENDS C, gibt es dann in T2 zwei Klassen (C und C2). Da INTERLIS im Interesse von Einfachheit und Klarheit nur Einfachvererbung unterstützt, ist EXTENDED
allerdings nur zulässig, wenn weder im Basis-Thema noch im aktuellen Thema die Basis-Klasse mit EXTENDS
erweitert wurde. EXTENDED
und EXTENDS
schliessen sich in der gleichen Klassendefinition aus.
ClassDef = 'CLASS' Class-Name Properties<ABSTRACT,EXTENDED,FINAL> [ 'EXTENDS' ClassRef ] '=' (1) [ ( 'OID' 'AS' OID-DomainRef | 'NO' 'OID' ) ';' ] ClassOrStructureDef 'END' Class-Name ';'. StructureDef = 'STRUCTURE' Structure-Name Properties<ABSTRACT,EXTENDED,FINAL> [ 'EXTENDS' StructureRef ] '=' ClassOrStructureDef 'END' Structure-Name ';'. ClassOrStructureDef = [ 'ATTRIBUTE' ] { AttributeDef } { ConstraintDef } [ 'PARAMETER' { ParameterDef } ]. ClassRef = [ Model-Name '.' [ Topic-Name '.' ] ] Class-Name. StructureRef = [ Model-Name '.' [ Topic-Name '.' ] ] Structure-Name. ClassOrStructureRef = ( ClassRef | StructureRef ).
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) steht an dieser Stelle ClassOrStructureRef. In INTERLIS 2.4 dürfen aber Strukturen nicht mehr zu Klassen erweitert werden. Siehe dazu auch dieses Issue. |
Welche Namen qualifiziert werden müssen (durch Model-Name bzw. durch Model-Name.Topic-Name) ist am Schluss des folgenden Abschnitts (vgl. Kapitel 3.5.4, “Namensräume”) erklärt. Klassen und Strukturen, die nicht auf einer bereits definierten Klasse oder Struktur aufbauen, brauchen keinen EXTENDS-Teil.
3.5.4. Namensräume
Als Namensraum bezeichnet man eine Menge von (eindeutigen) Namen. Jedes Modellierungselement (Datenmodell, Thema, Klassenelement) sowie die Metadaten-Behälter stellen jeweils einen eigenen Namensraum für ihre Namenskategorien (Typnamen, Bestandteilnamen, Metaobjektnamen) bereit.
Modellierungselemente gibt es auf drei Hierarchiestufen:
-
Modell (
MODEL
ist einziges Modellierungselement auf oberster Stufe) -
Thema (
TOPIC
ist einziges Modellierungselement auf dieser Stufe) -
Klassenelemente sind Klasse (
CLASS
), Struktur (STRUCTURE
), Assoziation (ASSOCIATION
), Sicht (VIEW
), Grafikdefinition (GRAPHIC
)
Metadaten-Behälter-Namen eröffnen den Zugang zu den Metaobjekten (vgl. Kapitel 3.10, “Umgang mit Metaobjekten”).
Es gibt drei Namenskategorien, die folgende Namen enthalten:
-
Typnamen sind die Kurzzeichen (Namen) von Einheiten und die Namen von Funktionen, Linienformtypen, Wertebereichen, Strukturen, Themen, Klassen, Assoziationen, Sichten, Grafikdefinitionen, Behältern.
-
Bestandteilnamen heissen die Namen von Laufzeitparametern, Attributen, Zeichnungsregeln, Parametern, Rollen und Basissichten.
-
Metaobjektnamen heissen die Namen von Metaobjekten. Sie existieren nur innerhalb von Metadatenbehältern.
Erweitert ein Modellierungselement ein anderes, werden seinen Namensräumen alle Namen des Basis-Modellierungselementes zugefügt. Um Missverständnisse auszuschliessen übernehmen Modellierungselemente zudem die Namen des übergeordneten Modellierungselementes entsprechend der Namenskategorie. Ein lokal im Modellierungselement definierter Name darf nicht mit einem übernommenen Namen kollidieren, es sei denn es handle sich ausdrücklich um eine Erweiterung (EXTENDED
).
Will man Beschreibungselemente des Datenmodells referenzieren, muss ihr Name normalerweise qualifiziert, d.h. mit vorangestelltem Modell- und Thema-Namen angegeben werden. Unqualifiziert können die Namen der Namensräume des jeweiligen Modellierungselementes verwendet werden.
3.6. Attribute
3.6.1. Allgemeine Aussagen zu Attributen
Jedes Attribut wird durch seinen Namen und seinen Typ definiert. In runden Klammern (Regel Properties) können die Vererbungseigenschaften definiert werden. Ist ein Attribut eine Erweiterung eines geerbten Attributes, muss dies mit EXTENDED
ausdrücklich angemerkt werden. Ist der Wertebereich eines Attributs abstrakt, muss das Attribut als ABSTRACT
deklariert werden. Ein numerisches Attribut (vgl. Kapitel 3.8.5, “Numerische Datentypen”) kann als eine Unterteilung (Schlüsselwort SUBDIVISION
) des ebenfalls numerischen Vorgängerattributes definiert sein (z.B. Minuten als Unterteilung von Stunden). Dieses Vorgängerattribut muss ganzzahlig und der Wertebereich der Unterteilung muss positiv sein. Ist die Unterteilung kontinuierlich (Schlüsselwort CONTINUOUS
), muss die Differenz der Wertebereichsgrenzen mit dem Faktor zwischen der Einheit des Attributs und demjenigen des Vorgängerattributs übereinstimmen. Ist zu einer Unterteilung ein Referenzsystem definiert, muss dieses zum Wertesystem eines direkten oder indirekten Vorgängerattributes passen. Ein INTERLIS-Compiler oder ein Laufzeitsystem muss dies jedoch nicht überprüfen.
AttributeDef = [ [ 'CONTINUOUS' ] 'SUBDIVISION' ] Attribute-Name Properties<ABSTRACT,EXTENDED,FINAL,TRANSIENT> ':' AttrTypeDef [ ':=' Expression { ',' Expression } ] ';'.
Wird der Attributwert mittels eines Faktors (vgl. Kapitel 3.13, “Ausdrücke”) festgelegt, muss dessen Ergebnistyp zuweisungskompatibel zum definierten Attribut sein, d.h. es muss den gleichen Wertebereich oder einen erweiterten, d.h. spezialisierten Wertebereich aufweisen. Im Rahmen von Sichten - vor allem bei Vereinigungen und Sichterweiterungen (vgl. Kapitel 3.15, “Sichten”) – können mehrere Faktoren festgelegt werden und in zusätzlichen Sichterweiterungen noch zusätzliche beigefügt werden. Es gilt jeweils der letzte (Basis zuerst, Erweiterung anschliessend), dessen Wert definiert ist. Mittels eines Faktors festgelegte Attribute sollen, falls sie nur innerhalb weiterer Faktoren von Bedeutung sind, vom Datentransfer ausgeschlossen werden können, sie sollen dann als transient bezeichnet werden.
Ein Attribut kann in Erweiterungen wie folgt übersteuert werden:
-
durch einen eingeschränkten Wertebereich.
-
durch eine Konstante aus dem verlangten Wertebereich. Eine solche Definition ist implizit final, d.h. sie kann nicht mehr weiter übersteuert werden.
-
durch einen Faktor, wenn der Typ des Ergebnisses als Erweiterung des Attributs zulässig wäre. Eine weitere Übersteuerung ist zulässig.
AttrTypeDef = ( 'MANDATORY' [ AttrType ] | AttrType | ( ( 'BAG' | 'LIST' ) [ Cardinality ] 'OF' AttrType ) ). AttrType = ( Type | DomainRef | ReferenceAttr | RestrictedStructureRef ). ReferenceAttr = 'REFERENCE' 'TO' Properties<EXTERNAL> RestrictedClassOrAssRef. RestrictedClassOrAssRef = ( ClassOrAssociationRef | 'ANYCLASS' ) [ 'RESTRICTION' '(' ClassOrAssociationRef { ';' ClassOrAssociationRef } ')' ]. ClassOrAssociationRef = ( ClassRef | AssociationRef ). RestrictedStructureRef = ( StructureRef | 'ANYSTRUCTURE' ) [ 'RESTRICTION' '(' StructureRef { ';' StructureRef } ')' ]. (1)
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) ist an dieser Stelle die Regel RestrictedClassOrStructureRef abgebildet. Diese wird in INTERLIS 2.4 nicht mehr verwendet und deshalb aus der Online-Version entfernt. Siehe dazu auch dieses Issue. |
Im Rahmen von Erweiterungen ist es zulässig, nur MANDATORY
anzugeben. Es gilt dann der bereits definierte Attributtyp. Es wird aber verlangt, dass der Wert immer definiert ist.
3.6.2. Attribute mit Wertebereichen als Typ
Als Typ eines Attributs kommen direkte Typendefinitionen (Regel Type) und die Verwendung bereits definierter Wertebereiche (Regel DomainRef) in Frage. Die verschiedenen Möglichkeiten sind im Kapitel 3.8, “Wertebereiche und Konstanten” aufgeführt.
3.6.3. Referenzattribute
Mit einem Referenzattribut kann der Verweis zu einem anderen Objekt geschaffen werden. Zusammenhänge zwischen eigenständigen Objekten sind mittels eigentlichen Beziehungen (vgl. Kapitel 3.7, “Eigentliche Beziehungen”) zu definieren.
Die Klassen, deren Objekte für den Bezug in Frage kommen, dürfen konkrete oder abstrakte Objekt- oder Beziehungsklassen, jedoch keine Strukturen sein (da diese keine eigenständigen Objekte sind). Dabei kommen alle konkreten Klassen in Frage, die der aufgeführten primären bzw. einer der aufgeführten einschränkenden (RESTRICTION TO
) Klassen entsprechen (Klasse selbst oder Unterklasse davon). Auf jeder Restriktionsstufe (Erstdefinition oder in Erweiterungsschritten) müssen jeweils alle noch zulässigen Klassen aufgeführt werden. Jede als Einschränkung definierte Klasse muss Unterklasse einer bisher zulässigen Klasse sein. Eine so in Frage kommende Klasse ist allerdings nur zulässig, wenn sie zum selben Thema wie das Referenzattribut oder zu einem Thema gehört, von denen das referenzierende Thema abhängig (DEPENDS ON
) ist. Soll die Referenz auf ein Objekt eines anderen Behälters des gleichen oder eines anderen (DEPENDS ON
vorausgesetzt) Themas verweisen dürfen, muss die Eigenschaft EXTERNAL
angegeben werden. In Erweiterungen kann diese Eigenschaft weggelassen und damit ausgeschlossen, nicht aber zugefügt werden. Es muss mindestens eine zulässige konkrete Unterklasse geben, wenn das Referenzattribut nicht als abstrakt deklariert ist.
3.6.4. Strukturattribute
Die Werte von Strukturattributen bestehen aus einem oder mehreren Strukturelementen (Instanzen von Strukturen; vgl. Kapitel 3.5.3, “Klassen und Strukturen”). Strukturelemente haben keine OID, existieren nur im Zusammenhang mit ihrem Hauptobjekt und sind auch nur über dieses auffindbar. Die zulässige Anzahl der Strukturelemente ergibt sich aus der angegebenen Kardinalität bzw. dem vorhandenen oder abwesenden Schlüsselwort MANDATORY
. Mit LIST kann man erreichen, dass die Strukturelemente in einer bestimmten Reihenfolge geführt werden. Diese Reihenfolge muss beim Transfer erhalten bleiben. Mit BAG
sind die Strukturelemente ungeordnet.
Strukturattribute dürfen mit konkreten oder abstrakten Typen (Strukturen, Wertebereiche, Referenzattribute; aber keine Klassen) definiert werden.
Bei Strukturen ergibt sich der Aufbau durch die angegebene Struktur (Regel RestrictedStructureRef). Für die konkreten Strukturelemente kommen grundsätzlich alle Strukturen (nicht aber Klassen) in Frage, die der primären und den einschränkend (RESTRICTION TO
) aufgeführten Strukturen entsprechen oder diese erweitern. Für die Strukturen des aktuellen Themas braucht es dafür keine weiteren Angaben. Strukturen anderer Themen werden nur berücksichtigt, wenn sie bzw. eine ebenfalls in diesem anderen Thema definierte Basisklasse als primäre oder einschränkende Struktur bei der Definition des Strukturattributes explizit aufgeführt ist. Auf jeder Restriktionsstufe (Erstdefinition oder in Erweiterungsschritten) müssen jeweils alle noch zulässigen Strukturen aufgeführt werden. Jede als Erweiterung definierte Struktur muss Erweiterung einer bisher zulässigen Struktur sein.
Ist die Struktur eines Strukturattributs beliebig (ANYSTRUCTURE
) oder findet sich keine konkrete Struktur, die der Definition genügt, muss das Strukturattribut als abstrakt deklariert werden, sofern es obligatorisch ist bzw. eine minimale Kardinalität grösser null hat. Werden Strukturen als formale Funktionsargumente definiert (Kapitel 3.14, “Funktionen”) kommen als aktuelle Argumente Pfade zu Strukturelementen oder zu Objekten in Frage. Insbesondere sind mit ANYSTRUCTURE
alle Strukturelemente und alle Objekte verträglich.
Eine geordnete Unterstruktur (LIST
) darf nicht durch eine ungeordnete (BAG
) erweitert werden. Für die Kardinalität gelten die gleichen Regeln wie bei Beziehungen (vgl. Kapitel 3.7.3, “Kardinalität”).
3.7. Eigentliche Beziehungen
3.7.1. Beschreibung von Beziehungen
Eigentliche Beziehungen (im Gegensatz zu Referenzattributen; vgl. Kapitel 3.6, “Attribute”) werden als eigenständige Konstrukte beschrieben. Sie haben aber weitgehend gleiche Eigenschaften wie Klassen. So können sie selbst lokale Attribute und Konsistenzbedingungen aufweisen. Der Assoziationsname darf auch fehlen. Er wird dann implizit aus der Zusammensetzung der Rollennamen (erster, dann zweiter, usw.) gebildet. Die wichtigste Eigenschaft einer Beziehung besteht jedoch in der Auflistung von mindestens zwei Rollen mit den zugeordneten Klassen oder Beziehungen (Regeln wie bei den Referenzattributen, vgl. Kapitel 3.6.3, “Referenzattribute”) und den Detaileigenschaften wie Stärke der Beziehung und Kardinalität. Die Rollennamen sollen typischerweise Substantive sein. Sie können, müssen aber nicht, mit den Namen der zugeordneten Klassen oder Beziehungen übereinstimmen. Die zu definierende Beziehung darf aber nicht Erweiterung einer so zugeordneten Beziehung sein. Einer Rolle können auch alternativ verschiedene Klassen oder Beziehungen zugeordnet sein. Eine solche alternative Klasse oder Beziehung darf keine Erweiterung einer anderen alternativen Klasse oder Beziehung derselben Rolle sein.
Beispiel einer Beziehung, zwischen der Klasse K einerseits und den Klassen K oder L andererseits:
ASSOCIATION A = K –- K; KL –- K OR L; END A;
Beziehungen können primär wie Klassen erweitert werden. Damit die Bedeutung der Beziehung klar und unveränderlich ist, dürfen in Erweiterungen keine zusätzlichen Rollen beigefügt werden. Die zugeordneten Klassen oder Beziehungen und die Kardinalität können aber eingeschränkt werden. Unveränderte Rollen müssen nicht aufgeführt werden.
Beispiel, wie die Beziehung A zu A1 spezialisiert wird, wo nur noch Bezüge zu K1 (einer Subklasse von K) einerseits und zu K, L1, L2 (Subklassen von L) andererseits zulässig sind:
ASSOCIATION A1 EXTENDS A = K (EXTENDED) –- K1; KL (EXTENDED) –- K OR L RESTRICTION (L1, L2); END A1;
Ein Objekt der Klasse K1 kann damit entweder über eine Beziehung A mit Objekten der Klassen K oder L (zulässig, da K1 eine Subklasse von K ist) oder über eine Beziehung A1 mit Objekten der Klassen K, L1 oder L2 verbunden sein. Möchte man zusätzlich erreichen, dass ein Objekt K1 in der Rolle K nur die spezialisierte Beziehung A1 (und nicht auch die allgemeine Beziehung A) eingehen kann, ist die Rolle K als verdeckend (HIDING
) zu kennzeichnen.
ASSOCIATION A1 EXTENDS A = K (EXTENDED, HIDING) –- K1; KL (EXTENDED) –- K OR L RESTRICTION (L1, L2); END A1;
Dies ist allerdings nur zulässig, wenn für K1 keine anderen aus A erweiterten Beziehungen definiert sind, bei denen die Rolle K nicht als verdeckend gekennzeichnet ist.
AssociationDef = 'ASSOCIATION' [ Association-Name ] Properties<ABSTRACT,EXTENDED,FINAL,OID> [ 'EXTENDS' AssociationRef ] [ 'DERIVED' 'FROM' RenamedViewableRef ] '=' [ ( 'OID' 'AS' OID-DomainRef | 'NO' 'OID' ) ';' ] { RoleDef } [ 'ATTRIBUTE' ] { AttributeDef } [ 'CARDINALITY' '=' Cardinality ';' ] { ConstraintDef } 'END' [ Association-Name ] ';'. AssociationRef = [ Model-Name '.' [ Topic-Name '.' ] ] Association-Name. RoleDef = Role-Name Properties<ABSTRACT,EXTENDED,FINAL,HIDING, ORDERED,EXTERNAL> ( '--' | '-<>' | '-<#>' ) [ Cardinality ] RestrictedClassOrAssRef { 'OR' RestrictedClassOrAssRef } [ ':=' Role-Factor ] ';'. Cardinality = '{' ( '*' | PosNumber [ '..' ( PosNumber | '*' ) ] ) '}'.
Eine Instanz einer Beziehung zwischen Objekten kann als eigenständiges Objekt (Beziehungsinstanz) betrachtet werden. Primär werden auf dieser Beziehungsinstanz für alle Rollen die Bezüge zu den Bezugsobjekten festgehalten (alle müssen definiert sein!). Ohne weitere Angabe wird die Beziehungsinstanz durch die Bezüge zu den Objekten, die sie verbindet, identifiziert. Zwischen diesen Objekten ist dann nur eine solche Beziehungsinstanz zulässig. Mehrere Beziehungsinstanzen zwischen derselben Objektkombination sind nur zulässig, wenn für die Beziehung explizit eine Kardinalität mit Obergrenze grösser eins verlangt wird (CARDINALITY
). In diesem Fall muss auch eine Objektidentifikation (mittels Property OID) verlangt werden. Wird eine eigene Objektidentifikation verlangt, kann die Beziehung auch selbst wieder in Rollen als Bezug verwendet werden.
Wird Kompatibilität mit INTERLIS 1 angestrebt, sollen nur Beziehungen mit zwei Rollen definiert werden, wobei die maximale Anzahl der Kardinalität einer Rolle nicht grösser als 1 sein darf.
Normalerweise müssen die konkreten Beziehungen zwischen Objekten mittels einer Anwendung explizit erstellt und dann durch das Bearbeitungssystem als Instanz festgehalten werden. Eine Beziehung kann aber auch aus einer Sicht abgeleitet werden, ohne dass sie instanziiert wird (DERIVED FROM
). Eine solche Beziehung kann eine Erweiterung einer abstrakten Beziehung sein. Sie kann nicht selbst abstrakt sein. Wird sie erweitert, muss die Erweiterung auf der gleichen Sicht oder einer Erweiterung davon aufbauen. Allen Rollen und Attributen müssen entsprechend Objektpfade oder Attributpfade der Sicht zugewiesen sein. Dabei muss ein Objektpfad (vgl. Kapitel 3.13, “Ausdrücke”) angegeben werden, der letztlich eine der Rolle entsprechende Klasse oder Assoziation bezeichnet. Die Kardinalität muss mit der Leistung der Sicht übereinstimmen. Dies kann aber nur zur Laufzeit geprüft werden.
Ein typischer Anwendungsfall dürfte die Herleitung einer Beziehung aus den geometrischen Verhältnissen sein: In einer Sicht (Verbindung), auf die in der Assoziation Bezug genommen wird, werden z.B. Gebäude auf Grund der Geometrie mit den Liegenschaften, auf denen sie stehen, in Beziehung gebracht (vgl. Kapitel 3.15, “Sichten”).
3.7.2. Stärke der Beziehung
In Anlehnung an UML werden verschiedene Beziehungsstärken unterschieden. Für ihre Erklärung wird vor allem beschrieben, welchen Einfluss die Beziehungsstärke beim Kopieren und Löschen von Objekten hat. Für INTERLIS 2 ist jedoch nur das Löschen von Objekten (als Folge der inkrementellen Nachlieferung) von Bedeutung. Darüber hinaus gibt es noch andere Überlegungen, die die Beziehungsstärke beeinflussen. Insbesondere ist es den Bearbeitungssystemen überlassen, feinere Beziehungsstärken oder gar andere Kriterien für das Verhalten bei bestimmten Operationen vorzusehen.
-
Assoziation: Die beteiligten Objekte sind lose miteinander verbunden. Wird ein beteiligtes Objekt kopiert, ist die Kopie mit denselben Objekten verbunden wie das Original. Wird ein beteiligtes Objekt gelöscht, wird die Beziehung ebenfalls gelöscht, das verbundene Objekt bleibt aber bestehen. Syntaktisch wird bei allen Rollen
'--'
angegeben. -
Aggregation: Es besteht eine schwache Beziehung zwischen einem Ganzen und seinen Teilen. Aggregationen sind nur in Beziehungen mit zwei Rollen erlaubt. Syntaktisch muss die Rolle, die zum Ganzen führt, mit einem Rhombus
'-<>'
angegeben sein. Die Rolle, die zum Teil führt, wird mit'--'
definiert. Eine Objektklasse kann in verschiedenen Aggregationen in der Teile-Rolle auftreten. Einem bestimmten Teile-Objekt können dann auch verschiedene Ganze-Objekte zugeordnet sein. Anders als bei Assoziationen werden als Folge der Erstellung einer Kopie des Ganzen auch entsprechende Kopien der Teile erstellt. Da im Rahmen von INTERLIS 2 das Kopieren von Objekten nicht von Bedeutung ist, behandelt INTERLIS 2 Aggregationen wie Assoziationen. -
Komposition: Es besteht eine starke Beziehung zwischen dem Ganzen und seinen Teilen. Eine Objektklasse darf in mehr als einer Komposition in der Teile-Rolle auftreten. Einem bestimmten Teile-Objekt darf aber höchstens ein Ganzes zugeordnet sein. Bei der Löschung des Ganzen werden auch seine Teile gelöscht. Bei der Rolle, die zum Ganzen führt, wird ein gefüllter Rhombus '-<#>' angegeben.
Assoziationen dürfen zu Aggregationen, diese zu Kompositionen erweitert werden, nicht aber umgekehrt.
3.7.3. Kardinalität
Die Kardinalität definiert die minimale und die maximale Anzahl erlaubter Objekte; steht nur ein Wert, ist das Minimum gleich dem Maximum. Steht als Maximum ein Stern anstatt einer Zahl, gibt es keine obere Schranke für die Anzahl der Unterobjekte. Die Kardinalitätsangabe {*}
ist äquivalent mit {0..*}
. Falls die Kardinalitätsangabe weggelassen wird, gilt normalerweise {0..*}
. Bei Kompositionsrollen ist nur {0..1}
oder {1}
zugelassen (ein Teil kann nur zu einem Ganzen gehören). Fehlt die Angabe gilt {0..1}
.
Die Kardinalität darf in Erweiterungen nur eingeschränkt, nicht jedoch erweitert werden. Wird also zunächst eine Kardinalität von {2..4}
angegeben, darf eine Erweiterung nicht {2..5}
, {7}
oder {*}
deklarieren. Das Weglassen der Kardinalitätsangabe wird bei erweiterten Attributen als Übernehmen des ererbten Wertes verstanden.
Je nach Verwendung hat die Kardinalität folgende Bedeutung:
-
Bei Unterstrukturen: Anzahl der zulässigen Elemente.
-
Bei Rollen von Beziehungen: Anzahl der einer Rolle entsprechenden Objekte, die einer beliebigen Kombination von Objekten, die den anderen Rollen entsprechen, über die Beziehung zugeordnet sein dürfen.
-
Bei der Beziehung als Ganzes: Anzahl der Beziehungsinstanzen für eine beliebige Kombination von Objekten gemäss allen Rollen der Beziehung.
3.7.4. Geordnete Beziehungen
Will man erreichen, dass die Beziehung aus der Sicht einer bestimmten Bezugsklasse in einer bestimmten Ordnung geführt wird, muss dies bei der Rolle als Eigenschaft (ORDERED
) verlangt werden. Diese Ordnung wird beim Etablieren der Beziehung definiert und muss bei Transfers erhalten bleiben.
3.7.5. Beziehungszugänge
Als Beziehungszugang (AssociationAccess) wird die Möglichkeit bezeichnet, aus der Sicht eines Objektes gemäss einer Beziehung zu den Beziehungsinstanzen und weiter zu den Bezugsobjekten zu navigieren. Beziehungszugänge müssen nicht definiert werden, sondern entstehen mit der Definition einer Beziehung für alle über Rollen zugeordneten Klassen, die im gleichen Thema wie die Beziehung definiert wurden. Ist eine an einer Beziehung beteiligte Klasse in einem anderen Thema definiert (themenübergreifende Beziehung) oder soll es zulässig sein, dass ein der Rolle entsprechendes Bezugsobjekt in einem anderen Behälter als die Beziehungsinstanz liegen darf, muss dies bei der Rolle speziell angemerkt werden (EXTERNAL
, vgl. Kapitel 3.7.1, “Beschreibung von Beziehungen” und Kapitel 3.6.3, “Referenzattribute”). Die Klasse erhält dann keine Beziehungszugänge. Diese Eigenschaft wird in der Basisdefinition einer Beziehung festgelegt und kann in einer Erweiterung nicht mehr verändert werden. Bezieht sich eine Rolle auf eine vom geerbten Thema geerbte Klasse, sind Beziehungszugänge aus dieser Klasse nur möglich, wenn diese Klasse im aktuellen Thema mit gleichem Namen erweitert wurde (EXTENDED
). Durch diese Einschränkungen wird vermieden, dass eine Klasse nachträglich (d.h. ausserhalb des Rahmens, in dem sie definiert wurde) nochmals eine Änderung erfährt.
Beziehungszugänge werden an die Subklassen vererbt, sofern dies nicht durch Verdeckungsforderung bei einer Rolle einer erweiternden Beziehung (HIDING
) ausgeschlossen wird.
Beziehungszugänge sind für Pfadbeschreibungen von Bedeutung (vgl. Kapitel 3.13, “Ausdrücke”).
3.8. Wertebereiche und Konstanten
Mit der Vorstellung eines Wertebereichs sind verschiedene Aspekte verbunden. Primär muss ein Datentyp festgelegt werden. Die INTERLIS-Datentypen sind unabhängig von der Implementation. Es wird deshalb z.B. nicht von Integer oder Real, sondern einfach von numerischen Datentypen gesprochen (vgl. Kapitel 3.8.5, “Numerische Datentypen”).
Werden numerische Attribute (inkl. Koordinaten, Linien), die nicht TRANSIENT (vgl. unten) sind, insbesondere im Rahmen von Ausdrücken verwendet, sind die Werte (unabhängig von der Speicherung im jeweiligen System) immer gemäss Wertebereichsdefinition zu runden. Damit das Rundungsverfahren nicht vorgeschrieben werden muss (z.B. kaufmännisch [0.5 immer aufrunden]), gelten Werte von funktional berechneten Attributen, die nicht TRANSIENT (vgl. unten) sind, als korrekt, wenn sie auf- oder abgerundet sind.
Ist der Datentyp festgelegt, sind – je nach Datentyp – noch weitere Präzisierungen nötig oder möglich. Ist eine Wertebereich-Definition noch unvollständig (fehlt z.B. bei einem numerischen Wertebereich noch die konkrete Bereichsdefinition), muss sie als abstrakt deklariert werden (Schlüsselwort ABSTRACT
, Regel Properties). Um insbesondere den Übergang von LV03- auf LV95-Koordinaten zu erleichtern, kann der Wertebereich von Koordinaten als generisch (Schlüsselwort GENERIC
, Regel Properties) definiert werden. Die verwendenden Wertebereiche (insbesondere Linien), Attribute, Klassen und Themen müssen deswegen nicht abstrakt definiert werden, obwohl der Koordinaten-Wertebereich erst in spezifischen Modellen oder sogar erst in den Transferdaten festgelegt wird (vgl. Kapitel 3.8.8, “Koordinaten”).
Wertebereiche können – wie andere Konstrukte – auch geerbt und dann erweitert werden, sofern sie nicht als FINAL
definiert wurden. Wichtig ist dabei der Grundsatz, dass eine erweiterte Definition immer mit der Basis-Definition kompatibel sein muss. Bei Wertebereichen sind Erweiterungen (Schlüsselwort EXTENDS
) somit eigentlich Präzisierungen bzw. Einschränkungen. Das Schlüsselwort EXTENDED
(Regel Property) ist nicht zulässig. Im Interesse der Lesbarkeit wird empfohlen, Definitionsteile von Basis-Wertebereichen (z.B. die Masseinheit) in der Erweiterung auch dann zu wiederholen, wenn sie unverändert sind.
DOMAIN Wert (ABSTRACT) = NUMERIC .. NUMERIC; !! abstrakter Wertebereich GenWert EXTENDS Wert = 10.0 .. 100.0; !! konkrete Erweiterung SpezWert EXTENDS GenWert = 20.0 .. 90.0; !! in Ordnung SpezWert EXTENDS GenWert = 0.0 .. 110.0; !! falsch, da unverträglich
Eine wichtige Frage bei der Definition von Wertebereichen ist, ob der Wert "Undefiniert" auch zum Wertebereich gehört oder nicht. Ohne weitere Angabe gehört er dazu. Es kann aber verlangt werden, dass er nicht dazu gehört, d.h. dass ein Attribut mit diesem Wertebereich immer definiert sein muss (Schlüsselwort MANDATORY
). MANDATORY
allein ist nur bei Erweiterungen zulässig.
Bei der Definition eines Attributs einer Klasse oder Struktur (und nur dort) darf auch dann MANDATORY
stehen, wenn der Wertebereich als FINAL
deklariert wurde und somit eigentlich nicht weiter eingeschränkt werden dürfte.
Mit dem Schlüsselwort CONSTRAINTS
kann die Wertebereichsdefinition um eine oder mehrere Einschränkungen ergänzt werden, um z.B. bei einem Textwertebereich nur bestimmte Zeichenfolgenmuster zuzulassen. Werden mehrere Einschränkungen gemacht, gelten alle. Jede Einschränkung hat innerhalb der Wertebereichsdefinition einen eindeutigen Namen.
DomainDef = 'DOMAIN' { Domain-Name Properties<ABSTRACT,GENERIC,FINAL> [ 'EXTENDS' DomainRef ] '=' ( 'MANDATORY' [ Type ] | Type ) [ 'CONSTRAINTS' Constraints-Name ':' Logical-Expression { ',' Constraints-Name ':' Logical-Expression } ] ';' }. Type = ( BaseType | LineType ). DomainRef = [ Model-Name '.' [ Topic-Name '.' ] ] Domain-Name. BaseType = ( TextType | EnumerationType | EnumTreeValueType | AlignmentType | BooleanType | NumericType | FormattedType | DateTimeType | CoordinateType | OIDType | BlackboxType | ClassType | AttributePathType ).
In Vergleichsoperationen (vgl. Kapitel 3.13, “Ausdrücke”) können Attributwerte auch mit Konstanten verglichen werden. Diese sind wie folgt definiert:
Constant = ( 'UNDEFINED' | NumericConst | TextConst | FormattedConst | EnumerationConst | ClassConst | AttributePathConst ).
Die typenspezifischen Konstanten sind bei den einzelnen Datentypen definiert.
3.8.1. Zeichenketten
Eine Zeichenkette ist eine Folge von Zeichen mit einer maximalen Länge. Der Zeichenvorrat muss klar definiert sein (vgl. Anhang D Zeichentabelle).
Im Datentyp MTEXT
sind die Zeichen «Carriage Return» (Wagenrücklauf) (#xD), «Line Feed» (Zeilenvorschub) (#xA) und «Tabulatorzeichen» (#x9), im Gegensatz zum Wertebereich des Datentyps TEXT
, enthalten.
Beim Datentyp Zeichenkette (TEXT
) ist primär die Länge der Zeichenkette von Interesse. Je nach der Form der Definition wird sie explizit oder implizit angegeben. Bei der expliziten Form (TEXT * …
) wird die maximale Länge in Anzahl Zeichen festgelegt (grösser Null). Werden nur die Schlüsselwörter TEXT
oder MTEXT
angegeben, ist die Anzahl Zeichen unbeschränkt. Im Rahmen einer Erweiterung kann die Länge verkürzt werden (eine Verlängerung würde zu einem Wertebereich führen, der mit dem Basis-Wertebereich nicht mehr verträglich ist).
Die INTERLIS-Zeichenkettenlänge bezeichnet die Zahl der Zeichen, wie sie von Benutzern wahrgenommen wird, nicht aber die Zahl der Speicherstellen, die ein System maximal zur Repräsentation einer Zeichenkette benötigt. Zeichenketten der Länge null gelten als undefiniert.
Bemerkung: Im Zusammenhang mit INTERLIS ist die Länge einer Zeichenkette als Anzahl jener Zeichen definiert, welche gemäss Unicode-Standard die kanonische Kombinationsklasse Nr. 0 besitzen, nachdem die Zeichenkette in die kanonisch dekomponierte Form von Unicode gebracht wurde (siehe https://www.unicode.org/unicode/reports/tr15/). So besitzt etwa eine Zeichenkette, die aus der Kette <LATIN CAPITAL LETTER C WITH CIRCUMFLEX><COMBINING CEDILLA> besteht, ebenso die Länge 1 wie die äquivalente Zeichenkette <LATIN CAPITAL LETTER C>< COMBINING CIRCUMFLEX ACCENT><COMBINING CEDILLA>. Gemäss der obigen Definition besitzen Ligaturen für «fl» oder «ffi» die Länge 1. Es wird aber davon abgeraten, solche Darstellungsformen überhaupt für Zeichenkettenattribute zu verwenden.
Der Namen-Zeichenkettentyp (Schlüsselwort NAME
) definiert einen Wertebereich, der genau demjenigen der INTERLIS-Namen entspricht (vgl. Kapitel 3.2.2, “Namen”). Er wird in der vordefinierten Klasse METAOBJECT
(siehe vordefiniertes Basismodell INTERLIS) und damit vor allem in den Klassen für Referenzsysteme sowie Signaturen eingesetzt (vgl. Kapitel 3.10.3, “Referenzsysteme” und Kapitel 3.16, “Darstellungsbeschreibungen”), weil dort Datenattribute mit Beschreibungselementen von Modellen übereinstimmen müssen.
Als weiterer Zeichenkettentyp wird der URI (Uniform Resource Identifier) geführt, z.B. http-, ftp- oder mailto-Adressen (s. Abschnitt 1.2 im Internet-Standard IETF RFC 2396 in https://www.w3.org). Die Länge eines URI ist in INTERLIS auf 1023 Zeichen beschränkt. Er entspricht damit folgender Definition:
DOMAIN URI (FINAL) = TEXT*1023; !! ACHTUNG: gemäss IETF RFC 2396 NAME (FINAL) = TEXT*255; !! ACHTUNG: gemäss Kapitel 2.2.2 Namen
TextType = ( 'MTEXT' [ '*' MaxLength-PosNumber ] | 'TEXT' [ '*' MaxLength-PosNumber ] | 'NAME' | 'URI' ). TextConst = String.
3.8.2. Aufzählungen
Mit einer Aufzählung werden die für diesen Typ zulässigen Werte festgelegt. Die Aufzählung ist jedoch nicht einfach linear, sondern im Sinne eines Baumes strukturiert. Die Blätter des Baumes (nicht aber die Knoten) bilden die Menge der zulässigen Werte.
DOMAIN Farben = (rot (dunkelrot, orange, karmin), gelb, gruen (hellgruen, dunkelgruen));
ergibt die folgenden - mittels Konstanten beschriebenen - zulässigen Werte:
#rot.dunkelrot #rot.orange #rot.karmin #gelb #gruen.hellgruen #gruen.dunkelgruen
Eine Schachtelung wird in runden Klammern angegeben. Die Elementnamen jeder Schachtelung müssen eindeutig sein. Die Schachtelungstiefe ist frei wählbar.
Ist eine Aufzählung geordnet (Schlüsselwort ORDERED
), ist eine Reihenfolge der Elemente definiert. Ist die Aufzählung zirkulär (Schlüsselwort CIRCULAR
), ist die Reihenfolge der Elemente definiert, wie wenn die Aufzählung geordnet wäre. Zudem wird ausgesagt, dass nach dem letzten Element wieder das erste folgt.
Nebst der eigentlichen Aufzählungsdefinition ist es auch möglich, einen Wertebereich zu definieren, der als zulässige Werte alle Blätter und Knoten einer Aufzählungsdefinition umfasst (ALL
). Einem solchen Attribut kann darum auch der Wert eines Attributs, der zu Grunde liegenden Aufzählungsdefinition zugewiesen werden.
DOMAIN Lage = (unten, mitte, oben) ORDERED; Wochentage = (Werktage (Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag), Sonntag) CIRCULAR; WochentagsWerte = ALL OF Wochentage;
EnumerationType = Enumeration [ 'ORDERED' | 'CIRCULAR' ]. EnumTreeValueType = 'ALL' 'OF' Enumeration-DomainRef. Enumeration = '(' EnumElement { ',' EnumElement } [ ':' 'FINAL' ] | 'FINAL' ')'. EnumElement = EnumElement-Name { '.' EnumElement-Name } [Sub-Enumeration]. EnumerationConst = '#' ( EnumElement-Name { '.' EnumElement-Name } [ '.' 'OTHERS' ] | 'OTHERS' ).
Im Rahmen von Neudefinitionen von Aufzählungen (Primärdefinition, zusätzliche Elemente einer Erweiterung) darf das EnumElement nur aus einem Namen bestehen. Mehrere Namen sind nur zulässig, um für eine Erweiterung ein bisheriges Aufzählungselement zu identifizieren.
Aufzählungen können einerseits erweitert werden, indem für Blätter (also Aufzählungselemente, die keine Unter-Aufzählung aufweisen) der bisherigen Aufzählung Unter-Aufzählungen definiert werden. In der erweiterten Definition werden aus bisherigen Blättern neu Knoten, für die keine Werte definiert werden dürfen.
Andererseits kann jede einzelne Teilaufzählung in Erweiterungen durch weitere Elemente (Knoten oder Blätter) ergänzt werden. Die Basisaufzählungen umfassen dadurch nebst den genannten Elementen immer auch noch potenziell weitere Elemente, die erst in Erweiterungen definiert werden. Solche potenziellen Werte können auf der Basisstufe in Ausdrücken, Funktionsargumenten und Signaturzuweisungen (vgl. Kapitel 3.13, “Ausdrücke”, Kapitel 3.14, “Funktionen” und Kapitel 3.16, “Darstellungsbeschreibungen”) mit dem Wert OTHERS
angesprochen werden. OTHERS
ist jedoch kein zulässiger Wert im Rahmen der Klasse, zu der das Objekt gehört. Die Möglichkeit, in Erweiterungen zusätzliche Aufzählelemente anfügen zu können, kann unterbunden werden, indem die Teilaufzählung als abschliessend erklärt wird (FINAL
). Dies erfolgt entweder nach dem letzten aufgeführten Element oder im Rahmen einer Erweiterung auch ohne dass neue Elemente angefügt werden.
Zirkuläre Aufzählungen (Schlüsselwort CIRCULAR) können nicht erweitert werden.
DOMAIN Farbe = (rot, gelb, gruen); FarbePlus EXTENDS Farbe = (rot (dunkelrot, orange, karmin), gruen (hellgruen, dunkelgruen: FINAL), blau); FarbePlusPlus EXTENDS FarbePlus = (rot (FINAL), blau (hellblau, dunkelblau));
ergibt für FarbePlus die folgenden - mittels Konstanten beschriebenen - zulässigen Werte:
#rot.dunkelrot #rot.orange #rot.karmin #gelb #gruen.hellgruen #gruen.dunkelgruen #blau
und für FarbePlusPlus:
#blau.hellblau #blau.dunkelblau statt #blau (1)
1 | Die Richtigkeit dieser Zeile ist umstritten. Siehe dazu auch dieses Issue. |
Durch die Angabe von FINAL
bei den Grünstufen von FarbePlus ist es in FarbePlusPlus nicht zulässig weitere Grünstufen zu definieren. Mit der Angabe von FINAL
für die Unterteilung von Rot in FarbePlusPlus wird verhindert, dass in möglichen Erweiterungen von FarbePlusPlus noch weitere Rotvarianten angefügt werden können.
3.8.3. Textausrichtungen
Für die Aufbereitung von Plänen und Karten müssen die Positionen von Texten festgehalten werden. Dabei muss festgelegt werden, welcher Stelle des Textes die Position entspricht. Mit dem horizontalen Alignment wird festgelegt, ob die Position auf dem linken oder rechten Rand des Textes oder in der Textmitte liegt. Das vertikale Alignment legt die Position in Richtung der Texthöhe fest.
Der Abstand Cap-Base entspricht der Höhe der Grossbuchstaben. Unterlängen befinden sich im Bereich von Base-Bottom.
HALIGNMENT
) und vertikal (VALIGNMENT
).Horizontales und vertikales Alignment können als folgende vordefinierte Aufzählung verstanden werden:
DOMAIN HALIGNMENT (FINAL) = (Left, Center, Right) ORDERED; VALIGNMENT (FINAL) = (Top, Cap, Half, Base, Bottom) ORDERED;
AlignmentType = ( 'HALIGNMENT' | 'VALIGNMENT' ).
3.8.4. Boolean
Der Typ Boolean weist die Werte false und true auf. Er kann als folgende vordefinierte Aufzählung verstanden werden:
DOMAIN BOOLEAN (FINAL) = (false, true) ORDERED;
BooleanType = 'BOOLEAN'.
3.8.5. Numerische Datentypen
Die wichtigste Angabe bei numerischen Datentypen ist der Minimal- und der Maximal-Wert inklusive Stellenzahl (Nachkommastellen) sowie der Skalierungsfaktor. Zusätzlich kann angegeben werden, dass der Typ zirkulär ist (Schlüsselwort CIRCULAR
), d.h. dass der in der letzten signifikanten Stelle um 1 erhöhte Maximalwert und der Minimalwert sachlich die gleiche Bedeutung haben (z.B. bei Winkeln 0 .. 359 Grad). Ist das Attribut als eine kontinuierliche Unterteilung des Vorgängerattributs definiert (vgl. Kapitel 3.6.1, “Allgemeine Aussagen zu Attributen”), muss der Typ als zirkulär definiert sein. Fehlt die Angabe des Minimal- und Maximal-Wertes (Schlüsselwort NUMERIC
), gilt der Wertebereich als abstrakt.
DOMAIN Winkel1 = 0.00 .. 359.99 CIRCULAR [degree]; !! richtig Winkel2 = 0.00 .. 360.00 CIRCULAR [degree]; !! syntaktisch zwar richtig, !! sachlich aber falsch, da damit !! 360.01 dem Minimalwert 0.00 !! entspricht
Die Stellenzahl muss beim Minimal- und beim Maximal-Wert übereinstimmen. Mit Hilfe der Skalierung können Float-Zahlen beschrieben werden, aber dann sind sowohl der Minimal- als auch der Maximal-Wert in Mantissendarstellung anzugeben, d.h. beginnend mit Null (0) und gefolgt vom Dezimalpunkt (.) muss die erste Ziffer nach dem Dezimalpunkt von Null (0) verschieden sein. Die Skalierung des Minimalwertes muss kleiner sein als die Skalierung des Maximalwertes. Die Schreibweise von Minimal- und Maximalwert bedeutet aber keineswegs eine Anweisung, wie die Werte transferiert werden sollen (ist ein Wertebereich mit 000 .. 999 definiert, bedeutet das nicht, dass der Wert 7 als 007 transferiert wird). Eine Ausnahme von dieser Regel bilden die Float-Zahlen. Diese sind in Mantissendarstellung und mit Skalierung zu transferieren.
Bei Erweiterungen dürfen die Maximal- bzw. Minimalwerte nur eingeschränkt werden. Der numerische Bereich wird damit also kleiner. Die Genauigkeit (Stellenzahl) darf nicht verändert werden.
DOMAIN Normal = 0.00 .. 7.99; Genau EXTENDS Normal = 0.0000 .. 7.9949; !! falsch, da Stellenzahl grösser Eingeschraenkt EXTENDS Normal = 1.00 .. 6.99; !! richtig
Um die Bedeutung des Wertes genauer zu erklären kann eine Masseinheit angegeben werden (vgl. Kapitel 3.9, “Einheiten”). Abstrakte Masseinheiten sind nur zulässig, solange der Wertebereich selbst noch undefiniert ist (Schlüsselwort NUMERIC
).
Für Erweiterungen gelten folgende Regeln:
-
Weist ein konkreter Basis-Wertebereich keine Masseinheit auf, darf auch in Erweiterungen des Basis-Wertebereichs keine angegeben werden.
-
Verwendet der Basis-Wertebereich eine abstrakte Masseinheit, dürfen in Erweiterungen des Basis-Wertebereichs nur Masseinheiten verwendet werden, die Erweiterungen der Masseinheit sind.
-
Verwendet der Basis-Wertebereich eine konkrete Masseinheit, kann sie in Erweiterungen nicht übersteuert werden.
UNIT foot [ft] = 0.3048 [m]; DOMAIN Distanz (ABSTRACT) = NUMERIC [Length]; MeterDist (ABSTRACT) EXTENDS Distanz = NUMERIC [m]; FussDist (ABSTRACT) EXTENDS Distanz = NUMERIC [ft]; KurzeMeter EXTENDS MeterDist = 0.00 .. 100.00 [m]; KurzeFuesse EXTENDS FussDist = 0.00 .. 100.00 [ft]; KurzeFuesse2 (ABSTRACT) EXTENDS KurzeMeter = NUMERIC [ft]; !! falsch: m vs. ft
Einem numerischen Wertebereich kann auch ein Skalarsystem zugeordnet werden (vgl. Kapitel 3.10.3, “Referenzsysteme”). Damit beziehen sich die Werte auf den durch das Skalarsystem bestimmten Nullpunkt. Es sind also absolute Werte in diesem Skalarsystem. Ist in der Klasse des Skalarsystems die Einheit nicht ANYUNIT
, muss beim numerischen Datentyp eine Einheit angegeben werden, die mit jener des Referenzsystems verträglich ist. Bezieht man sich auf ein Koordinatensystem, kann die Achse angegeben werden, auf die sich die Werte beziehen. Die Einheit muss mit jener der entsprechenden Achse verträglich sein. Fehlt diese Angabe, ist der Bezug nicht genauer definiert, sondern ergibt sich aus dem Fachgebiet (z.B. bezieht man sich bei einer Höhe auf ein Ellipsoid, meint man ellipsoidische Höhen). Bezieht man sich auf einen anderen Wertebereich, soll das gleiche Referenzsystem gelten wie bei diesem Wertebereich. In diesem Fall darf die Angabe der Achse nur fehlen, wenn es sich um einen numerischen Wertebereich handelt. Bei einem Koordinatenwertebereich ist die Achsenangabe obligatorisch. Die Angabe des Referenzsystems kann in Erweiterungen nicht mehr geändert werden.
Stellt der numerische Wert einen Winkel dar, kann sein Richtungssinn festgelegt werden. Im Falle von Richtungen kann angegeben werden, auf welches Koordinatensystem (definiert durch einen Koordinaten-Wertebereich) sich die Richtung bezieht. Damit ist bekannt, wie die Nullrichtung (Azimut) und der Drehsinn definiert sind (vgl. Kapitel 3.8.8, “Koordinaten”). Diese Angabe kann in Erweiterungen nicht mehr geändert werden.
Als numerische Konstanten sind nebst den Dezimalzahlen auch die Zahlen Pi (Schlüsselwort PI
) und e – Basis des natürlichen Logarithmus – (Schlüsselwort LNBASE
) definiert.
NumericType = ( Min-Dec '..' Max-Dec | 'NUMERIC' ) [ 'CIRCULAR' ] [ '[' UnitRef ']' ] [ 'CLOCKWISE' | 'COUNTERCLOCKWISE' | RefSys ]. RefSys = ( '{' RefSys-MetaObjectRef [ '[' Axis-PosNumber ']' ] '}' | '<' Coord-DomainRef [ '[' Axis-PosNumber ']' ] '>' ). DecConst = ( Dec | 'PI' | 'LNBASE' ). NumericConst = DecConst [ '[' UnitRef ']' ].
3.8.6. Formatierte Wertebereiche
Formatierte Wertebereiche basieren auf Strukturen und verwenden deren numerische oder formatierte Attribute in einem Format. Dieses Format dient einerseits dem Datenaustausch (vgl. 3.3.11.5 Codierung von formatierten Wertebereichen), andererseits der Definition von unterer und oberer Grenze des Wertebereichs.
FormattedType = ( 'FORMAT' ( 'BASED' 'ON' StructureRef FormatDef [ Min-String '..' Max-String ] | FormattedType-DomainRef Min-String '..' Max-String ) ) | Min-String '..' Max-String. FormatDef = '(' [ 'INHERITANCE' ] [ NonNum-String ] { BaseAttrRef NonNum-String } BaseAttrRef [ NonNum-String ] ')'. BaseAttrRef = ( NumericAttribute-Name [ '/' IntPos-PosNumber ] | StructureAttribute-Name '/' Formatted-DomainRef ). FormattedConst = String.
Eine Basisdefinition eines formatierten Wertebereichs definiert primär die Struktur, auf welcher er aufbaut und das Format das zur Anwendung kommt. Zusätzlich können die untere und obere Grenze des Wertebereichs definiert werden. Sie dürfen die mit der Struktur definierten Grenzen nicht ausweiten.
Im Rahmen einer Erweiterung kann auf eine Erweiterung der ursprünglichen Struktur Bezug genommen, das Format ergänzt (der geerbte Teil muss am Anfang stehen und im Interesse von Klarheit mittels des Schlüsselwortes INHERITANCE
erwähnt werden) und der Wertebereich eingeschränkt werden.
In der Formatdefinition können einerseits konstante Strings, die nicht mit einer Ziffer beginnen (am Anfang, am Ende und zwischen den einzelnen Attributreferenzen) und andererseits direkte oder indirekte Attributreferenzen (über Strukturattribute) enthalten sein. Die Attributreferenz muss entweder ein numerisches Attribut oder ein Strukturattribut bezeichnen. Im Falle eines numerischen Attributes können Vorkommastellen festgelegt werden. Als Folge ergeben sich nötigenfalls führende Nullen. Die Nachkommastellen ergeben sich aus dem numerischen Wertebereich. Bei Strukturattributen muss definiert werden, gemäss welchem formatierten Wertebereich es formatiert werden soll. Die Struktur muss mit der Basisstruktur des Wertebereichs übereinstimmen oder eine Erweiterung davon sein.
3.8.7. Datum und Zeit
Wo Datums- oder Zeitangaben nicht nur aus einem einzigen Wert (z.B. Jahr, Sekunde) bestehen, werden üblicherweise formatierte Wertebereiche verwendet.
DateTimeType = ( 'DATE' | 'TIMEOFDAY' | 'DATETIME' ).
Die Wertebereiche für DATE
, TIMEOFDAY
bzw. DATETIME
entsprechen den im Folgenden definierten INTERLIS.XMLDate
, INTERLIS.XMLTime
bzw. INTERLIS.XMLDateTime
.
Im Interesse der Kompatibilität mit XML werden entsprechende Elemente durch INTERLIS vordefiniert:
UNIT Minute [min] = 60 [INTERLIS.s]; Hour [h] = 60 [min]; Day [d] = 24 [h]; Month [M] EXTENDS INTERLIS.TIME; Year [Y] EXTENDS INTERLIS.TIME; REFSYSTEM BASKET BaseTimeSystems ~ TIMESYSTEMS OBJECTS OF CALENDAR: GregorianCalendar OBJECTS OF TIMEOFDAYSYS: UTC; STRUCTURE TimeOfDay (ABSTRACT) = Hours: 0 .. 23 CIRCULAR [h]; CONTINUOUS SUBDIVISION Minutes: 0 .. 59 CIRCULAR [min]; CONTINUOUS SUBDIVISION Seconds: 0.000 .. 59.999 CIRCULAR [INTERLIS.s]; END TimeOfDay; STRUCTURE UTC EXTENDS TimeOfDay = Hours(EXTENDED): 0 .. 23 {UTC}; END UTC; DOMAIN GregorianYear = 1582 .. 2999 [Y] {GregorianCalendar}; STRUCTURE GregorianDate = Year: GregorianYear; SUBDIVISION Month: 1 .. 12 [M]; SUBDIVISION Day: 1 .. 31 [d]; END GregorianDate; STRUCTURE GregorianDateTime EXTENDS GregorianDate = SUBDIVISION Hours: 0 .. 23 CIRCULAR [h] {UTC}; CONTINUOUS SUBDIVISION Minutes: 0 .. 59 CIRCULAR [min]; CONTINUOUS SUBDIVISION Seconds: 0.000 .. 59.999 CIRCULAR [INTERLIS.s]; END GregorianDate; DOMAIN XMLDate = FORMAT BASED ON GregorianDate ( Year/4 "-" Month/2 "-" Day/2 ); DOMAIN XMLTime = FORMAT BASED ON UTC ( Hours/2 ":" Minutes/2 ":" Seconds/2 ); DOMAIN XMLDateTime EXTENDS XMLDate = FORMAT BASED ON GregorianDateTime ( INHERITANCE "T" Hours/2 ":" Minutes/2 ":" Seconds/2 );
CLASS Projekt = Start: FORMAT INTERLIS.XMLDateTime "2000-01-01T00:00:00.000" .. "2005-12-31T23:59:59.999"; Ende: FORMAT INTERLIS.XMLDateTime "2002-01-01T00:00:00.000" .. "2007-12-31T23:59:59.999"; END Projekt;
3.8.8. Koordinaten
Koordinaten können ein-, zwei- oder dreidimensional definiert werden und sind entsprechend eine Einzelzahl, ein Zahlenpaar oder ein Zahlentripel. Es ist zulässig, dass die zweite oder dritte Dimension erst in einer Erweiterung beigefügt wird. Für jede Dimension muss der numerische Wertebereich sowie allenfalls eine Masseinheit und ein Koordinatensystem (inkl. Achsnummern) angegeben werden. Es gelten die gleichen Regeln wie bei den numerischen Datentypen. Es können nur konkrete Masseinheiten angegeben werden. Wird kein Referenzsystem angegeben und sind die Masseinheiten entweder nicht oder als Längeneinheit definiert, darf ein Programmsystem, das das Modell implementiert, davon ausgehen, dass es sich um kartesische Koordinaten handelt.
Wird eine Rotationsangabe gemacht (Schlüsselwort ROTATION
) kann im Rahmen von Richtungsdefinitionen (vgl. Kapitel 3.8.5, “Numerische Datentypen”) auf ein solches Koordinaten-Referenzsystem verwiesen werden. Die Rotationsdefinition legt fest, welche Achse des Koordinaten-Wertebereichs der Nullrichtung und welche der Richtung eines positiven, rechten Winkels entsprechen. Sie darf auch in einer konkreten Koordinatendefinition fehlen und dann allenfalls in einer Erweiterung beigefügt werden.
Die Angaben betreffend Achsbezug und Rotation können in Erweiterungen nicht geändert werden.
DOMAIN CHKoord = COORD 480000.00 .. 850000.00 [m] {CHLV03[1]}, 60000.00 .. 320000.00 [m] {CHLV03[2]}, ROTATION 2 -> 1 REFSYS "EPSG:21781";
Bei den zwei definierten Achsen wird nebst dem zulässigen Bereich angegeben, auf welche Einheiten und welches Referenzsystem samt Achsennummer sich die Koordinaten beziehen. Die eigentlichen Achsen sind beim Referenzsystem definiert. Die Rotationsdefinition legt fest, dass die Nullrichtung von der zweiten zur ersten Achse führt, beim Schweizerischen System, wo der erste Wert der Ostwert, der zweite der Nordwert ist, zeigt die Nullrichtung nach Norden und dreht im Uhrzeigersinn.
DOMAIN WGS84Koord = COORD –90.00000 .. 90.00000 [Units.Angle_Degree] {WGS84[1]}, 0.00000 .. 359.99999 CIRCULAR [Units.Angle_Degree] {WGS84[2]}, -1000.00 .. 9000.00 [m] {WGS84Alt[1]};
Geografische Koordinaten sind typischerweise in Grad dargestellt und beziehen sich auf ein ellipsoidisches Koordinatensystem (z.B. CH1903). Die Höhe andererseits ist in Meter beschrieben. Sie bezieht sich auf ein spezielles Ellipsoid-Höhen-System mit einer Achse.
CoordinateType = ( 'COORD' | 'MULTICOORD' ) NumericType [ ',' NumericType [ ',' NumericType ] [ ',' RotationDef ] [ 'REFSYS' Name-String ] ]. RotationDef = 'ROTATION' NullAxis-PosNumber '->' PiHalfAxis-PosNumber.
Mit der optionalen Angabe REFSYS kann der EPSG-Code[5] des Referenzsystems gemäss dem Muster EPSG:PosNumber festgelegt werden.
Mit dem Schlüsselwort MULTICOORD
statt COORD
wird als Wertebereich eine ungeordnete Menge von Koordinaten definiert. Im Unterschied zu einer Formulierung mit LIST/BAG
haben die einzelnen Werte aber zwingend dasselbe Referenzsystem.
Sind die Definitionen unvollständig, muss der Wertebereich entweder als abstrakt (Property ABSTRACT
) oder als generisch (Property GENERIC
) deklariert werden.
Bei abstrakten Koordinatenbereichen kann selbst die Anzahl Dimensionen offen bleiben. Abstrakte Wertebereiche können nur in Attributen verwendet werden, die als abstrakt deklariert sind. Abstrakte Koordinatenbereiche können dann auf verschiedene Arten konkretisiert werden.
Bei generischen Koordinatenbereichen muss die Anzahl der Dimensionen festgelegt sein. Es ist aber zulässig, dass dabei nur die Angabe NUMERIC
gemacht wird. Generische Wertebereiche können auch in Attributen verwendet werden, die nicht als abstrakt deklariert sind. Generische Koordinaten-Wertebereiche können gleich wie abstrakte konkretisiert werden. Dabei werden insbesondere die numerischen Wertebereiche der Achsen und das Referenzsystem (Concrete-DomainRef) festgelegt bzw. eingeschränkt.
DOMAIN Coord2 (GENERIC) = COORD NUMERIC, NUMERIC; CLASS Punkt = Pos: Coord2; END Punkt;
Das Thema (TOPIC
), zu dem eine solche Definition gehört, muss aber als abstrakt deklariert werden, sofern keine Kontextdefinition wirkt.
Mit einer Kontextdefinition können für einen generischen Koordinaten-Wertebereich (Generic-CoordDef-DomainRef) konkrete Koordinaten-Wertebereiche definiert werden. Wurde für einen generischen Koordinaten-Wertebereich nicht nur ein einzelner, sondern eine Auswahl von möglichen konkreten Koordinaten-Wertebereichen festgelegt, wird beim Transfer des einzelnen Behälters, der für diesen Behälter geltende Wertebereich festgehalten (vgl. Kapitel 4.3.6, “Codierung von Themen”). Die Tatsache, dass die Festlegung aufgeschoben ist, muss beim Thema angemerkt werden (vgl. Kapitel 3.5.2, “Themen”). Der letztlich gültige konkrete Koordinaten-Wertebereich gilt bei allen Verwendungen des generischen Koordinaten-Wertebereichs und bei allen Verwendungen von Linien-Wertebereichen, die auf dem generischen Koordinaten-Wertebereich basieren.
ContextDef = 'CONTEXT' { Context-Name '=' { GenericCoordDef-DomainRef '=' Concrete-DomainRef { 'OR' Concrete-DomainRef } ';' } }.
Der Name des Kontexts ist ohne Bedeutung muss aber nach den allgemeinen Regeln eindeutig sein und dient z.B. für allfällige Fehlermeldungen. Ein Kontext wirkt in dem Modell wo er definiert wird und in allen Modellen, welche das definierende Modell direkt oder indirekt importieren.
CONTEXT default = MyModel.Coord2 = GeometryCHLV03.Coord2 OR GeometryCHLV95.Coord2;
Wirkt für einen bestimmten generischen Koordinaten-Wertebereich bereits eine Kontextdefinition, kann mit einer neuen Kontextdefinition für denselben generischen Koordinaten-Wertebereich eine neue Festlegung für den konkreten Wertebereich gemacht werden. Diese neuen Wertebereiche müssen aber Spezialisierungen der bestehenden Festlegungen sein.
DOMAIN Coord2Special EXTENDS GeometryCHLV03.Coord2 = COORD … ; CONTEXT default = MyModel.Coord2 = Coord2Special;
3.8.9. Wertebereiche von Objektidentifikationen
Identifizierbare Objekte werden immer mit einer Objektidentifikation versehen. Damit für die Systeme klar ist, welcher Speicherplatz dafür vorgesehen werden muss und wie die Objektidentifikationen erzeugt werden müssen, können entsprechende Wertebereiche definiert und diese den Themen bzw. Klassen (vgl. Kapitel 3.5.2, “Themen” und Kapitel 3.5.3, “Klassen und Strukturen”) zugeordnet werden. Für die Verwaltung von Objektidentifikationen, insbesondere auch von Behältern, macht es aber Sinn, gewöhnliche Attribute mit solchen Wertebereichen zu führen.
OIDType = 'OID' ( 'ANY' | NumericType | TextType ).
INTERLIS 2 selbst definiert die folgenden OID-Wertebereiche (vgl. Anhang A Das interne INTERLIS-Datenmodell):
DOMAIN NOOID = OID ANY; !! beliebiger, nicht stabiler !! Identifikator ANYOID (ABSTRACT) EXTENDS NOOID = OID ANY; I32OID EXTENDS ANYOID = OID 0 .. 2147483647; !! positive, 4 Bytes Integerwerte STANDARDOID EXTENDS ANYOID = OID TEXT*16; !! gemäss Anhang F (nur Ziffern !! und Buchstaben erlaubt) UUIDOID EXTENDS ANYOID = OID TEXT*36; !! gemäss ISO 11578
Es ist nicht möglich, eine OID-Definition zu erweitern, ausser dass ein NOOID
durch ANYOID
, und ANYOID
zu einer konkreten Definition (nicht OID ANY
) erweitert werden kann.
Wird ANYOID
für abstrakte Themen bzw. Klassen angewendet, wird verlangt, dass eine Objektidentifikation erwartet wird, die genaue Definition aber noch offen ist. Sonst kann ANYOID
nur als Wertebereich von Attributen verwendet werden. Zum Attributwert gehört dann nicht nur die eigentliche OID
, sondern auch der konkrete OID-Wertebereich. OID-Werte von textlichen OID-Wertebereichen müssen die XML-ID Regel in Kapitel 4.3.1, “Einleitung” erfüllen: erstes Zeichen muss ein Buchstabe, eine Ziffer oder ein Unterstrich sein, dann folgen Buchstaben, Ziffern, Punkte, Minuszeichen, Unterstriche; keine Doppelpunkte (!).
3.8.10. Gefässe
Durch Einsatz dieses Datentyps können Attribute modelliert werden, deren Inhalt nicht spezifiziert werden kann. Die Variante XML
beschreibt ein Attribut mit XML-Inhalt und die Variante BINARY
einen binären Inhalt. Dieser Typ kann in Erweiterungen nicht verfeinert werden.
BlackboxType = 'BLACKBOX' ( 'XML' | 'BINARY' ).
3.8.11. Wertebereiche von Klassen und Attributpfaden
Es kann Sinn machen, dass Datenobjekte Verweise auf bestimmte Klassen und Attribute enthalten.
ClassType = ( 'CLASS' [ 'RESTRICTION' '(' ViewableRef { ';' ViewableRef } ')' ] | 'STRUCTURE' [ 'RESTRICTION' '(' ClassOrStructureRef { ';' ClassOrStructureRef } ')' ] ). AttributePathType = 'ATTRIBUTE' [ 'OF' ( ClassType-AttributePath | '@' Argument-Name ) ] [ 'RESTRICTION' '(' AttrTypeDef { ';' AttrTypeDef } ')' ]. ClassConst = '>' ViewableRef. AttributePathConst = '>>' [ ViewableRef '->' ] Attribute-Name.
Mit der Angabe von STRUCTURE
wird eine beliebige Struktur oder Klasse, mit CLASS
(auch als Erweiterung von STRUCTURE
zulässig) eine beliebige Klasse (aber keine Strukturen) zugelassen. Sollen nur bestimmte Strukturen bzw. Klassen und ihre Erweiterungen zugelassen sein, sind diese aufzuführen (RESTRICTION
). In Erweiterungen müssen erneut alle zulässigen Strukturen bzw. Klassen aufgeführt werden. Sie dürfen aber nicht im Widerspruch zur Basisdefinition sein. Sobald solche Einschränkungen definiert sind, kann darum STRUCTURE
nicht mehr durch CLASS
erweitert werden.
Mit der Angabe von ATTRIBUTE
wird ein Attributpfadtyp zugelassen. Es kann verlangt werden, dass es zu einer Klasse (keine Subklasse!) gemäss einer anderen Definition gehört (OF
). Dabei kann entweder auf ein ClassType-Attribut oder im Falle einer Definition einer Funktion (vgl. Kapitel 3.14, “Funktionen”) auf ein anderes Argument verwiesen werden. Die möglichen Attributtypen können zudem eingeschränkt werden (RESTRICTION
). Als Konstante kommen die Namen von Attributen der Klassen, Strukturen, Assoziationen und Sichten in Frage. Der entsprechende Klassenname kann explizit angegeben werden oder ergibt sich aus dem Kontext bzw. aus dem Verweis auf ein anderes Attribut oder ein anderes Argument (OF
).
3.8.12. Linienzüge
3.8.12.1. Geometrie des Linienzugs
Anschaulich ist ein Kurvenstück ein 1-dimensionales Gebilde, das keine Risse, keine Ecken und keine Doppelpunkte jeglicher Art hat (siehe Abbildung 10 und Abbildung 11). Kurvenstücke sind also glatt und eindeutig. Strecken, Kreisbogen, Parabel- und Klothoidenstücke sind Beispiele von Kurvenstücken. Jedes Kurvenstück hat zwei Randpunkte (Anfangs- und Endpunkt), die nicht zusammenfallen dürfen. Die übrigen Punkte des Kurvenstückes heissen innere Punkte. Diese bilden das Innere des Kurvenstückes.
Ein Linienzug ist eine endliche Folge von Kurvenstücken. Ausser beim ersten Kurvenstück stimmt der Anfangspunkt jeweils mit dem Endpunkt des Vorgänger-Kurvenstückes überein. Diese Punkte heissen Stützpunkte des Linienzuges. Anschaulich kann ein Linienzug mehrfach benützte Kurvenstücke, Kurvenstücke mit zusammenfallenden Stützpunkten, sich schneidende Kurvenstücke und im Innern von Kurvenstücken endende oder startende Kurvenstücke enthalten (siehe Abbildung 12 und Abbildung 13). Ein einfacher Linienzug weist keinerlei Selbst-Schnittpunkte auf (siehe Abbildung 14). Bei einem einfach geschlossenen Linienzug stimmt zudem der Anfangspunkt des ersten Kurvenstücks mit dem Endpunkt des letzten überein.
3.8.12.2. Linienzug mit Strecken und Kreisbogen als vordefinierte Kurvenstücke
INTERLIS 2 kennt gerichtete (DIRECTED POLYLINE
), ungerichtete (POLYLINE
) oder eine Menge von ungerichteten (MULTIPOLYLINE
) Linienzügen. Bei einem einzelnen Linienzug ([DIRECTED] POLYLINE
) sind aber beim Transfer eines Ausschnittes auch MULTIPOLYLINE
zulässig (vgl. Kapitel 4.3.6, “Codierung von Themen”). Bei einer Menge von Linienzügen (MULTIPOLYLINE
) müssen die einzelnen Linienzüge nicht miteinander verbunden sein. Zudem werden Linienzüge im Rahmen von Einzelflächen und Gebietseinteilungen (vgl. Kapitel 3.8.13, “Einzelflächen und Gebietseinteilungen”) verwendet.
Zur Definition eines konkreten Linienzug-Wertebereichs gehört immer die Angabe der erlaubten Kurvenstück-Formen mittels Aufzählung, z.B. Strecken (Schlüsselwort STRAIGHTS
), Kreisbogen (Schlüsselwort ARCS
) oder weitere Möglichkeiten (vgl. Kapitel 3.8.12.3, “Weitere Kurvenstück-Formen”), und die Angabe des Wertebereichs der Stützpunkte. In einem abstrakten Linienzug-Wertebereich dürfen diese Angaben fehlen. Für Wertebereichserweiterungen gelten folgende Regeln:
-
Die Kurvenstück-Form darf nur reduziert, nicht aber ergänzt werden.
-
Der Koordinaten-Wertebereich, der im Rahmen einer Erweiterung eines Linienzug-Wertebereichs angegeben wird, muss eine Einschränkung des Koordinaten-Wertebereichs des Basis-Linienzug-Wertebereichs sein, sofern ein solcher definiert ist.
Die Kurvenstücke werden immer als Erweiterung der Grundstruktur 'LineSegment' aufgefasst. Der darin verwendete Koordinatenwertebereich ist der in der Liniendefinition angegebene.
STRUCTURE LineSegment (ABSTRACT) = SegmentEndPoint: MANDATORY LineCoord; END LineSegment; STRUCTURE StartSegment (FINAL) EXTENDS LineSegment = END StartSegment; STRUCTURE StraightSegment (FINAL) EXTENDS LineSegment = END StraightSegment; STRUCTURE ArcSegment (FINAL) EXTENDS LineSegment = ArcPoint: MANDATORY LineCoord; Radius: NUMERIC [LENGTH]; END ArcSegment;
Das erste Kurvenstück eines Linienzuges ist immer ein Startsegment. Das Startsegment besteht nur aus dem Startpunkt selbst, der zugleich auch Endpunkt des Startsegments ist. Das Geradenstück hat einen Endpunkt und definiert dadurch eine Strecke vom Endpunkt des vorherigen Kurvenstücks zu seinem Endpunkt. Startsegment und Geradenstücke brauchen keine weiteren Angaben. Die entsprechenden Erweiterungen von 'LineSegment' sind darum leer. Zwei aufeinander folgende Stützpunkte (SegmentEndPoints) dürfen in der Projektion nicht aufeinander fallen.
Ein Kreisbogenstück beschreibt ein Kurvenstück, das in der Projektion als echtes Kreisbogenstück erscheint. Ein Kreisbogenstück wird zusätzlich zum Endpunkt mit einem Zwischenpunkt und fakultativ einem Radius beschrieben. Der Zwischenpunkt ist nur in der Lage von Bedeutung und gilt nicht als Stützpunkt des Linienzuges. Er soll möglichst exakt in der Mitte zwischen Anfangs- und Endpunkt liegen und mindestens die gleiche Genauigkeit (Anzahl Nachkommastellen) wie die Stützpunkte aufweisen. Ist kein Radius angegeben, ergibt sich der Kreisbogen aus Anfangs-, Zwischen- und Endpunkt des Kurvenstücks. Wird der effektive Radius angegeben, ist er für die Kreisbogendefinition massgebend. Der Zwischenpunkt legt nur noch fest, welcher der vier möglichen Kreisbogen der gewünschte ist.
Bei dreidimensionalen Koordinaten wird die Höhe auf dem Kreisbogenstück linear interpoliert. Man kann sich die Kurve als Gewindestück einer zylindrischen Schraube vorstellen, die senkrecht auf der Projektionsfläche steht. INTERLIS regelt nicht, wie der Kreisbogen im Detail verläuft und wie der zusätzliche Punkt bestimmt werden muss. In einem System kann ein INTERLIS-Kreisbogen je nach internem Umgang leicht unterschiedlich dargestellt werden und bei einer erneuten Ausgabe nach INTERLIS auch zu unterschiedlichen Daten führen. INTERLIS-Kreisbogen beschreiben also nicht ihren exakten Verlauf, sondern eine Spur, die beidseitig des exakten Verlaufs je einen Abstand aufweist, der kleiner ist als der Wert 1 der hintersten Stelle gemäss Wertebereichsdefinition multipliziert mit der Hälfte der Quadratwurzel von 2 [z.B. 0.001 * sqrt(2) / 2 bei Koordinaten mit 3 Nachkommastellen]. Liegt die gerade Verbindung zwischen Anfangs- und Endpunkt eines Kreisbogens innerhalb dieser Spur, darf das Leseprogramm den Kreisbogen durch ein Geradenstück ersetzen.
Aus fachlicher Sicht soll oft ausgedrückt werden, dass es sich bei einem Linienzug um einen einfachen Linienzug handelt, d.h. anschaulich, dass Überlappungsfreiheit gegenüber konkurrierenden Linienzügen (vgl. unten) besteht. Bei der Überprüfung der Überlappungsfreiheit durch Systeme besteht bei Kreisbogen allerdings das technische Problem, dass in Grenzsituationen unterschiedliche Systeme auf Grund unterschiedlicher Rechengenauigkeiten und unterschiedlicher Berechnungsweisen zu unterschiedlichen Resultaten bezüglich Überschneidung kommen. Um dies möglichst zu vermeiden, sollen Systeme dafür sorgen, dass konkurrierende Linienstücke nicht mit der Spur des Kreisbogens überlappen. Dennoch ist es möglich, dass ein anderes System minimale Überlappungen darstellt.
Bei Daten, die grafisch erfasst wurden, kann es Sinn machen, grössere Überlappungen (z.B. einige Zentimeter) zu tolerieren, um einen enormen Nachbearbeitungsaufwand zu vermeiden. Dafür wird Überlappungsfreiheit bei Kreisbogen wie folgt geregelt:
Weisen ein Kreisbogen und ein konkurrierendes Linienstück einen gemeinsamen Stützpunkt auf, dürfen sie sich in einem weiteren Punkt (kein Stützpunkt) schneiden, falls das von der Strecke abgeschnittene Kreissegment (bzw. das vom anderen Kreisbogen abgeschnittene Doppel-Kreissegment) eine Pfeilhöhe aufweist, die kleiner oder gleich der definierten Toleranz ist. Fehlt die Toleranzangabe, gilt der Wert gemäss den technischen Überlegungen (vgl. oben). Bei expliziter Angabe (auf WITHOUT OVERLAPS > folgende Dezimalzahl) muss sie mit derselben numerischen Stellenzahl wie diejenige der Stützpunktkoordinaten erfolgen und einen Wert grösser Null aufweisen.
Konkurrierende Linienstücke ergeben sich wie folgt:
-
Bei einzelnen Linienzügen (POLYLINE): durch die anderen Linienstücke des Linienzugs, sofern Überlappungsfreiheit (WITHOUT OVERLAPS) verlangt wurde.
-
Bei Einzelflächen (SURFACE): durch die anderen Linienstücke der Flächenberandung.
-
Bei Gebietseinteilung (AREA): durch alle anderen Linienstücke der Gebietseinteilung.
Da die Überlappungsfreiheit bei Einzelflächen und Gebietseinteilung zwingend ist, kann auf die Verwendung WITHOUT OVERLAPS verzichtet werden, wenn nur die Spurbreite zur Anwendung kommen soll.
Die Toleranzangabe (explizit oder implizit) kann nicht übersteuert werden. Im Rahmen von Wertebereichsdefinitionen und Attributserweiterungen können ungerichtete Linienzüge zu gerichteten Linienzügen erweitert werden (vgl. Kapitel 3.8.13.4, “Erweiterbarkeit”). Sind Linienzüge gerichtet, muss ihr Richtungssinn immer (auch bei einem Datentransfer) erhalten bleiben.
Für die Stützpunkte wird der Wertebereich der Koordinaten definiert. Für INTERLIS-Linien kommen nur kartesische Koordinatensysteme in Frage, bei denen die Wertebereiche aller Achsen dieselbe Stellenzahl aufweisen. Mittels der Existenzbedingung REQUIRED IN
(vgl. Kapitel 3.12, “Konsistenzbedingungen” und Kapitel 3.13, “Ausdrücke”) kann zudem gefordert werden, dass die Koordinaten nicht beliebig sein dürfen, sondern denjenigen der Punkte bestimmter Klassen entsprechen müssen.
Ist der Koordinatentyp der Stützpunkte abstrakt, muss der Linienzug seinerseits als abstrakt deklariert werden.
LineType = ( [ 'DIRECTED' ] 'POLYLINE' | 'SURFACE' | 'AREA' | [ 'DIRECTED' ] 'MULTIPOLYLINE' | 'MULTISURFACE' | 'MULTIAREA' ) [ LineForm ] [ ControlPoints ] [ IntersectionDef ]. LineForm = 'WITH' '(' LineFormType { ',' LineFormType } ')'. LineFormType = ( 'STRAIGHTS' | 'ARCS' | [ Model-Name '.' ] LineFormType-Name ). ControlPoints = 'VERTEX' CoordType-DomainRef. IntersectionDef = 'WITHOUT' 'OVERLAPS' [ '>' Dec ].
Linien können auf generischen Koordinaten aufbauen, ohne dass sie selbst als generisch deklariert werden. Sie erhalten ihre konkrete Festlegung mit der Festlegung des Koordinaten-Wertebereichs (im Rahmen einer Kontextdefinition bzw. im Rahmen des Datentransfers). Es ist dafür nicht nötig (aber durchaus zulässig), dass zu Linien-Wertebereichen, die auf generischen Koordinaten-Wertebereichen aufbauen, Linien-Wertebereiche definiert sind, die auf konkreten Koordinaten-Wertebereichen aufbauen.
DOMAIN Coord2 (GENERIC) = COORD NUMERIC, NUMERIC; Line = POLYLINE WITH (STRAIGHTS, ARCS) VERTEX Coord2;
3.8.12.3. Weitere Kurvenstück-Formen
Nebst Geradenstücken und Kreisbogen sind weitere Kurvenstück-Formen definierbar. Nebst dem Namen muss angegeben werden, gemäss welcher Struktur ein Kurvenstück beschrieben wird.
LineFormTypeDef = 'LINE' 'FORM' { LineFormType-Name ':' LineStructure-Name ';' }.
Eine Linienstruktur muss immer eine Erweiterung der durch INTERLIS definierten Struktur LineSegment sein (vgl. Kapitel 3.8.12.2, “Linienzug mit Strecken und Kreisbogen als vordefinierte Kurvenstücke”).
3.8.13. Einzelflächen und Gebietseinteilungen
3.8.13.1. Geometrie von Flächen
Für die Modellierung von Geodaten genügen meist ebene Flächen. INTERLIS unterstützt darüber hinaus ebene allgemeine Flächen. Anschaulich ist eine ebene allgemeine Fläche durch eine äussere und allenfalls eine oder mehrere innere Randlinien begrenzt (siehe Abbildung 20). Die Randlinien selbst müssen aus einfachen Linienzügen bestehen, die aus geometrischer Sicht jeweils zu einfach geschlossenen Linienzügen zusammengefasst werden können. Sie müssen zudem so angeordnet sein, dass es von einem beliebigen Punkt im Innern der Fläche immer einen Weg zu einem beliebigen anderen Punkt im Innern der Fläche gibt, der weder eine Randlinie schneidet noch einen Stützpunkt einer Randlinie enthält (siehe Abbildung 20). Soweit diese Bedingung nicht verletzt wird, dürfen sich Ränder in Stützpunkten berühren. In solchen Situationen kann man sich grundsätzlich verschiedene Möglichkeiten vorstellen, wie die Umrandung der Fläche als Ganzes in einzelne Linienzüge aufgeteilt wird (siehe Abbildung 22). INTERLIS schliesst sich aber einer verbreiteten Regelung (z.B. OGC/ISO) an und verlangt, dass alle Punkte einer Randlinie (ausser Anfangs- /Endpunkt) disjunkt sein müssen. Die Varianten b und c von Abbildung 22 sind im Transfer darum nicht zugelassen.
Mit der Definition von (allgemeinen) Einzelflächen bzw. (allgemeinen) Flächen einer Gebietseinteilung wird auch festgelegt, oberhalb welcher Toleranz sich die Kurvenstücke des Randes nicht überlappen dürfen (ohne Angabe von WITHOUT OVERLAPS
gilt die implizite bzw. die geerbte Toleranz). Das Überlappungs- bzw. Schnittverbot gilt bei Einzelflächen nicht nur zwischen den Kurvenstücken eines einzelnen Linienzuges sondern zwischen allen Kurvenstücken aller Linienzüge des Flächenrandes. Für Flächen einer Gebietseinteilung gilt es sogar für alle an der Gebietseinteilung beteiligten Linienzüge. Zudem sind Linienzüge, die nicht zum Rand einer (allgemeinen) Fläche gehören, gemäss Definition der (allgemeinen) Fläche ausgeschlossen.
Linienzüge, die nicht zu einem Rand gehören, sind nicht erlaubt.
3.8.13.2. Einzelflächen
SURFACE
).Für (allgemeine) Flächen, die sich ganz oder teilweise überlappen dürfen, d.h. die nicht nur Randpunkte gemeinsam haben dürfen, steht der geometrische Attributtyp SURFACE
zur Verfügung (siehe [fig24]). Dieser Typ wird Einzelflächen genannt. Eine Einzelfläche hat einen äusseren und allenfalls mehrere inneren Ränder (um die Enklaven). Jeder Rand besteht aus mindestens einem Linienzug.
Mit dem Attributtyp MULTISURFACE
kann auch eine Menge von Einzelflächen als ein einzelner Wert definiert werden. Die einzelnen Flächen eines MULTISURFACE-Wertes dürfen keine gemeinsamen Kanten haben und dürfen sich abgesehen von Overlaps nicht überlappen.
3.8.13.3. Flächen einer Gebietseinteilung
AREA
).Gebietseinteilung (Flächennetz) heisst eine endliche Menge von (allgemeinen) Flächen und Restflächen, welche die Ebene überlappungsfrei überdecken.
Für Gebietseinteilungen steht primär der geometrische Attributtyp AREA
zur Verfügung. Dieser darf aber nicht innerhalb von Strukturen vorkommen, da die Menge der Gebietsobjekte erst durch die Verwendung der Struktur innerhalb einer Klasse klar ist. Sollen Einzelflächen von Strukturattributen ein Gebietsnetz bilden, soll dies mittels Konsistenzbedingungen mit den Standardfunktionen areAreasWithoutGaps bzw. areAreasWithoutGaps2 definiert werden.
Jedem Gebietsobjekt (bzw. Strukturelement) ist höchstens eine Fläche der Gebietseinteilung, nicht aber die Restfläche, zugeordnet. Soll jeder Fläche der Gebietseinteilung ein Gebietsobjekt entsprechen, soll dies mittels Konsistenzbedingungen mit den Standardfunktionen withoutGaps bzw. withoutGaps2 definiert werden.
Für Gebietsobjekte ergibt sich damit auch die gleiche implizite Struktur wie für Einzelflächen. Zusätzlich gilt aber folgende Konsistenzbedingung:
-
Liegen auf beiden Seiten eines Linienzuges definierte Gebietsobjekte, muss jedes Kurvenstück (Verbindung zweier Stützpunkte) des einen Gebietsobjektes genau einem Kurvenstück des anderen Gebietsobjektes entsprechen.
Damit die Linienzüge einer Gebietseinteilung auch als einzelne Objekte angesprochen werden können (und zwar als ein Objekt, auch wenn der Linienzug zwei Gebietsobjekte begrenzt), steht die AREA INSPECTION
zur Verfügung (vgl. Kapitel 3.15, “Sichten”). Mit dem Attributtyp MULTIAREA
kann auch eine Menge von einzelnen AREA
-Objekten als ein einzelner Wert definiert werden. Die einzelnen Flächen eines MULTIAREA
-Wertes dürfen keine gemeinsamen Kanten haben und dürfen sich abgesehen von Overlaps nicht überlappen.
3.8.13.4. Erweiterbarkeit
Einzelflächen können zu Gebietseinteilungen erweitert werden. Die Erweiterung eines Linienzuges zu einer Fläche ist unzulässig, da bei einer Fläche mit mehreren Linienzügen gerechnet werden muss, während mit der Definition eines Linienzuges nur einer erwartet wird.
Unabhängige Flächen und Flächen einer Gebietseinteilung können in zweierlei Hinsicht erweitert werden:
-
Ist primär
SURFACE
definiert, sind also Überlappungen zugelassen, darf dies in Erweiterungen durchAREA
ersetzt werden, da damit die Grunddefinition nicht verletzt wird.
3.9. Einheiten
Einheiten werden immer durch eine Bezeichnung und (in [ ]-Klammern) ein Kurzzeichen beschrieben. Bezeichnung und Kurzzeichen müssen Namen sein. Fehlt die Kurzzeichen-Angabe, ist sie gleich der Bezeichnung. Je nach Art der Einheit können weitere Angaben folgen. Der Gebrauch einer Einheit erfolgt immer über das Kurzzeichen. Die Bezeichnung hat damit nur dokumentarischen Charakter.
3.9.1. Basiseinheiten
Basis-Einheiten sind Meter, Sekunden, etc. Sie brauchen keine weiteren Angaben mehr. Basis-Einheiten können aber auch abstrakt (Schlüsselwort ABSTRACT
) definiert werden, wenn die Einheit selbst noch nicht bekannt ist, wohl aber der zu bezeichnende Gegenstand (z.B. Temperatur, Geld). Abstrakten Einheiten ist noch kein Kurzzeichen zugeordnet. Konkrete Einheiten können nicht mehr erweitert werden.
UNIT Laenge (ABSTRACT); Zeit (ABSTRACT); Geld (ABSTRACT); Temperatur (ABSTRACT); Meter [m] EXTENDS Laenge; Sekunde [s] EXTENDS Zeit; SchweizerFranken [CHF] EXTENDS Geld; Celsius [C] EXTENDS Temperatur;
Durch INTERLIS selbst ist die abstrakte Einheit ANYUNIT
definiert. Alle anderen Einheiten erben sie direkt oder indirekt (vgl. Kapitel 3.10.3, “Referenzsysteme”), ohne dass dies definiert werden muss. Folgende Einheiten sind durch INTERLIS direkt (d.h. intern) definiert:
UNIT ANYUNIT (ABSTRACT); DIMENSIONLESS (ABSTRACT); LENGTH (ABSTRACT); MASS (ABSTRACT); TIME (ABSTRACT); ELECTRIC_CURRENT (ABSTRACT); TEMPERATURE (ABSTRACT); AMOUNT_OF_MATTER (ABSTRACT); ANGLE (ABSTRACT); SOLID_ANGLE (ABSTRACT); LUMINOUS_INTENSITY (ABSTRACT); MONEY (ABSTRACT); METER [m] EXTENDS LENGTH; KILOGRAMM [kg] EXTENDS MASS; SECOND [s] EXTENDS TIME; AMPERE [A] EXTENDS ELECTRIC_CURRENT; DEGREE_KELVIN [K] EXTENDS TEMPERATURE; MOLE [mol] EXTENDS AMOUNT_OF_MATTER; RADIAN [rad] EXTENDS ANGLE; STERADIAN [sr] EXTENDS SOLID_ANGLE; CANDELA [cd] EXTENDS LUMINOUS_INTENSITY;
Hinweis: Im Anhang H Einheiten-Definitionen sind die gebräuchlichsten Einheiten in einem erweiterten Typenmodell zusammengefasst.
3.9.2. Abgeleitete Einheiten
Abgeleitete Einheiten sind durch Multiplikationen bzw. Divisionen mit Konstanten oder Funktion in eine andere Einheit umrechenbar.
UNIT Kilometer [km] = 1000 [m]; Centimeter [cm] = 1 / 100 [m]; Inch [in] = 0.0254 [m]; !! 1 Zoll ist 2.54 cm Fahrenheit [oF] = FUNCTION // (oF + 459.67) / 1.8 // [K];
Werte in Kilometer müssen mit Tausend multipliziert werden, um Werte in Meter zu werden. Werte in Inch müssen mit 2.54 multipliziert werden um Werte in Zentimeter zu werden. Werte in Grad Fahrenheit müssen um 459.67 erhöht und durch 1.8 dividiert werden um zu Kelvin-Werten zu werden.
Eine abgeleitete Einheit ist automatisch eine Erweiterung der gleichen abstrakten Einheit, wie diejenige in die sie umgerechnet werden kann.
3.9.3. Zusammengesetze Einheiten
Zusammengesetzte Einheiten (z.B. km pro h) ergeben sich durch Multiplikationen oder Divisionen von anderen Einheiten (Basis-Einheit, abgeleitete oder zusammengesetzte Einheit). Zusammengesetzte Einheiten können auch als abstrakte Einheiten definiert werden. Sie müssen sich dann vollständig auf andere abstrakte Einheiten beziehen.
Die bei der konkreten Erweiterung verwendeten Einheiten müssen dann konkrete Erweiterungen der in der abstrakten Definition verwendeten Einheiten sein.
UNIT Geschwindigkeit (ABSTRACT) = ( Laenge / Zeit ); Stundenkilometer [kmph] EXTENDS Geschwindigkeit = ( km / h );
UnitDef = 'UNIT' { Unit-Name [ '(' 'ABSTRACT' ')' | '[' UnitShort-Name ']' ] [ 'EXTENDS' Abstract-UnitRef ] [ '=' ( DerivedUnit | ComposedUnit ) ] ';' }. DerivedUnit = [ DecConst { ( '*' | '/' ) DecConst } | 'FUNCTION' Explanation ] '[' UnitRef ']'. ComposedUnit = '(' UnitRef { ( '*' | '/' ) UnitRef } ')'. UnitRef = [ Model-Name '.' [ Topic-Name '.' ] ] UnitShort-Name.
3.10. Umgang mit Metaobjekten
3.10.1. Allgemeine Aussagen zu Metaobjekten
Metaobjekte im Sinne von INTERLIS 2 sind Objekte, die im Rahmen der Beschreibung von Anwendungsmodellen von Bedeutung sind. Dies wird für Referenzsysteme und Grafiksignaturen genutzt.
Der Aufbau von Referenzsystem- oder Signaturobjekten muss in einem REFSYSTEM MODEL
oder einem SYMBOLOGY MODEL
mit den üblichen Mitteln von Klassen und Strukturen definiert sein. Referenzsystem-, Achsen- bzw. Signatur-Klassen müssen dabei Erweiterungen der durch INTERLIS angebotenen Klassen COORDSYSTEM
, REFSYSTEM
, AXIS
bzw. SIGN
sein, die ihrerseits Erweiterungen der Klasse METAOBJECT
sind. Diese weist ein Attribut Name auf, das im Rahmen aller Metaobjekte eines Behälters eindeutig sein muss.
Für die eigentliche Beschreibung eines Anwendungsmodells wird das Metaobjekt selbst nicht gebraucht. Es genügt, den Namen als Stellvertreter des Metaobjektes zu kennen. Für ein laufendes System müssen die Metaobjekte jedoch in der Regel vollständig, also mit allen ihren Attributen, bekannt sein. Für ein Laufzeitsystem muss es darum klar sein, in welchem Behälter ein Metaobjekt mit einem bestimmten Namen enthalten ist. Damit Metaobjekte (bzw. ihre Namen) in Modellen verwendet werden können, müssen sie deklariert werden. Dabei wird ein Behältername eingeführt, das dabei vorausgesetzte Thema angegeben und dann (pro Klasse) die Namen der dort erwarteten Objekte aufgezählt (Regel MetaDataBasketDef). Der Behältername kann dabei auch als Erweiterung eines bereits eingeführten Namens definiert werden (EXTENDS
). Das zugehörige Thema muss dann das gleiche wie beim Basisnamen oder eine Erweiterung davon sein.
Wird der Bezug auf ein Metaobjekt (Regel MetaObjectRef) unter dem erweiterten Behälternamen gemacht, muss der Name des Metaobjektes dort oder in einer geerbten Definition erwähnt sein. Von einem Laufzeitsystem wird das Metaobjekt zuerst im zugehörigen Behälter gesucht. Wird dort kein solches Metaobjekt gefunden, wird die Suche in den Behältern gemäss den direkt oder indirekt geerbten Behälternamen fortgesetzt. Damit können Metaobjekte in mehreren Stufen bereitgestellt und verfeinert werden. Zum Beispiel können zunächst allgemeine Grafiksignaturen definiert werden, die dann auf regionaler Stufe verfeinert und ergänzt werden. Wie der konkrete Behälter auf Grund des Behälternamens angesprochen werden kann, ist dabei Sache des eingesetzten Laufzeitsystems.
In einem übersetzten Anwendungsmodell (vgl. Kapitel 3.5.1, “Modelle”), kann einem Behälternamen auch ein konkreter Behälter zugewiesen werden, der nur Übersetzungen enthält (METAOBJECT_TRANSLATION Objekte; vgl. Anhang A Das interne INTERLIS-Datenmodell). Damit werden diejenigen Metaobjekte übersetzt, die durch den entsprechenden Behälter im zu Grunde liegenden Modell eingeführt wurden. Ist das zu Grunde liegende Modell selbst eine Übersetzung, kann auch da dem Behälternamen ein konkreter Behälter zugewiesen sein, der nur Übersetzungen enthält. Ist das Modell keine Übersetzung, kann einem Behälternamen nur ein konkreter Behälter zugewiesen werden, der keine Übersetzungen (d.h. keine METAOBJECT_TRANSLATION Objekte) enthält.
MetaDataBasketDef = ( 'SIGN' | 'REFSYSTEM' ) 'BASKET' Basket-Name Properties<FINAL> [ 'EXTENDS' MetaDataBasketRef ] '~' TopicRef { 'OBJECTS' 'OF' Class-Name ':' MetaObject-Name { ',' MetaObject-Name } } ';'. MetaDataBasketRef = [ Model-Name '.' [ Topic-Name '.' ] ] Basket-Name. MetaObjectRef = [ MetaDataBasketRef '.' ] Metaobject-Name.
Wird im aktuellen Kontext nur ein Metadaten-Behältername benötigt, muss die Referenz auf den Metadatenbehälter (MetaDataBasketRef) in der Metaobjekt-Referenz nicht angegeben werden.
3.10.2. Parameter
Mittels Parametern werden im Metamodell diejenigen Eigenschaften bezeichnet, die nicht das Metaobjekt selbst, sondern dessen Gebrauch in der Anwendung betreffen. Ihre Definition ist durch das Schlüsselwort PARAMETER
eingeleitet und ist ähnlich aufgebaut wie diejenige der Attribute.
3.10.2.1. Parameter für Referenz- und Koordinatensysteme
Für Referenz- und Koordinatensysteme bzw. ihre Achsen ist nur der vordefinierte Parameter Unit zulässig.
Wird in der Definition eines numerischen Datentyps (vgl. Kapitel 3.8.5, “Numerische Datentypen”) oder eines Koordinatentyps (vgl. Kapitel 3.8.8, “Koordinaten”) auf ein Referenz- oder Koordinatensystem verwiesen (Regel RefSys) muss eine Einheit angegeben sein, die derjenigen der entsprechenden Achse des Koordinatensystems bzw. der einzigen Achse des Referenzsystems (vgl. Kapitel 3.10.3, “Referenzsysteme”) verträglich ist.
3.10.2.2. Parameter von Signaturen
Die Parameter von Signaturen sind frei definierbar. Diese Parameter entsprechen den Angaben (z.B. Punktsymbol-Identifikation, Position, Drehung), die einem Grafiksystem übergeben werden müssen, damit es die Grafik erzeugen kann. Primär muss die Signatur selbst gewählt werden können. Dies erfolgt durch die Definition eines Parameters für die Referenz zur Signaturklasse, in der der Parameter definiert ist (METAOBJECT
). Als Parameter einer Signatur kann auch eine Referenz zu einem anderen Meta-Objekt angegeben werden (METAOBJECT OF
). In beiden Fällen wird in der Anwendung (vgl. Kapitel 3.16, “Darstellungsbeschreibungen”) eine Metaobjekt-Referenz angegeben, d.h. es werden der Behälterreferenzname und der Metaobjektname angegeben. Damit können die effektive Behälter-Identifikation und MetaObjektidentifikation durch das jeweilige Werkzeug bestimmt werden.
Nebst diesen speziellen Parametern können Parameter gleich wie Attribute definiert werden.
ParameterDef = Parameter-Name Properties<ABSTRACT,EXTENDED,FINAL> ':' ( AttrTypeDef | 'METAOBJECT' [ 'OF' MetaObject-ClassRef ] ) ';'.
3.10.3. Referenzsysteme
Ohne weitere Angaben sind numerische Werte und Koordinaten Differenzangaben; sie haben keinen definierten absoluten Bezug. Um dies zu erreichen, muss ein Koordinatensystem bzw. ein Skalarsystem definiert sein. Die Modelldefinition erfolgt dabei in einem REFSYSTEM MODEL
. INTERLIS stellt dafür die folgenden Klassen zur Verfügung:
CLASS METAOBJECT (ABSTRACT) = Name: MANDATORY NAME; UNIQUE Name; END METAOBJECT; STRUCTURE AXIS = PARAMETER Unit: NUMERIC [ ANYUNIT ]; END AXIS; CLASS REFSYSTEM (ABSTRACT) EXTENDS METAOBJECT = END REFSYSTEM; CLASS COORDSYSTEM (ABSTRACT) EXTENDS REFSYSTEM = ATTRIBUTE Axis: LIST {1..3} OF AXIS; END COORDSYSTEM; CLASS SCALSYSTEM (ABSTRACT) EXTENDS REFSYSTEM = PARAMETER Unit: NUMERIC [ ANYUNIT ]; END SCALSYSTEM;
In Erweiterungen können weitere für die Art der Skalar- und Koordinatensysteme typische Attribute beigefügt werden und auch die Einheit durch eine Erweiterung ersetzt werden (Syntax für die Parameterdefinition vgl. Kapitel 3.10.2, “Parameter” und Kapitel 3.5.3, “Klassen und Strukturen”). Die in einem Wertebereich definierte Einheit muss dann mit ihr verträglich sein (vgl. Kapitel 3.9, “Einheiten”).
3.11. Laufzeitparameter
Nebst den eigentlichen Daten und den Metadaten können auch einzelne Datenelemente definiert werden, bei denen erwartet wird, dass sie von einem Bearbeitungs-, Auswerte- oder Darstellungssystem zur Laufzeit bereitgestellt werden. Sie heissen Laufzeitparameter.
RunTimeParameterDef = 'PARAMETER' { RunTimeParameter-Name ':' AttrTypeDef ';' }.
Gebietseinteilungen (Schlüsselwort AREA) sind für Laufzeitparameter nicht zugelassen.
Typische Laufzeitparameter sind zum Beispiel der Darstellungsmassstab und das aktuelle Datum.
3.12. Konsistenzbedingungen
Konsistenzbedingungen dienen der Definition von Einschränkungen, welchen die Objekte genügen müssen.
Konsistenzbedingungen können einen Namen haben, der innerhalb der Klasse bzw. des Wertebereichs, zu dem sie definiert werden, eindeutig sein muss.
Bei der Prüfung von Konsistenzbedingungen (insbesondere der Einhaltung der Schnittfreiheit inkl. Overlaps) sollen (auch wenn die Daten in einem System mit höherer Genauigkeit gespeichert sind) gemäss Wertebereichdefinition gerundete Attribut-Werte verwendet werden (vgl. Kapitel 2.8, “Umgang mit Rundung von numerischen Werten und Koordinaten”).
Konsistenzbedingungen, die sich auf ein einzelnes Objekt beziehen, werden durch einen logischen Ausdruck beschrieben, der sich auf die Attribute des Objektes bezieht (s. nächstes Kapitel). Solche Bedingungen dürfen keine Funktion verwenden, die auf einem Argument (typischerweise auf dem ersten) eine Menge von Objekten (OBJECTS OF
) erwartet. Dabei können Konsistenzbedingungen definiert werden, die obligatorisch sind und somit für alle Objekte zwingend gelten (Schlüsselwort MANDATORY
), und solche, die nur in der Regel gelten. Im letzteren Fall wird angegeben, welcher Prozentanteil der Instanzen der Klasse die Bedingung normalerweise erfüllen soll (Regel PlausibilityConstraint).
Mit der Existenzbedingung (Regel ExistenceConstraint) kann gefordert werden, dass der Wert eines Attributes jedes Objektes der Bedingungs-Klasse in einem bestimmten Attribut einer Instanz anderer Klassen vorkommt. Das bedingt, dass das Bedingungsattribut mit dem anderen Attribut kompatibel ist und hat folgende Wirkung:
-
Ist der Wertebereich des Bedingungsattributes gleich dem Wertebereich des anderen Attributes oder einer Erweiterung davon, muss der Bedingungswert im verlangten Attribut einer anderen Instanz vorkommen.
-
Ist der Wertebereich des Attributes eine Struktur, werden alle darin enthaltenen Attribute verglichen.
-
Ist der Wertebereich des anderen Attributes eine Koordinate und der Wertebereich des Bedingungsattributes eine Linie, Einzelfläche oder Gebietseinteilung mit dem gleichen oder einem erweiterten Koordinatenbereich, müssen alle Koordinaten der Stützpunkte der Linie, Einzelfläche oder Gebietseinteilung im verlangten Attribut einer anderen Instanz vorkommen.
Eindeutigkeitsforderungen werden mit dem Schlüsselwort UNIQUE
eingeleitet (Regel UniquenessConstraint).
Konzeptionell bedeutet "global", dass alle in beliebigen Behältern existierenden Objekte dieser Bedingung genügen müssen. Mit der Angabe (BASKET
) gilt die Eindeutigkeitsbedingung nicht mehr global, sondern pro Basket.
Bei Strukturen, Klassen und Assoziationen kann gefordert werden, dass eine bestimmte Kombination von Attributen von Unterstrukturen, die mit BAG OF oder LIST OF definiert sind, lokal (LOCAL
), d.h. im Rahmen aller dem aktuellen Objekt oder Strukturelement zugeordneten Strukturelemente, eindeutig sein müssen.
CLASS A = K: (A, B, C); ID: TEXT*10; UNIQUE K, ID; END A;
Ist an einer Eindeutigkeitsbedingung (UNIQUE
) ein Attribut beteiligt, dessen Wert undefiniert ist, gilt die Eindeutigkeitsbedingung für das aktuelle Objekt als erfüllt. Strukturattribute sind als Attribut einer Eindeutigkeitsbedingung nicht zulässig.
Ist eine Konsistenzbedingung (MANDATORY CONSTRAINT
) nicht berechenbar (weil z.B. ein Attribut beteiligt ist, dessen Wert undefiniert ist, oder der Divisor 0 beträgt) so gilt die Konsistenzbedingung für das aktuelle Objekt als erfüllt.
Mit Konsistenzbedingungen, die sich auf die Klasse beziehen (SET CONSTRAINT
), können Bedingungen formuliert werden, die für die Gesamtmenge der Objekte der Klasse (bzw. der Teilmenge, welche die einschränkende WHERE-Bedingung erfüllt) gelten. Solche Bedingungen müssen mindestens eine Funktion verwenden, die auf einem Argument (typischerweise auf dem ersten) eine Menge von Objekten (OBJECTS OF) erwartet. Um die Gesamtmenge der Objekte der Klasse (bzw. der Teilmenge, welche die einschränkende WHERE-Bedingung erfüllt) diesem Argument zu übergeben, wird ALL
(ohne Angabe der eigenen Klasse) angegeben. Da sich solche Konsistenzbedingungen nicht auf das einzelne Objekt beziehen, können nie die Werte von Attributen angesprochen werden. Als weitere Argumente und für Vergleiche kommen darum nur Konstanten, Laufzeitparameter, Klassentypen, und Attributtypen und weitere Funktionsaufrufe, die diese Einschränkung erfüllen, in Frage.
CLASS B = Art: (a, b, c); Geometrie: SURFACE ...; SET CONSTRAINT WHERE Art == #a : areAreas(ALL, UNDEFINED, >> Geometrie); END B; STRUCTURE F = Geometrie: SURFACE ...; END F; CLASS C = Flaechen: BAG OF F; SET CONSTRAINT areAreas(ALL, >> Flaechen, >> F->Geometrie); END;
Die Objekte der Klasse B, deren Art a ist, sollen wegen der Verwendung der Standardfunktion areAreas (vgl. Kapitel 3.14, “Funktionen”) ein Flächennetz bilden. Alle Flächen (gemäss Unterstruktur Flächen) der Objekte der Klasse C bilden eine Gebietseinteilung.
Weitergehende Konsistenzbedingungen müssen mittels Sichten (z.B. Sicht, die eine bestimmte Klasse mit sich selbst verbindet und damit beliebige Attributkombinationen mit allen anderen Objekten der Klasse vergleichbar machen) definiert werden. Solche Sichten müssen zwingend innerhalb des Datenmodells definiert werden.
Konsistenzbedingungen, die sich auf eine Vielzahl von Objekten erstrecken (insbesondere Eindeutigkeitsbedingungen), sind nicht immer vollständig prüfbar, weil die Prüfung nur mit den lokal verfügbaren Behältern durchgeführt werden kann. Konzeptionell gelten sie aber (ausser bei Metamodellen) dennoch global (vgl. Anhang G Eindeutigkeit von Benutzerschlüsseln).
ConstraintDef = ( MandatoryConstraint | PlausibilityConstraint | ExistenceConstraint | UniquenessConstraint | SetConstraint ). MandatoryConstraint = 'MANDATORY' 'CONSTRAINT' [ Constraint-Name ':' ] Logical-Expression ';'. PlausibilityConstraint = 'CONSTRAINT' [ Constraint-Name ':' ] ( '<=' | '>=' ) Percentage-Dec '%' Logical-Expression ';'. ExistenceConstraint = 'EXISTENCE' 'CONSTRAINT' [ Constraint-Name ':' ] AttributePath 'REQUIRED' 'IN' ViewableRef ':' AttributePath { 'OR' ViewableRef ':' AttributePath } ';'. UniquenessConstraint = 'UNIQUE' [ '(' 'BASKET' ')' ] [ Constraint-Name ':' ] [ 'WHERE' Logical-Expression ':' ] ( GlobalUniqueness | LocalUniqueness ) ';'. GlobalUniqueness = UniqueEl. UniqueEl = ObjectOrAttributePath { ',' ObjectOrAttributePath }. LocalUniqueness = '(' 'LOCAL' ')' StructureAttribute-Name { '->' StructureAttribute-Name } ':' Attribute-Name { ',' Attribute-Name }. SetConstraint = 'SET' 'CONSTRAINT' [ '(' 'BASKET' ')' ] [ Constraint-Name ':' ] [ 'WHERE' Logical-Expression ':' ] Logical-Expression ';'.
Konsistenzbedingungen für eine bestimmte Klasse oder Assoziation können auch erst nachträglich, aber innerhalb desselben TOPIC (typischerweise nach der Definition einer Assoziation), definiert werden.
ConstraintsDef = 'CONSTRAINTS' 'OF' ViewableRef '=' { ConstraintDef } 'END' ';'.
3.13. Ausdrücke
Ausdrücke (Expression) werden z.B. als Argument von Funktionen oder in Konsistenz- und Selektionsbedingungen verwendet. Bei einem logischen Ausdruck (Logical-Expression) muss der Ergebnistyp Boolean sein. Ausdrücke beziehen sich auf ein Kontextobjekt, d.h. das Objekt, für das man die Bedingung formuliert. Ausgehend von diesem kann ein Attribut, ein Strukturelement, eine Funktion, etc. angesprochen werden. Solche Gegenstände sowie Vergleichsgrössen wie Konstanten und Laufzeitparameter fliessen als Faktoren in Prädikate ein. Prädikate können mittels Operatoren zu einem Ausdruck verknüpft werden.
Expression = Term. Term = Term0 [ '=>' Term0 ]. Term0 = Term1 { ( 'OR' | '+' | '-' ) Term1 }. Term1 = Term2 { ( 'AND' | '*' | '/' ) Term2 }. Term2 = Predicate [ Relation Predicate ]. Predicate = ( Factor | [ 'NOT' ] '(' Logical-Expression ')' | 'DEFINED' '(' Factor ')' ). Relation = ( '==' | '!=' | '<>' | '<=' | '>=' | '<' | '>' ).
Bemerkungen zur Bedeutung der Syntaxregeln:
-
Entsprechend der Syntaxregeln für die Terme bindet der Vergleich (Relation) am stärksten, dann
AND
bzw.*
und/
, dannOR
bzw.+
und-
, dann die Implikation (=>
).AND
undOR
können nur mit boolschen Prädikaten,+
,-
,*
und/
können nur mit numerischen Prädikaten verwendet werden. -
Mit
NOT
und dem darauf in Klammer folgenden logischen Ausdruck wird die Verneinung dieses Ausdrucks verlangt. -
Vergleich von Faktoren. Je nach Typ des Faktors sind einzelne Vergleiche ausgeschlossen:
-
Bei Zeichenkettentypen sind nur Gleichheit (
==
) und Ungleichheit (!=
,<>
) zulässig. Weitergehende Vergleiche sind mittels Funktionen zu realisieren. Dabei muss insbesondere genau definiert werden, wie regionale, sprachliche Besonderheiten wie Umlaute und Akzente behandelt werden. -
Bei numerischen Datentypen und strukturierten Wertebereichen sind die Vergleiche im üblichen Sinn definiert. Grösser- und Kleiner-Vergleiche sind bei zirkulären Datentypen nicht zweckmässig.
-
Koordinaten können als Ganzes nur auf Gleichheit oder Ungleichheit geprüft werden. Die anderen Vergleiche stehen nur für die einzelnen Komponenten zur Verfügung (s. untenstehenden Kommentar zu Syntaxregel Factor).
-
Bei Aufzählungen sind Grösser- und Kleiner-Vergleiche nur zulässig, wenn die Aufzählung als geordnet definiert wurde. Mit Gleichheit ist exakte Gleichheit gemeint. Sind auch alle Unterelemente eines Knotens gemeint, ist die Funktion isEnumSubVal zu verwenden.
-
Bei Linien kann nur geprüft werden, ob sie undefiniert (
== UNDEFINED
) sind. -
Ein Faktor kann auch ein Objekt bezeichnen. Dann kann auf Definiertheit und Gleichheit bzw. Ungleichheit geprüft werden.
-
-
Besteht ein Faktor nicht nur aus dem unmittelbaren Gegenstand sondern auch aus dem Pfad, der zu diesem führt, gilt der Gegenstand immer als undefiniert, wenn irgendein Attribut des Pfades nicht definiert ist. Die eingebaute Funktion
DEFINED (a.b)
ist damit gleichwertig mit(a.b != UNDEFINED)
. -
Ein Ausdruck wird von links nach rechts nur soweit ausgewertet bis dessen Resultatwert klar ist. Mit
OR
verbundene Folgeterme werden also nur ausgewertet, wenn der bisherige Wert falsch ist. MitAND
verbundene Folgeterme werden dementsprechend nur ausgewertet, wenn der bisherige Wert wahr ist. -
Numerische Ausdrücke (inkl. Koordinaten) sollen immer mit voller numerischer Genauigkeit (gemäss Norm IEEE-754) berechnet werden. Erst die resultierenden Werte sollen allenfalls gerundet werden (vgl. Kapitel 2.8, “Umgang mit Rundung von numerischen Werten und Koordinaten”).
Die Implikation (=>
) ist nur dann false, wenn der erste Term true und der zweite Term false ist. a => b
ist identisch mit folgender Formulierung: NOT(a) OR b
. Das wird typischerweise verwendet, um bedingte Einschränkungen zu formulieren. Zum Beispiel: Die Geometrie ist nur bei einem bestimmten Status obligatorisch.
CLASS A = Status: (gueltig, projektiert); Geometrie: SURFACE ...; MANDATORY CONSTRAINT Status == #gueltig => DEFINED(Geometrie); END A;
Faktoren können gemäss den folgenden Syntaxregeln gebildet werden:
Factor = ( ObjectOrAttributePath | ( Inspection | 'INSPECTION' Inspection-ViewableRef ) [ 'OF' ObjectOrAttributePath ] | FunctionCall | 'PARAMETER' [ Model-Name '.' ] RunTimeParameter-Name | Constant ). ObjectOrAttributePath = PathEl { '->' PathEl }. AttributePath = ObjectOrAttributePath. PathEl = ( 'THIS' | 'THISAREA' | 'THATAREA' | 'PARENT' | ReferenceAttribute-Name | AssociationPath | Role-Name [ '[' Association-Name ']' ] | Base-Name | AttributeRef ). AssociationPath = [ '\' ] AssociationAccess-Name. AttributeRef = ( Attribute-Name ( [ '[' ( 'FIRST' | 'LAST' | AxisListIndex-PosNumber ) ']' ] ) | 'AGGREGATES' ). FunctionCall = [ Model-Name '.' [ Topic-Name '.' ] ] Function-Name '(' [ Argument { ',' Argument } ] ')'. Argument = ( Expression | 'ALL' [ '(' RestrictedClassOrAssRef | ViewableRef ')' ] ).
Faktoren können sich auf Objekte und ihre Attribute beziehen. Dabei können schrittweise ganze Objektpfade gebildet werden. Jedes Konstrukt eröffnet den Weg vom jeweils aktuellen Objekt zum nächsten. Das erste aktuelle Objekt ergibt sich aus dem Kontext, z.B. ein Objekt der Klasse, für die eine Konsistenzbedingung definiert wird.
-
THIS
: Bezeichnet das so genannte Kontextobjekt, d.h. das aktuelle Objekt einer Klasse, einer Sicht oder einer Grafikdefinition, in dem ein Objektpfad verlangt wird.THIS
ist z.B. beim Aufruf einer Funktion als Argument anzugeben, dieANYCLASS
oderANYSTRUCTURE
als Parameter hat. -
THISAREA
undTHATAREA
: Bezeichnen die beiden Gebietsobjekte, auf dessen gemeinsamen Rand sich das aktuelle Linienzugsobjekt befindet. Der Einsatz vonTHISAREA
undTHATAREA
ist nur möglich im Rahmen der Inspektion einer Gebietseinteilung (vgl. Kapitel 3.15, “Sichten”). -
PARENT
: Bezeichnet das Ober-Strukturelement oder Ober-Objekt des aktuellen Strukturelementes oder Objektes. Die Sicht muss dazu eine gewöhnliche Inspektion (keine Gebietsinspektion) sein (vgl. Kapitel 3.15, “Sichten”). -
Referenzattribut-Angabe: Bezeichnet das Objekt, das vom aktuellen Objekt bzw. von der aktuellen Struktur aus über das gegebene Referenzattribut zugeordnet ist.
-
Rollenangabe: Die Rollenangabe ist gültig, wenn nur eine einzige entsprechende Rolle existiert. Die Rollenangabe kann dabei sowohl eine Ausgangsrolle (gemäss der das aktuelle Objekt mit der Beziehungsinstanz verbunden ist) wie eine Zielrolle (gemäss der die Beziehungsinstanz mit dem Bezugsobjekt verbunden ist) ansprechen. Ist die Rollenangabe durch den Beziehungsnamen ergänzt, kann sie nur Ausgangsrollen ansprechen. Je nach Stellung des Pfadelementes im Pfad werden die Rollen unterschiedlich gesucht. Ist die Rollenangabe das erste Pfadelement eines Pfades, wird die Rolle in allen Beziehungszugängen der Klasse gesucht, in deren Kontext der Pfad Anwendung findet. Ist die Rollenangabe ein Folgelement des Pfades, wird die Rolle in allen Assoziationen gesucht, die im Thema verfügbar sind, in dem die Klasse definiert ist, in deren Kontext der Pfad Anwendung findet. Dabei kommen nur diejenigen Assoziationen in Frage, die über Rollen mit der Klasse des Vorgängerobjektes des Pfades in Bezug stehen.
-
Basis-Sicht-Angabe: Mit dem (lokalen) Namen der Basis-Sicht wird in der aktuellen Sicht bzw. in der aktuellen abgeleiteten Beziehung das entsprechende (virtuelle) Objekt der Basis-Sicht bezeichnet.
Beim Bezug auf ein Attribut, meint man den Wert des Attributes des Kontextobjekts oder des durch den Pfad bezeichneten Objekts. Zusätzlich werden Pfade, die mit einem Attribut enden, als Attributpfade bezeichnet und auch unabhängig von Faktoren in verschiedenen Syntaxregeln verwendet.
-
Im Normalfall genügt die Angabe des Attributnamens.
-
Handelt es sich um ein Koordinatenattribut bezeichnet man durch Angabe der Nummer der Achse die entsprechende Komponente der Koordinate. Die erste Komponente hat den Index 1.
-
Das implizite Attribut
AGGREGATES
ist in Aggregationssichten (vgl. Kapitel 3.15, “Sichten”) definiert und bezeichnet den Satz (BAG OF
) der aggregierten Basisobjekte.
Bei geordneten Unterstrukturen (LIST OF
) können einzelne Elemente angesprochen werden. Zulässige Indizes sind:
-
FIRST
: das erste Element. -
LAST
: das letzte Element. -
Index-Nummer: Der angegebene Index muss kleiner oder gleich der in der Kardinalität festgelegten maximalen Anzahl sein. Das erste Element hat den Index 1. Ist er kleiner oder gleich der in der Kardinalität festgelegten minimalen Anzahl, existiert immer ein entsprechendes Element; ist er grösser ist die Existenz des Elementes nicht gewährleistet. Der Faktor kann als Folge undefiniert werden.
Ein Faktor kann auch eine Inspection sein (vgl. Kapitel 3.15, “Sichten”). Ist ihr ein Objektpfad vorangestellt, muss die damit gegebene Objektklasse mit derjenigen der Inspection übereinstimmen oder eine Erweiterung von dieser sein. Zur Menge der durch die Inspection gelieferten Strukturelemente gehören dann nur diejenigen, die zum Objekt gehören, das mit dem Objektpfad definiert ist.
Faktoren können auch Funktionsaufrufe sein. Als ihre Argumente kommen in Frage:
-
Ausdrücke: Der Typ des Ergebnisses des Ausdrucks muss mit dem Argumenttyp kompatibel sein.
-
Wird mit dem Ausdruck eine Rollenangabe gemacht, bezeichnet der Ausdruck die Menge der über die Rolle verbundenen Zielobjekte. Beim formalen Parameter muss
OBJECT OF
oderOBJECTS OF
(nur wenn auf Grund der Modellbeschreibung klar ist, dass nur ein Zielobjekt möglich ist) verlangt sein (vgl. Kapitel 3.14, “Funktionen”). -
Alle Objekte (
ALL
) der Klasse in deren Kontext der Funktionsaufruf erfolgt oder alle Objekte der angegebenen Klasse. Beim formalen Parameter mussOBJECTS OF
verlangt sein (vgl. Kapitel 3.14, “Funktionen”). Damit sind immer alle Objekte gemeint, die dieser Klasse oder ihren Erweiterungen entsprechen.
Als Vergleichswerte kommen Funktionsaufrufe, Laufzeitparameter (vgl. Kapitel 3.16, “Darstellungsbeschreibungen”) und Konstanten in Frage.
3.14. Funktionen
Eine Funktion wird mittels ihrem Namen, den formalen Parametern sowie einer kurzen Funktionsbeschreibung als Erläuterung definiert. Die Namen der Parameter haben nur dokumentarischen Wert.
Als formale Parameter und Funktionsresultat kommen in Frage:
-
Die für Attribute zulässigen Typen, insbesondere auch Strukturen. Als Argumente (d.h. aktuelle Parameter) kommen entsprechende Ausdrücke (Regel Expression) in Frage.
-
Wird dabei eine Struktur angegeben, kommen als Argumente primär Strukturelemente in Frage. Es können aber auch Objektpfade angegeben werden, die zu Objekten führen, die eine Erweiterung der Struktur ist. Insbesondere können bei
ANYSTRUCTURE
beliebige Objektpfade angegeben werden. -
Wird
OBJECT OF
angegeben, kommen als Argumente die mittels eines Objektpfads erreichbaren Objekte in Frage, die der Definition entsprechen. Insbesondere können beiOBJECT OF ANYCLASS
beliebige Objektpfade angegeben werden. Ähnlich wie bei den Bezügen zu anderen Objekten (vgl. Kapitel 3.6.3, “Referenzattribute”) können die zulässige Basisklasse und allfällige Einschränkungen definiert und in Erweiterungen spezialisiert werden. -
Wird
OBJECTS OF
angegeben, kommen als Argumente Mengen von Objekten einer Klasse in Frage. Alle Objekte der Menge müssen die beim formalen Argument gemachten Anforderungen bereits auf Grund der Modellbeschreibung erfüllen (die beim formalen Argument gemachte Anforderung wirkt also nicht als nachträglicher Filter). -
Wird
ENUMVAL
angegeben, kommen als Argumente Attribute und Konstanten in Frage, die ein Blatt einer beliebigen Aufzählung (vgl. Kapitel 3.8.2, “Aufzählungen”) bezeichnen. -
Wird
ENUMTREEVAL
angegeben, kommen als Argumente Attribute und Konstante in Frage, die einen Knoten oder ein Blatt einer beliebigen Aufzählung bezeichnen.
FunctionDef = 'FUNCTION' Function-Name '(' [ Argument-Name ':' ArgumentType { ';' Argument-Name ':' ArgumentType } ] ')' ':' ArgumentType [ Explanation ] ';'. ArgumentType = ( AttrTypeDef | ( 'OBJECT' | 'OBJECTS' ) 'OF' ( RestrictedClassOrAssRef | ViewRef ) | 'ENUMVAL' | 'ENUMTREEVAL' ).
Es sind folgende Standardfunktionen definiert:
-
FUNCTION myClass (Object: ANYSTRUCTURE): STRUCTURE;
liefert die Klasse des Objektes.
-
FUNCTION isSubClass (potSubClass: STRUCTURE; potSuperClass: STRUCTURE): BOOLEAN;
liefert true, wenn die Klasse des ersten Argumentes der Klasse oder einer Unterklasse des zweiten Argumentes entspricht.
-
FUNCTION isOfClass (Object: ANYSTRUCTURE; Class: STRUCTURE): BOOLEAN;
liefert true, wenn das Objekt des ersten Argumentes zur Klasse oder zu einer Unterklasse des zweiten Argumentes gehört.
-
FUNCTION elementCount (bag: BAG OF ANYSTRUCTURE): NUMERIC;
liefert die Anzahl Elemente, die der Bag (oder die Liste) enthält.
-
FUNCTION objectCount (Objects: OBJECTS OF ANYCLASS): NUMERIC;
liefert die Anzahl Objekte, welche die gegebene Objektmenge enthält.
-
FUNCTION len (TextVal: TEXT): NUMERIC; FUNCTION lenM (TextVal: MTEXT): NUMERIC;
liefert die Länge des Textes als Anzahl Zeichen.
-
FUNCTION trim (TextVal: TEXT): TEXT; FUNCTION trimM (TextVal: MTEXT): MTEXT;
liefert den um Leerzeichen am Anfang und Ende befreiten Text.
-
FUNCTION isEnumSubVal (SubVal: ENUMTREEVAL; NodeVal: ENUMTREEVAL): BOOLEAN;
liefert true, wenn SubVal ein Unterelement, also ein Unterknoten oder ein Blatt, des Knotens NodeVal ist.
-
FUNCTION inEnumRange (Enum: ENUMVAL; MinVal: ENUMTREEVAL; MaxVal: ENUMTREEVAL): BOOLEAN;
liefert true, wenn die Aufzählung zu der Enum gehört, geordnet ist und im Bereich von MinVal und MaxVal liegt. Unterelemente von MinVal oder MaxVal gelten als dazu gehörig.
-
FUNCTION convertUnit (from: NUMERIC): NUMERIC;
rechnet den numerischen Wert des Parameters "from" in den numerischen Rückgabewert um und berücksichtigt dabei die Einheiten, die mit dem Parameter und mit der Verwendung des Resultatwertes (typischerweise mit dem Attribut, dem das Resultat zugewiesen wird) verbunden sind. Diese Funktion darf nur angewendet werden, wenn die Argumente von "from" und vom Rückgabeparameter verträglich sind, d.h. wenn ihre Einheiten von einer gemeinsamen Einheit abgeleitet werden.
-
FUNCTION length (geom: POLYLINE): NUMERIC; FUNCTION multilength (geom: MULTIPOLYLINE): NUMERIC;
berechnet die Länge der Linie gemäss Parameter "geom".
-
FUNCTION surface (geom: SURFACE): NUMERIC; FUNCTION multisurface (geom: MULTISURFACE): NUMERIC;
berechnet den Inhalt der Fläche gemäss Parameter "geom" (
SURFACE
oderAREA
). -
FUNCTION areAreas (Objects: OBJECTS OF ANYCLASS; SurfaceBag: ATTRIBUTE OF @ Objects RESTRICTION (BAG OF ANYSTRUCTURE); SurfaceAttr: ATTRIBUTE OF @ SurfaceBag RESTRICTION (SURFACE)): BOOLEAN;
prüft, ob die Flächen gemäss Objektmenge (erster Parameter) und Attribut (dritter Parameter) eine Gebietseinteilung bilden. Ist das Flächenattribut direkt Teil der Objektklasse, soll für SurfaceBag
UNDEFINED
angegeben werden, ansonsten das Strukturattribut, welche das Flächenattribut enthält. -
FUNCTION areAreas2 (Objects: OBJECTS OF ANYCLASS; SurfaceBag: TEXT; SurfaceAttr: TEXT): BOOLEAN;
prüft, ob die Flächen gemäss Objektmenge (erster Parameter) und Attribut (dritter Parameter) eine Gebietseinteilung bilden. Ist das Flächenattribut direkt Teil der Objektklasse, soll für Surface-Bag
UNDEFINED
angegeben werden, ansonsten der Pfad zum Strukturattribut mit der Struktur, welche das Flächenattribut enthält. Der Attribut-Pfad soll dabei als TEXT-Konstante, aber in INTERLIS-Syntax, angegeben werden.Beispiel:SET CONSTRAINT areAreas2 (ALL,"Geometry->Surfaces","Surface");
-
FUNCTION areAreasWithoutGaps (Objects: OBJECTS OF ANYCLASS; SurfaceBag: ATTRIBUTE OF @ Objects RESTRICTION (BAG OF ANYSTRUCTURE); SurfaceAttr: ATTRIBUTE OF @ SurfaceBag RESTRICTION (SURFACE)): BOOLEAN; FUNCTION areAreasWithoutGaps2 (Objects: OBJECTS OF ANYCLASS; SurfaceBag: TEXT; SurfaceAttr: TEXT): BOOLEAN;
prüft, ob die Gebietseinteilung lückenlos ist, d.h. ob jeder Fläche der Gebietseinteilung (ausser der Restfläche) ein Objekt zugeordnet ist. Parameter wie bei areAreas bzw. areAreas2.
3.15. Sichten
Sichten (Views) sind Klassen und Strukturen, deren Objekte nicht originär sondern virtuell sind, da sie aus Objekten anderer Sichten oder Klassen bzw. Strukturen abgeleitet werden. Sichten werden unter anderem dazu verwendet, die Grundlagen für Grafiken und spezielle Konsistenzbedingungen zu formulieren. Eine weitere Anwendung ist die Weitergabe der Daten an Empfängersysteme in einer abgeleiteten, in der Regel vereinfachten Form.
Sichten werden nur transferiert, wenn sie in einem VIEW TOPIC
definiert sind. In diesem Fall erfolgt ihre Übertragung wie der vollständige Transfer (Schlüsselwort FULL
) von normalen Klassen, so dass sich ein Datenempfänger (vgl. Kapitel 4, “Sequentieller Transfer”) nicht darum zu kümmern braucht, wie die (virtuellen) Objekte erzeugt wurden. Sichten können auch explizit vom Transfer ausgeschlossen werden (TRANSIENT
), wenn sie nur lokale Bedeutung haben, d.h. wenn sie nur als Basis für andere Sichten dienen. Die inkrementelle Nachlieferung von Sichten ist ausgeschlossen, da Sichtobjekten keine Objektidentifikation zugeordnet wird.
Sichten können abstrakt (ABSTRACT
) oder konkret sein. Konkrete Sichten können auch auf abstrakten Grundlagen beruhen. Dabei können aber nur diejenigen Grundlagenattribute angesprochen werden, die konkret sind. Ist dies nicht der Fall, muss die Sicht selbst als abstrakt erklärt werden.
Sichten können auch erweitert werden (EXTENDED
oder EXTENDS
). Dabei ist es allerdings nicht möglich das Bildungsgesetz zu verändern. Die Erweiterung dient dazu, Erweiterungen der Sichten, Klassen und Strukturen, auf der die Sicht aufbaut, so zur Kenntnis zu nehmen, dass weitere Selektionen, Attribute und Konsistenzbedingungen formuliert werden können.
(1) ViewDef = 'VIEW' View-Name Properties<ABSTRACT,EXTENDED,FINAL,TRANSIENT> [ FormationDef | 'EXTENDS' ViewRef ] { BaseExtensionDef } { Selection } '=' [ ViewAttributes ] { ConstraintDef } 'END' View-Name ';'. ViewRef = [ Model-Name '.' [ Topic-Name '.' ] ] View-Name.
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) ist an dieser Stelle die Regel ViewAttributes abgebildet. Diese befindet sich jedoch bereits weiter hinten im Dokument und wird deshalb nicht erneut aufgeführt. Siehe dazu auch dieses Issue. |
In den einfachen Fällen, wo sich ein Attribut aus der Basis ergibt, genügt es den Attributnamen und nötigen Ausdruck (mit Verwendung von Basisattributen) anzugeben.
Obiger Satz erscheint in leicht abgeänderter Form doppelt im Referenzhandbuch (Version 2.1.0). Die andere Stelle befindet sich hier. |
Mit dem Bildungsgesetz (FormationDef) einer Sicht wird definiert, wie und aus welchen Grundlagen die virtuellen Objekte der Sicht gebildet werden.
Die Sicht-Projektion (Schlüsselwort PROJECTION OF
) ist die einfachste Sicht. Mit ihr wird die Basis-Klasse (Klasse, Struktur oder Sicht) in veränderten Form (z.B. Attribute nur teilweise und in veränderter Reihenfolge) gesehen.
Mit der Verbindung (Schlüsselwort JOIN OF
) wird das kartesische Produkt (oder Kreuzprodukt) der Basis-Klassen (Klasse oder Sicht) gebildet, d.h. es gibt so viele Objekte der Verbindungs-Klasse wie es Kombinationen von Objekten der verschiedenen Basis-Klassen gibt. Es können auch so genannte «Outer-Joins», also Verbindungen von Objekten der ersten Basisklasse mit (an sich inexistenten) Leerobjekten der weiteren Basisklassen definiert werden (Angabe “(OR NULL)”). Solche Leerobjekte werden beigefügt, wenn zu einer bestimmten Kombination der vorangegangenen Objekte kein Objekt der gewünschten weiteren Klasse gefunden wird. Alle Attribute des Leerobjektes sind undefiniert. Die entsprechenden Sicht-Attribute dürfen darum nicht obligatorisch sein.
Die Vereinigung (Schlüsselwort UNION OF
) ermöglicht die Verschmelzung verschiedener Basis-Klassen zu einer einzigen Klasse. Einem Attribut der Vereinigungs-Sicht werden typischerweise die Attribute der verschiedenen Basis-Klassen zugewiesen. Der Attributtyp der Basis-Klasse muss mit demjenigen der Vereinigungs-Sicht verträglich sein (gleicher Typ oder Erweiterung davon).
Mit der Zusammenfassung (Schlüsselwort AGGREGATION OF
) werden alle oder diejenigen Instanzen einer Basismenge zu einer Instanz zusammengefasst, bei denen die verlangte Attributkombination identisch ist. Innerhalb der Aggregationssicht steht mittels dem impliziten Attribut AGGREGATES
(vgl. Kapitel 3.13, “Ausdrücke”) der zugehörige Satz von Originalobjekten als BAG
zur Verfügung. Dieses implizite Attribut gehört nicht zu den eigentlichen Attributen der Sicht und wird darum auch dann nicht transferiert, wenn ein Transfer verlangt ist. Es kann z.B. einem entsprechenden Attribut der Aggregationssicht zugewiesen oder als Argument einer Funktion übergeben werden.
Mit der Aufschlüsselung (Schlüsselwort INSPECTION OF
) erhält man die Menge aller Strukturelemente (mit BAG OF
oder LIST OF
oder gemäss Linie, Einzelfläche oder Gebietseinteilung definierte), die zu einem (direkten oder indirekten) Unterstrukturattribut einer Objekt-Klasse gehören.
Die normale Inspection auf ein Gebietseinteilungsattribut bzw. die Inspection eines Flächenattributs liefert die Ränder aller Gebiete bzw. Flächen dieser Klasse (Struktur SurfaceBoundary). Die Linienzüge jedes Randes (Struktur SurfaceEdge) werden dabei so gebildet, dass ihre Anzahl minimal ist. Aufeinanderfolgende Linienzüge werden also zu einem Linienzug zusammengefasst. Wird eine weitere Inspection auf das Attribut Lines gemacht, erhält man ebenfalls alle Linienzüge (Struktur SurfaceEdge). Auf diese Art kommen sie aber im Falle der Gebietseinteilung doppelt vor (einmal für jedes beteiligte Gebietsobjekt).
Mit der Inspection einer Gebietseinteilung (Schlüsselwort AREA INSPECTION OF
) erhält man die Linienzüge der Ränder der zur Gebietseinteilung gehörenden Gebiete genau einmal (als Struktur SurfaceEdge). Die beiden Gebiete, die von einem gemeinsamen Linienzug berandet werden, können mit THISAREA
bzw. THATAREA
angesprochen werden (vgl. Kapitel 3.13, “Ausdrücke”). Die Linienzüge (Struktur SurfaceEdge) werden wie bei der normalen Inspection möglichst zusammengefasst geliefert.
STRUCTURE SurfaceEdge = Geometry: DIRECTED POLYLINE; END SurfaceEdge; STRUCTURE SurfaceBoundary = Lines: LIST OF SurfaceEdge; END SurfaceBoundary;
Die Inspection eines Linienattributes (POLYLINE
) liefert in folgender Struktur alle Kurvenstücke (LineSegments), aus denen die Linienzugsobjekte dieser Klasse zusammengesetzt sind:
STRUCTURE LineGeometry = Segments: LIST OF LineSegment; MANDATORY CONSTRAINT isOfClass (Segments[FIRST],INTERLIS.StartSegment); END LineGeometry;
Dies heisst, dass das erste Kurvenstück ein so genanntes StartSegment der Länge 0 darstellt und alle übrigen, als so genannte LineSegments, entweder Strecken, Kreisbogen oder Kurvenstücke eines anderen Typs sind, gemäss der in der Struktur festgelegten Definition.
Mit INTERLIS wird nur eine konzeptionelle Beschreibung der Sicht gemacht. Es wird ausdrücklich nichts unternommen, um eine effiziente Realisierung der Sichten zu unterstützen. Sichten generieren gehört deshalb auch zu einer speziellen Erfüllungsstufe.
FormationDef = ( Projection | Join | Union | Aggregation | Inspection ) ';'. Projection = 'PROJECTION' 'OF' RenamedViewableRef. Join = 'JOIN' 'OF' RenamedViewableRef (* ',' RenamedViewableRef [ '(' 'OR' 'NULL' ')' ] *). Union = 'UNION' 'OF' RenamedViewableRef (* ',' RenamedViewableRef *). Aggregation = 'AGGREGATION' 'OF' RenamedViewableRef ( 'ALL' | 'EQUAL' '(' UniqueEl ')' ). Inspection = [ 'AREA' ] 'INSPECTION' 'OF' RenamedViewableRef '->' StructureOrLineAttribute-Name { '->' StructureOrLineAttribute-Name }.
Alle in einer Sicht verwendeten Basissichten erhalten innerhalb der verwendenden Sicht einen Namen, unter dem sie angesprochen werden können. Dieser Name entspricht dem Namen der Basissicht, sofern keine Umbenennung mittels eines expliziten (lokalen) Base-Namens definiert wird. Eine solche Umbenennung ist insbesondere nötig, wenn Verbindungen definiert werden, bei denen mehrmals die gleiche Basisklasse angesprochen wird.
RenamedViewableRef = [ Base-Name '~' ] ViewableRef. ViewableRef = [ Model-Name '.' [ Topic-Name '.' ] ] ( Structure-Name | Class-Name | Association-Name | View-Name ).
Will man in einer Sicht bzw. einer Sichterweiterung Erweiterungen von Basisklassen berücksichtigen und damit zusätzliche Attribute, Selektionen oder Konsistenzbedingungen formulieren, muss eine entsprechende Erweiterungsdefinition (BaseExtensionDef) aufgeführt werden. Sie geht von einer bereits definierten Basissicht aus und beschreibt die Erweiterungen (müssen Erweiterungen der bisherigen Basissicht sein) selbst wieder als Basissichten. Wird eine solche Sichterweiterung innerhalb von Ausdrücken verwendet, liefert sie den Wert "UNDEFINED", wenn das zum virtuellen Objekt gehörige Basisobjekt nicht zu dieser Sichterweiterung passt.
BaseExtensionDef = 'BASE' Base-Name 'EXTENDED' 'BY' RenamedViewableRef { ',' RenamedViewableRef }.
Die durch das Bildungsgesetz definierte Menge der Sichtobjekte kann mittels Bedingungen (Schlüsselwort WHERE
) zusätzlich eingeschränkt werden.
Selection = 'WHERE' Logical-Expression ';'.
Was die Attribute (und damit die Empfängersicht) und die Konsistenzbedingungen betrifft, sind Sichten grundsätzlich gleich aufgebaut, wie Klassen und Strukturen. Im Sinne einer Schreiberleichterung wird zusätzlich die Möglichkeit angeboten, alle Attribute und Rollen einer Sichtbasis in der gleichen Reihenfolge zu übernehmen (ALL OF
). Dies ist bei Vereinigungen und bei AREA-Inspektionen unsinnig und darum auch unzulässig.
ViewAttributes = [ 'ATTRIBUTE' ] { 'ALL' 'OF' Base-Name ';' | AttributeDef | Attribute-Name Properties <ABSTRACT,EXTENDED,FINAL,TRANSIENT> ':=' Expression ';' }.
In den einfachen Fällen, wo ein Attribut einer Basissicht übernommen wird, genügt es den Attributnamen und die Zuordnung des Basisattributes anzugeben. Solche Definitionen sind immer final, können also nicht mehr erweitert werden.
Obiger Satz erscheint in leicht abgeänderter Form doppelt im Referenzhandbuch (Version 2.1.0). Die andere Stelle befindet sich hier. |
Bei Vereinigungen muss für jedes Attribut vollständig angegeben werden, aus welchen Attributen der Basis-Klassen es abgeleitet wird. Ein Attribut muss sich aber nicht auf alle Basis-Klassen beziehen, sofern der Attributtyp undefinierte Werte zulässt. Für die fehlenden Basis-Objekte gilt es als undefiniert.
Das folgende Beispiel zeigt, wie eine Sicht beschrieben werden kann, die ermöglicht, mit Hilfe des Konstrukts DERIVED FROM
eine eigentliche Beziehung zu definieren (vgl. Kapitel 3.7, “Eigentliche Beziehungen”).
DOMAIN CHSurface = ... ; FUNCTION Intersect (Surface1: CHSurface; Surface2: CHSurface): BOOLEAN; CLASS A = a1: CHSurface; END A; CLASS B = b1: CHSurface; END B; VIEW ABIntersection JOIN OF A,B; WHERE Intersect (A.a1,B.b1); = END ABIntersection; ASSOCIATION IntersectedAB DERIVED FROM ABIntersection = ARole –- A := ABIntersection -> A; BRole –- B := ABIntersection -> B; END IntersectedAB;
3.16. Darstellungsbeschreibungen
Eine Darstellungsbeschreibung besteht aus Grafikdefinitionen, die immer auf einer Sicht oder einer Klasse basieren (Schlüsselwort BASED ON
). Mit einer Grafikdefinition wird konzeptionell versucht, jedem Objekt dieser Sicht oder Klasse – sofern es nicht mit einer Selektion (Schlüsselwort WHERE
), die sich auf die Sicht oder Klasse bezieht, noch ausgefiltert wurde – durch eine oder mehrere Zeichnungsregeln (Regel DrawingRule) je eine Grafiksignatur zuzuordnen (Punktsymbol, Linie, Flächenfüllung, Textanschrift) und damit ein oder mehrere Grafikobjekte zu erzeugen, welche die entsprechende Darstellung auslösen (siehe Abbildung 5). Dazu muss jede Zeichnungsregel eine Grafiksignatur (mit Metaobjekt-Namen) auswählen und Argumente festlegen für die dazugehörigen Parameter.
In runden Klammern (Regel Properties) können die Vererbungseigenschaften definiert werden. Ist eine Grafikdefinition abstrakt, entstehen aus ihr keine Grafikobjekte. Die Erweiterung einer Grafikdefinition muss auf der gleichen Klasse basieren wie die Basisgrafikdefinition (BASED ON
fehlt) oder auf einer ihrer Erweiterungen.
Die Zeichnungsregel wird mit einem Namen identifiziert, der innerhalb der Darstellungsbeschreibung eindeutig ist, damit sie in Erweiterungen aufgegriffen und verfeinert werden kann (Anmerkung: verfeinert im Sinne der Spezialisierung aber auch zusätzlicher Parameterwerte). Existieren zu einer Zeichnungsregel Erweiterungen (in erweiternden Darstellungsbeschreibungen), erzeugen diese keine neuen Grafikobjekte, sondern beeinflussen nur die Signaturparameter des durch die Basisdefinition vorgegebenen Grafikobjektes. Es ist zulässig zu einer Grafikdefinition mehrere Erweiterungen zu definieren. Sie werden alle (in der Reihenfolge ihrer Definition) ausgewertet. Dies kann insbesondere genutzt werden, um für verschiedene Aspekte (z.B. die verschiedenen Zeichnungsregeln) verschiedene Erweiterungsstapel vorzusehen. Anschliessend werden die verschiedenen Signaturparameter bestimmt. Die Definition kann dabei in mehreren Schritten erfolgen. Für jeden Parameter gilt derjenige Wert, der als letztes definiert wurde. Dabei wird zuerst die primäre Definition ausgewertet, dann allfällige Erweiterungen. Parameter-Zuweisungen können zudem noch an eine Bedingung (Regel CondSignParamAssignment) geknüpft werden, d.h. die Zuweisung erfolgt nur, wenn die Bedingung erfüllt ist. Wird die Selektionsbedingung nicht erfüllt, fallen auch allfällige Untererweiterungen ausser Betracht. Innerhalb von Zuweisungsregeln (Syntaxregel CondSignParamAssignment) gilt für Attribut- und Rollennamen der Namensraum der Basisklasse oder -Sicht und für Metaobjekt-, Funktions- und Laufzeitparameternamen der Namensraum der Grafikdefinition.
Sobald Zeichnungsregeln konkret sind, muss definiert sein, zu welcher Klasse die zuzuordnenden Grafiksignaturen gehören. In Erweiterungen von Zeichnungsregeln kann diese Klasse von Grafiksignaturen durch eine Klasse ersetzt werden, welche eine Erweiterung der bisherigen ist. "Verantwortliche" Klasse von Grafiksignaturen ist zunächst diejenige, zu der die zugeordnete Grafiksignatur-Objekt (ein Metaobjekt) gehört. Den in der "verantwortlichen" Klasse eingeführten Parameter müssen die konkreten Werte zugewiesen werden. Entsprechen die angegebenen Parameter einer erweiterten Klasse von Grafiksignaturen, wird diese zur "verantwortlichen" Klasse, sofern die Klasse der Grafiksignatur der Zeichnungsregel mit ihr übereinstimmt oder eine Erweiterung von ihr ist.
In den erwähnten Bedingungen dürfen Objekt-Attribute (s. AttributePath in Regel SignParamAssignment) auch mit Laufzeit-Parametern verglichen werden (vgl. Kapitel 3.11, “Laufzeitparameter”). Laufzeitparameter, die für die Grafik relevant sind (z.B. der Massstab der gewünschten Grafik), werden typischerweise in Symbologiemodellen definiert, da sie wie die Parameter der Signaturen die von einem System erwarteten Grafikfähigkeiten beschreiben. Für einen Parameter einer Grafiksignatur, der ein Metaobjekt verlangt, muss eine Metaobjekt-Referenz angegeben werden (vgl. Kapitel 3.10, “Umgang mit Metaobjekten”).
Der Wert eines gewöhnlichen Parameters einer Grafiksignatur wird als Konstante oder als Verweis auf ein Objekt-Attribut angegeben (s. Factor in Regel SignParamAssignment). Dabei wird immer auf das Attribut eines Objektes aus der Basis-Klasse oder Basis-Sicht verwiesen, welches mit Hilfe von BASED ON
spezifiziert wurde.
Da die Darstellung häufig von Attributen abhängt, die mittels Aufzählungen definiert sind, wird dafür ein spezielles Konstrukt angeboten: Der Aufzählbereich. Ein Aufzählbereich ist entweder ein einzelner Knoten des Aufzähltyp-Baums oder ein Intervall von Knoten definiert durch zwei Knoten der gleichen Stufe. Intervalldefinitionen sind allerdings nur zulässig, wenn es sich um einen geordneten Aufzähltyp handelt. Wenn der Attributwert in einem der angegebenen Aufzählbereiche liegt, wird der entsprechende Parameter-Wert gesetzt. Die konkreten Signaturen ergeben sich aus dem Signaturenmodell. Dort werden die Signaturklassen samt den für ihre Anwendung nötigen Laufzeitparametern (Schlüsselwort PARAMETER
) definiert. Es ist zulässig, dass numerische Datentypen nur abstrakt definiert sind.
GraphicDef = 'GRAPHIC' Graphic-Name Properties<ABSTRACT,FINAL> [ 'EXTENDS' GraphicRef ] [ 'BASED' 'ON' ViewableRef ] '=' { Selection } { DrawingRule } 'END' Graphic-Name ';'. GraphicRef = [ Model-Name '.' [ Topic-Name '.' ] ] Graphic-Name. DrawingRule = DrawingRule-Name Properties<ABSTRACT,EXTENDED,FINAL> [ 'OF' Sign-ClassRef ] ':' CondSignParamAssignment { ',' CondSignParamAssignment } ';'. CondSignParamAssignment = [ 'WHERE' Logical-Expression ] '(' SignParamAssignment { ';' SignParamAssignment } ')'. SignParamAssignment = SignParameter-Name ':=' ( '{' MetaObjectRef '}' | Factor | 'ACCORDING' Enum-AttributePath '(' EnumAssignment { ',' EnumAssignment } ')' ). EnumAssignment = ( '{' MetaObjectRef '}' | Constant ) 'WHEN' 'IN' EnumRange. EnumRange = EnumerationConst [ '..' EnumerationConst ].
Für die Verwendung in Signaturenmodellen ist die Klasse SIGN durch INTERLIS vordefiniert:
CLASS SIGN (ABSTRACT) EXTENDS METAOBJECT = PARAMETER Sign: METAOBJECT; END SIGN;
Für konkrete Signaturenklassen ist diese Basis-Klasse zu erweitern. Dabei werden einerseits die konkreten Daten, andererseits die Parameter definiert.
Das folgende Beispiel skizziert, wie aus einer Punktklasse mit Koordinaten, Zeichenkette und einer Aufzählung als Attribute die entsprechenden Grafiken (Punktsymbole und Textanschriften) definiert werden.
Das Signaturenmodell sei wie folgt definiert:
SYMBOLOGY MODEL SimpleSignsSymbology (en) AT "http://www.interlis.ch/" VERSION "2005-06-16" = DOMAIN S_COORD2 (ABSTRACT) = COORD NUMERIC, NUMERIC; TOPIC SignsTopic = CLASS Symbol EXTENDS INTERLIS.SIGN = PARAMETER Pos: MANDATORY S_COORD2; END Symbol; CLASS Textlabel EXTENDS INTERLIS.SIGN = PARAMETER Pos: MANDATORY S_COORD2; Text: MANDATORY TEXT; END Textlabel; END SignsTopic; END SimpleSignsSymbology.
Zu diesem Signaturenmodell seien konkrete (Signaturen-)Objekte erfasst und unter dem Signaturenbibliotheks-Namen (d.h. Behälter-Namen) SimpleSignsBasket abgelegt worden. Die erfassten Signaturobjekte (Klasse Symbol) heissen Punktsignatur, Quadratsignatur und Kreissignatur, die Schriftarten (Klasse Textlabel) Schrift1 und Schrift2.
MODEL DatenModell (de) AT "http://www.interlis.ch/" VERSION "2005-06-16" = DOMAIN LKoord = COORD 0.000 .. 200.000 [m], 0.000 .. 200.000 [m], ROTATION 2 -> 1; TOPIC PunktThema = DOMAIN Punktart = (Stein (gross, klein), Bolzen, Rohr, Kreuz, unvermarkt) ORDERED; CLASS Punkt = Lage: LKoord; !! LKoord sei ein Koordinaten-Wertebereich Art: Punktart; PunktName: TEXT*12; END Punkt; END PunktThema; END DatenModell. MODEL SimpleGrafik (de) AT "http://www.interlis.ch/" VERSION "2005-06-16" = IMPORTS DatenModell; IMPORTS SimpleSignsSymbology; SIGN BASKET SimpleSignsBasket ~ SimpleSignsSymbology.SignsTopic; TOPIC PunktGrafikenThema = DEPENDS ON DatenModell.PunktThema; GRAPHIC SimplePunktGrafik BASED ON DatenModell.PunktThema.Punkt = Symbol OF SimpleSignsSymbology.SignsTopic.Symbol: ( Sign := {Punktsignatur}; Pos := Lage ); END SimplePunktGrafik; END PunktGrafikenThema; END SimpleGrafik.
Mit dieser Grafik (basierend auf dem Symbologiemodell SimpleSignsSymbology und auf der Darstellungsbeschreibung SimpleGrafik) werden für alle Punkte aus Klasse Punkt einfache Punktsignaturen (dots) gezeichnet.
Nun kann man sich auch vorstellen, dass jemand eine verbesserte Grafik wünscht. Die Verbesserung kann dabei in verschiedener Hinsicht erfolgen, zum Beispiel:
-
Es soll zusätzliche Signaturen geben (Punktsignaturen Kreuzsignatur, Dreiecksignatur). Dafür braucht es eine zusätzliche Signaturenbibliothek mit dem Namen SimpleSignsPlusBasket. Da sie die Bibliothek SimpleSignsBasket erweitert, werden die Signaturobjekte (bzw. Metaobjekte) in beiden Bibliotheken gesucht. Würde man die Bibliothek SimpleSignsBasket direkt erweitern (
EXTENDED
) würde für alle im Modell GrafikPlus erzeugten Grafiken — inklusive derjenigen, die vom Modell SimpleGrafik geerbt wurden — die Signaturen zuerst in der erweiterten Bibliothek, dann in der Basisbibliothek (SimpleSignsBasket) gesucht. -
Die Signaturen sollen skalierbar sein, damit z.B. grosse und kleine Quadrate mit der gleichen Punktsignatur erstellt werden können. Dafür braucht es ein erweitertes Signaturenmodell, in dem der Skalierungsmassstab der Signaturen als Parameter definiert ist. Da die Signaturklassen keine zusätzlichen Attribute aufweisen, müssen nicht notwendigerweise entsprechende Bibliotheken existieren.
-
Je nach Punktart sollen verschiedene Punktsignaturen gezeichnet werden: Steine als grosse bzw. kleine Quadrate, Bolzen als Kreise und Kreuze und Rohre mit der Kreuzsignatur. Die eigentliche Punktsignatur kann direkt aus der Punktart abgeleitet werden. Der Skalierungsfaktor für kleine Quadrate zur Darstellung von kleinen Steinen, wird mit einer zusätzlichen Zuweisung erreicht. Unvermarkte Punkte werden weiterhin als einfache Punktsignaturen gezeichnet. Darum braucht es für diesen Fall keine neue Zuweisung.
SYMBOLOGY MODEL ScalableSignsSymbology (en) AT "http://www.interlis.ch/" VERSION "2005-06-16" = IMPORTS SimpleSignsSymbology; TOPIC ScalableSignsTopic EXTENDS SimpleSignsSymbology.SignsTopic = CLASS Symbol (EXTENDED) = PARAMETER ScaleFactor: 0.1 .. 10.0; !! Default 1.0 END Symbol; END ScalableSignsTopic; END ScalableSignsSymbology. MODEL GrafikPlus (de) AT "http://www.interlis.ch/" VERSION "2005-06-16" = IMPORTS SimpleGrafik; IMPORTS SimpleSignsSymbology; IMPORTS ScalableSignsSymbology; SIGN BASKET SimpleSignsPlusBasket EXTENDS SimpleGrafik.SimpleSignsBasket ~ ScalableSignsSymbology.ScalableSignsTopic; TOPIC PunktGrafikenPlusTop EXTENDS SimpleGrafik.PunktGrafikenThema = GRAPHIC PunktGrafikPlus EXTENDS SimplePunktGrafik = Symbol (EXTENDED) OF ScalableSignsSymbology.ScalableSignsTopic.Symbol: ( Sign := ACCORDING Art ( {Quadratsignatur} WHEN IN #Stein, {Kreissignatur} WHEN IN #Bolzen, {Kreuzsignatur} WHEN IN #Rohr .. #Kreuz ) ), WHERE Art == #Stein.klein ( ScaleFactor := 0.5 ); Text OF SimpleSignsSymbology.Signs.Textlabel: ( Sign := {Schrift1}; Pos := Lage; Text := PunktName ); END PunktGrafikPlus; END PunktGrafikenPlusTop; END GrafikPlus.
4. Sequentieller Transfer
4.1. Einleitung
In diesem Kapitel wird der sequentielle INTERLIS-Transferdienst beschrieben. Damit können Datenbestände zwischen verschiedenen Systemen systemneutral ausgetauscht werden. Der INTERLIS-Transferdienst unterstützt den vollständigen wie auch den inkrementellen (bzw. differenziellen) Austausch von Datenbeständen (Replikation). Der Transferdienst kann auf jedes INTERLIS-Modell angewendet werden. Damit ist es z.B. möglich Daten (Datenmodell) und Signaturobjekte (Signaturenmodell) mit dem gleichen Mechanismus zu transferieren.
Im Moment ist der INTERLIS-Transferdienst als Austausch von XML-Dateien definiert (www.w3.org/XML/). Zur breiteren Nutzung dieser INTERLIS-XML-Dateien ist es unter anderem auch möglich, XML-Schema-Dokumente (www.w3.org/XML/Schema) zu erzeugen. In Zukunft ist es jedoch denkbar, dass weitere INTERLIS-Transferdienste definiert werden (z.B. auf Basis Webservices oder CORBA). Aus diesem Grund ist die Beschreibung des INTERLIS-Transferdienstes in die Unterabschnitte Allgemeine Regeln und XML-Codierung unterteilt. Die allgemeinen Regeln gelten für jeden sequentiellen INTERLIS-Transferdienst, unabhängig von der konkreten Codierung oder Übermittlung. Die Regeln unter XML-Codierung gelten speziell für XML-formatierte INTERLIS-Transferdateien.
4.2. Allgemeine Regeln für den sequentiellen Transfer
4.2.1. Ableitbarkeit aus dem Datenmodell
Jeder INTERLIS-Transfer kann aus dem dazugehörigen INTERLIS-Datenmodell durch die Anwendung von Regeln abgeleitet werden (modell-basierter Datentransfer).
4.2.2. Aufbau eines Transfers: Vorspann
Ein INTERLIS-Transfer ist ein sequentieller Objektstrom. Der Objektstrom ist in die Teile Vorspann und Datenbereich unterteilt.
Im Vorspann sind mindestens folgende Angaben zum Transfer enthalten:
-
Angabe der aktuellen INTERLIS-Versionsnummer (vgl. Kapitel 3.3, “Hauptregel”).
-
Verweis auf das/die zugehörige(n) Datenmodell(e).
-
Bezeichnung des Absenders (SENDER).
Optional können im Vorspann Angaben zum Herausgeber des Objektidentifikatoren-Aufbaus erfolgen.
Optional können im Vorspann Kommentare enthalten sein.
Der Aufbau des Datenbereichs ist in den folgenden Abschnitten näher beschrieben.
4.2.3. Transferierbare Objekte
Im Datenbereich können Objekte (d.h. Objektinstanzen) von konkreten Klassen, Beziehungen, Sichten und Grafikdefinitionen transferiert werden. Objekte von Sichten werden auf dem Transfer wie Objekte von konkreten Klassen behandelt. Die inkrementelle Nachlieferung von Sichten ist vorläufig nicht möglich. Objekte von Sichten werden nur transferiert, wenn die zugehörigen Sichten innerhalb eines VIEW TOPIC deklariert wurden, sonst werden sie nicht übermittelt. Ausserdem werden Sichten nicht übermittelt, wenn sie mit TRANSIENT markiert wurden.
4.2.4. Reihenfolge der Objekte im Datenbereich
Der Datenbereich besteht aus einer Folge von Behältern (Themen-Instanzen). Behälter können nur vollständig übertragen werden. Bei inkrementeller Nachlieferung werden nur die geänderten bzw. gelöschten Objekte übertragen. Zusammen mit der Vorgeschichte wird jedoch auch bei der inkrementellen Nachlieferung konzeptionell der ganze Behälter übertragen. Es ist grundsätzlich möglich, dass ein Transfer Behälter aus verschiedenen Modellen enthält. Ein Behälter enthält wiederum alle seine Objekte. Die Reihenfolge der Objekte im Transfer ist beliebig, insbesondere müssen die Objekte innerhalb eines Behälters nicht unbedingt nach Beziehungen geordnet oder nach Klassen gruppiert sein (im Gegensatz zu INTERLIS 1). Leere Behälter müssen nicht übertragen werden.
4.2.5. Codierung der Objekte
Im Objektstrom erhält jeder Behälter und jedes Objekt eine Identifikation. Die Identifikationen von Behältern und Objekten müssen über den gesamten Transfer eindeutig sein. Zu jedem Objekt wird ausserdem die Behälter-Identifikation mitgeliefert, in dem das Objekt ursprünglich erzeugt wurde (Originalbehälter). Bei inkrementeller Nachlieferung, bzw. beim initialen Transfer, muss die Identifikation des Behälters und der Objektinstanz generell und stabil sein, d.h. ein Objektidentifikator (vgl. Anhang F Aufbau von Objektidentifikatoren (OID)).
Alle Objektattribute (inkl. COORD, SURFACE, AREA, POLYLINE, STRUCTURE, BAG OF, LIST OF, etc.) werden unmittelbar zum Objekt gespeichert. Attribute vom Typ AREA werden wie Attribute vom Typ SURFACE codiert. Attribute vom Typ BAG werden wie Attribute vom Typ LIST codiert. STRUCTURE wird wie LIST {1} codiert.
Als Zeichenvorrat für die Übermittlung von Attributwerten stehen standardmässig nur die druckbaren Zeichen des US-ASCII Zeichensatzes (32 bis 126) und die Zeichen gemäss Anhang D Zeichentabelle zur Verfügung.
4.2.6. Transferarten
Zu jedem Behälter müssen folgende Angaben geliefert werden:
-
Angaben zur Art (KIND) des Transfers: FULL, INITIAL oder UPDATE.
-
Angaben zum Anfangs- (STARTSTATE) bzw. Endzustand (ENDSTATE) der Nachlieferung (nur bei Transferart INITIAL (ENDSTATE) oder UPDATE (STARTSTATE und ENDSTATE)).
-
Angaben zur Konsistenz des Inhaltes: COMPLETE, INCOMPLETE.
Es ist zulässig, dass im gleichen Transfer Behälter mit verschiedenen Transferarten (FULL, INTIAL und/oder UPDATE) vorkommen. Die Transferarten haben folgende Bedeutung:
-
FULL – Vollständiger Transfer. Beim Erhalt eines FULL-Behälters muss der Empfänger einen neuen Behälter zuerst initialisieren und dann alle Objekte mit INSERT in den Behälter einfügen. FULL ist als Basis für Nachlieferungen ungeeignet, da die Objektidentifikationen nur für diesen Transfer gültig sind. Transferdateien gemäss INTERLIS 1 entsprechen FULL. In der Transferart FULL kann nur die Operation INSERT vorkommen.
-
INITIAL – Erstlieferung. Entspricht der Transferart FULL mit dem Unterschied, dass der Behälter und die darin enthaltenen Objekte generelle und stabile OID besitzen müssen. In der Transferart INITIAL kann ebenfalls nur die Operation INSERT vorkommen.
-
UPDATE – Nachlieferung. Ein UPDATE-Behälter enthält Objekte mit INSERT-, UPDATE- oder DELETE-Operationen. Alle Objekte und der Behälter besitzen generelle und stabile OID. UPDATE-Behälter dürfen vom Zielsystem nur verarbeitet werden, wenn der Anfangszustand (STARTSTATE) des Behälters bereits mit INITIAL oder UPDATE empfangen wurde.
Für die Transferart UPDATE gelten ausserdem folgende zusätzlichen Transferregeln:
-
Das Empfängersystem kann davon ausgehen, dass nach der vollständigen Verarbeitung aller Daten eines UPDATE-Behälters wieder ein konsistenter Zustand herrscht, d.h. ein UPDATE-Behälter führt einen Behälter von einem konsistenten Zustand STARTSTATE in einen anderen konsistenten Zustand ENDSTATE über.
-
Ein UPDATE-Behälter ist für sich allein gesehen nicht konsistent, da Beziehungen meist nur zusammen mit der Vorgeschichte aufgelöst werden können.
Ausserdem muss zu jedem Objekt die Nachlieferungsoperation angegeben werden (vgl. Kapitel 2.4.5, “Behälter, Replikation und Datentransfer”). Die Operationen INSERT, UPDATE und DELETE bedeuten folgendes:
-
Die Operation INSERT hat die Bedeutung von «neues Objekt einfügen» (insert object).
-
Die Operation UPDATE bedeutet «Objektattributwerte aufdatieren» (update object). Es müssen alle Attribute (nicht nur die geänderten) geliefert werden.
-
Die Operation DELETE bedeutet «Objekt löschen» (delete object). Es sollen alle Attribute (nicht nur der OID) geliefert werden.
In vielen Fällen muss nicht ein ganzer Datenbestand, sondern nur ein Ausschnitt daraus transferiert werden. Als Folge der Ausschnittbildung können Geometrien (Polylinien und Flächen) unvollständig sein. Damit dies ohne ein zusätzliches Modell möglich ist, sollen Objekte (und als Folge der jeweilige Behälter) als INCOMPLETE markiert werden können.
4.2.7. Normative Referenzen
In der nachfolgenden XML-Codierung bzw. Herleitung des XML-Schema wird auf diverse externe Dokumentationen verwiesen, welche hier zusammengefasst sind:
{1} W3C: XML 1.0 Spezifikation, Ausgabe 2008
{2} W3C: XML Schema 1.1 Spezifikation, Ausgabe 2012
{3} IETF: RFC 3629, UTF-8 Spezifikation
{4} IETF: RFC 2045, Abschnitt 6.8 (Base64 Codierung)
4.3. XML-Codierung
4.3.1. Einleitung
Im Gegensatz zu den Regeln in Kapitel 4.2, “Allgemeine Regeln für den sequentiellen Transfer” gelten die Regeln unter XML-Codierung nur für gemäss XML-1.0 Standard formatierte Transferdateien {1}. Für die Formalisierung der Transferformat-Ableitungsregeln wird die in Kapitel 3.1, “Verwendete Syntax” eingeführte EBNF-Notation benutzt. Folgende Regeln werden hier bereits vordefiniert:
XML-Any = beliebige XML-Elemente (wohlgeformtes XML). XML-base64Binary = beliebige in Base64 codierterte binäre Daten {4}. XML-String = beliebiger Text ohne Tags (inkl. carriage return (Wagenrücklauf) (#xD), line feed (Zeilenvorschub) (#xA) und Tabulatorzeichen (#x9)). XML-NormalizedString = beliebiger einzeiliger Text. XML-NcName = ( Letter | '_' ) { Letter | Digit | '_' | '-' | '.' }. XML-ID = [ XML-NcName ':' ] ( Letter | Digit | '_' ) { Letter | Digit | '_' | '-' | '.' }.
4.3.2. Zeichencodierung
Als Zeichenvorrat für XML-String bzw. XML-NormalizedString stehen standardmässig nur die ASCII Zeichen von 32 bis 126 bzw. die Zeichen aus Anhang D Zeichentabelle zur Verfügung. Die Zeichen werden gemäss der Codierungsregel UTF-8 {3} oder als XML Character Reference codiert.
Eine XML Entity Reference ist nur für wenige Spezialzeichen erlaubt. Der Wert ist eine ASCII-Zeichenfolge, welche genau so im Transfer verwendet werden muss. Bemerkung: XML-Entities wie ü (für Zeichen ü) sind in einer INTERLIS 2-Transferdatei nicht erlaubt, weil von einer INTERLIS 2-Transferdatei keine Dokumenttypdefinition (DTD) referenziert wird.
Die benutzbaren XML Entities sind durch die XML 1.0 Spezifikation vordefiniert:
-
'&' muss durch die Zeichenfolge '&' ersetzt werden.
-
'<' muss durch die Zeichenfolge '<' ersetzt werden.
-
'>' muss durch die Zeichenfolge '>' ersetzt werden.
-
''' muss durch die Zeichenfolge ''' ersetzt werden.
-
'"' muss durch die Zeichenfolge '"' ersetzt werden.
Eine vollständige Zusammenfassung der Zeichencodierung mit allen möglichen Codierungsformen pro Zeichen ist in Anhang D Zeichentabelle enthalten. Ein INTERLIS 2 Schreibprogramm kann bei mehreren Codierungsformen pro Zeichen eine geeignete Form frei auswählen. Ein INTERLIS 2-Leseprogramm muss alle Codierungsformen erkennen. Kommen im Transfer Zeichen vor, die nicht im beim Modell definierten Zeichensatz (vgl. Kapitel 3.5, “Modelle, Themen, Klassen”) vorkommen (oder gemäss Anhang D, wenn die Angabe des Zeichensatzes beim Modell fehlt), ist es der Software überlassen, wie sie damit umgeht (z.B. stillschweigend ignorieren oder mit Hinweis durch ein Ersatzzeichen ersetzen).
Bemerkung: Mehrere Codierungsformen pro Zeichen und Zeichen ausserhalb des evtl. eingeschränkten Zeichensatzes werden zugelassen um maximale Kompatibilität mit bestehenden XML-Werkzeugen zu erreichen.
4.3.3. Allgemeiner Aufbau der Transferdatei
Eine INTERLIS-Transferdatei ist gemäss folgender EBNF-Hauptregel aufgebaut:
Transfer = <?xml version="1.0" encoding="UTF-8"?> <%ili%:transfer { NameSpaceDef } xmlns:%ili%="http://www.interlis.ch/xtf/2.4/INTERLIS" [ xmlns:%geom%="http://www.interlis.ch/geometry/1.0" ] [ xmlns:%xsi%="http://www.w3.org/2001/XMLSchema-instance" ] > HeaderSection DataSection </%ili%:transfer>. NameSpaceDef = xmlns="%XMLNS%" | xmlns="http://www.interlis.ch/xtf/2.4/%ModelName%".
Die Regel HeaderSection erzeugt den Vorspann der Transferdatei und die Regel DataSection den Datenbereich.
Eine durch die Transferregel erzeugte INTERLIS-Transferdatei ist immer auch eine wohlgeformte (well formed) XML 1.0-Transferdatei {1}. In einer INTERLIS-Transferdatei können daher auch beliebig viele Kommentarzeilen der Form
<!-- %Comment% -->
an den in XML 1.0 dafür vorgesehenen Stellen vorkommen. Der Inhalt der Kommentarzeilen %Comment%
darf von der Transfersoftware jedoch nicht interpretiert werden.
Grundsätzlich ist ein INTERLIS 2 Schreibprogramm frei, welcher Prefix (%ili%
, %geom%
, %ns%
) für welchen XML-Namespace verwendet wird, bzw. welcher XML-Namespace als default XML-Namespace verwendet wird. Mit %ns%
ist der jeweilige XML-Namespace des INTERLIS-Modells gemeint, in dem das entsprechende Modellelement definiert wurde.
Das XML-Schema für den Namespace "http://www.interlis.ch/xtf/2.4/INTERLIS" wird im Anhang B definiert und für "http://www.interlis.ch/geometry/1.0" im Anhang C. Alle anderen XML-Schemas ergeben sich aus den Regeln gemäss Kapitel 4.4, “Herleitung des XML-Schema aus dem Datenmodell”.
Die Daten werden als XML-Objekte übertragen. Die Tagnamen der XML-Objekte werden jeweils aus den Objektnamen im INTERLIS-Datenmodell abgeleitet. Für übersetzte Datenmodelle (TRANSLATION OF) bleiben die Tagnamen in der Ursprungs-Sprache, d.h. das Transferformat ändert sich nicht.
Enthält das Modell eine explizite Namespace Definition (XMLNS; vgl. Regel ModelDef), wird diese übernommen. Andernfalls wird der Namespace aus "http://www.interlis.ch/xtf/2.4/" und dem ModelName gebildet.
Hinweis: Um die Lesbarkeit zu erhöhen und die Verarbeitbarkeit mit diversen Texteditoren zu verbessern, wird empfohlen die XML-Daten formatiert in die Transferdatei zu schreiben.
4.3.4. Vorspann
Der Vorspann ist wie folgt aufgebaut:
HeaderSection = <%ili%:headersection> <%ili%:models> (* Model *) </%ili%:models> [ <%ili%:sender>%Sender%</%ili%:sender> ] [ <%ili%:comment>%Comment%</%ili%:comment> ] </ili:headersection>. *Model* = <%ili%:model> %ModelName% </%ili%:model>.
Unter models
müssen die Hauptmodelle eingetragen werden zu welchen Objekte im Transfer vorkommen können.
In %Comment%
kann (optional) ein Kommentar angegeben werden, in dem der Transfer näher beschrieben wird.
4.3.5. Datenbereich
Der Datenbereich ist wie folgt aufgebaut:
DataSection = <%ili%:datasection> { Basket } </%ili%:datasection>.
4.3.6. Codierung von Themen
Behälter sind Instanzen eines konkreten TOPIC bzw. VIEW TOPIC. Behälter werden wie folgt codiert:
Basket = <%ns%:%TopicName% %ili%:bid="%BasketId%" [ %ili%:kind="%TransferKind%" %ili%:startstate="%StartState%" %ili%:endstate="%EndState%" ] > [ %ili%:domains="%Domain-Assignments%" ] [ %ili%:consistency="%Consistency%" ] { Object | Link | DeleteObject } </%ns%:%TopicName%>.
Der Wert %ns%:%TopicName%
muss für jedes konkrete Topic entsprechend substituiert werden (z.B. Fixpunkte). Die XML-Attribute des Behälters haben folgende Bedeutung:
-
%BasketId%
. In%BasketId%
muss die Behälteridentifikation eingetragen werden. Die Behälteridentifikation ist wie eine XML-ID formatiert und muss bei inkrementeller Nachlieferung zusätzlich eine OID sein. -
%TransferKind%
. Transferart (mögliche Werte: FULL, UPDATE, INITIAL). Falls das Attribut fehlt, wird FULL angenommen. -
%StartState%
. Anfangszustand des Behälters vor dem Transfer (nur bei inkrementeller Nachlieferung). -
%EndState%
. Endzustand des Behälters nach dem Transfer (nur bei inkrementeller Nachlieferung). -
Werden in einem TOPIC direkt oder indirekt generische Wertebereichsdefinitionen (GENERIC) verwendet, muss in
%Domain-Assignments%
dem generischen Wertebereich ein konkreter Wertebereich zugeordnet werden. Werden mehrere generische Wertebereiche verwendet, müssen die einzelnen Zuordnungen durch Leerzeichen getrennt werden. Eine Zuordnung besteht aus den beiden voll qualifizierten Wertebereichsnamen (%ModelName%[.%TopicName%].%GenericDomainName%=%ModelName%[.%TopicName%].%ConcreteDomainName%
). -
Wird nur ein geographischer Ausschnitt aus einem Datenbestand übertragen, muss man das in
%Consistency%
mit dem Wert INCOMPLETE vermerken. Ohne Angabe gilt für%Consistency%
der Wert COMPLETE (= vollständiger Datenbestand). In einem Datenbestand-Ausschnitt kann anstelle von POLYLINE auch MULTIPOLYLINE bzw. für SURFACE auch MULTISURFACE vorkommen.
4.3.7. Codierung von Klassen und Beziehungen
Die Objektinstanzen einer konkreten Klasse bzw. einer nicht eingebetteten Beziehung werden wie folgt codiert:
Object = <[ %ns%: ] [ %TopicName%. ] %ClassName% %ili%:tid="%Tid%" [ %ili%:operation="%Operation%" ] > [ { Attribute | EmbeddedLink } ] </[ %ns%: ][ %TopicName%. ] ClassName%>. Link = <[ %ns%: ] [ %TopicName%. ] %AssociationName% [ %ili%:tid=”%Tid%” ] [ %ili%:operation="%Operation%" ] > [ { Role | Attribute | EmbeddedLink } ] </[ %ns%: ] [ %TopicName%. ] %AssociationName%>. DeleteObject = <%ili%:delete [ %ili%:tid= "%Tid%" ] ) { <[ %ns%: ] %RoleName% %ili%:ref="%Tid%"/> } </%ili%:delete>.
Der Wert %ClassName%
muss für jede konkrete Klasse entsprechend substituiert werden (z.B. LFP). Jede Klasse – und damit jede Objektinstanz – erhält zusätzlich zu den im Modell definierten Attributen implizit eine Transferidentifikation (XML-Attribut tid
). Die %Tid%
muss wie eine XML-ID formatiert sein.
%TopicName%
muss nur für Klassen / Beziehungen angeben werden, für welche ein Namenskonflikt mit Klassen / Beziehungen / Strukturen aus anderen Topics des gleichen Modells besteht.
Instanzen von Beziehungen (Link) haben nur eine Transferidentifikation, wenn diese im Rahmen der Definition mit dem Property OID gefordert wurde (vgl. Kapitel 3.7.1, “Beschreibung von Beziehungen”).
In der Transferart FULL müssen alle %Tid%
innerhalb des gesamten Transfers eindeutig sein. In der Transferart INITIAL oder UPDATE müssen die %Tid%
global eindeutige OID’s sein. Zudem erhält jedes Objekt in den Transferarten INITIAL und UPDATE ein Attribut für die Nachlieferungsoperation (XML-Attribut operation
). Das XML-Attribut operation
kann die Werte INSERT, UPDATE oder DELETE annehmen. Ohne Angabe von operation
wird der Wert INSERT angenommen.
Mit DeleteObject
kann bei inkrementeller Nachlieferung die Löschung eines bestimmten Objekts des Baskets über seine OID verlangt werden. Bei Beziehungen ohne OID wird die Instanz (Link) durch die Kombination der OIDs der bezeigten Objekte identifiziert. Bei DeleteObject
müssen im Gegensatz zu operation="DELETE"
keine weiteren Attribute des Objekts geliefert werden.
Für die Reihenfolge der Rollen, Attribute, Referenzattribute und eingebetteten Beziehungen innerhalb der Klasse gilt: Zuerst werden alle Rollen der Basisklasse, dann alle Attribute/Referenzattribute der Basisklasse, dann alle eingebetteten Beziehungen der Basisklasse, dann alle Attribute/Referenzattribute der Erweiterung, dann alle eingebetteten Beziehungen der Erweiterung codiert, etc. (Zwiebelprinzip). Innerhalb der gleichen Erweiterungsstufe werden die Attribute/Referenzattribute und Rollen gemäss ihrer Definitionsreihenfolge in der Modelldatei codiert. Die eingebetteten Beziehungen werden innerhalb der gleichen Erweiterungsstufe alphabetisch aufsteigend sortiert.
Parameter werden mit einer Ausnahme, wie sie im Kapitel 4.3.10, “Codierung von Grafikdefinitionen” angegeben ist, nicht übertragen.
4.3.8. Codierung von Sichten
Zur Codierung von Sichten vgl. Kapitel 4.2.3, “Transferierbare Objekte”. Es wird das XML-Attribut tid
, nicht aber operation
übermittelt. Als Attribute des Sichtobjekts werden nur diejenigen Attribute übertragen, welche in der Sicht explizit unter ATTRIBUTE bzw. implizit mit ALL OF angegeben wurden.
4.3.9. Codierung von Beziehungen
Beziehungen werden auf zwei Arten codiert: eingebettet oder nicht eingebettet. Eine eingebettete Beziehung wird als Sub-Element von einer, an der Assoziation beteiligten, Klasse codiert. Die Instanz einer nicht eingebetteten Beziehung (Link) wird wie eine Instanz einer Klasse codiert.
Beziehungen werden immer eingebettet, ausser
-
wenn sie mehr als zwei Rollen haben oder
-
wenn bei beiden (Basis-)Rollen die maximale Kardinalität grösser 1 ist oder
-
wenn für die Beziehung eine OID gefordert wird oder
-
bei gewissen themenübergreifenden Beziehungen (s. unten).
Falls bei einer der beiden (Basis-)Rollen die maximale Kardinalität grösser 1 ist, wird bei der Ziel-Klasse dieser Rolle eingebettet. Wenn diese Ziel-Klasse in einem anderen Topic definiert ist als die (Basis-)Assoziation, kann nicht eingebettet werden.
Falls bei beiden (Basis-)Rollen die maximale Kardinalität kleiner gleich 1 ist, wird bei der Ziel-Klasse der zweiten Rolle eingebettet. Wenn diese Ziel-Klasse in einem anderen Topic definiert ist als die (Basis-)Assoziation und die Ziel-Klasse der ersten Rolle im selben Topic definiert ist wie die (Basis-)Assoziation, wird bei der Ziel-Klasse der ersten Rolle eingebettet (d.h., wenn die Ziel-Klassen der beiden Rollen in einem anderen Topic definiert sind als die (Basis-)Assoziation, kann nicht eingebettet werden).
4.3.9.1. Eingebettete Beziehungen
Eingebettete Beziehungen werden wie ein Strukturattribut der Klasse, bei der die Beziehung eingebettet wird, übertragen.
Die Unterstruktur hat folgenden Aufbau:
EmbeddedLink = <[ %ns%: ] %RoleName% %ili%:ref="%Tid%" [ %ili%:order_pos=”%PosNumber%” ]> [ EmbeddedLinkStruct ] </[ %ns%: ] %RoleName%>. EmbeddedLinkStruct = <[ %ns%: ] [ %TopicName%. ] %AssociationName%> (* Attribute *) </[ %ns%: ] [ TopicName%. ] %AssociationName%>.
Für %RoleName%
muss der Name der Rolle angegeben werden, welche auf das gegenüberliegende Objekt verweist (die andere Rolle wird nicht codiert). In EmbeddedLinkStruct werden allfällige Attribute der Beziehung codiert. Die XML-Attribute ref
und order_pos
haben die gleiche Bedeutung wie bei nicht eingebetteten Beziehungen. %TopicName%
muss nur angegeben werden, wenn es mit Klassen / Assoziationen oder Strukturen aus anderen Topics des gleichen Modells einen Namenskonflikt gibt.
4.3.9.2. Nicht eingebettete Beziehungen
Nicht eingebettete Beziehungen werden wie Objektinstanzen von Klassen übertragen.
Hinweis: Für Beziehungen ohne expliziten Namen wird der (Klassen)Name durch zusammenhängen der einzelnen Rollennamen gebildet (d.h. z.B. %RoleName1RoleName2%).
Rollen werden wie Attribute behandelt. Die Rollen selbst werden wie folgt codiert:
Role = <[ %ns%: ] %RoleName% %ili%:ref="%Tid%" [ %ili%:order_pos="%PosNumber%" ]> </[ %ns% ] %RoleName%>.
In ref
wird dabei die Transferidentifikation des referenzierten Objekts eingetragen.
In geordneten Beziehungen definiert das Attribut order_pos
(Wert > 0!) die innerhalb des Transferbehälters absolute Position in der geordneten Liste der Beziehungsobjekte.
4.3.10. Codierung von Grafikdefinitionen
Für jede Grafikdefinition werden im Transfer die von der Grafikdefinition referenzierten Signaturklassen (Sign-ClassRef) übertragen. Die Objektinstanzen der Signaturklassen werden durch das Ausführen der Grafikdefinitionen auf einem konkreten Inputdatensatz erzeugt. Parameter werden dabei wie Attribute codiert.
4.3.11. Codierung von Attributen
4.3.11.1. Allgemeine Regeln für die Codierung von Attributen
Jedes Attribut einer Objektinstanz (einschliesslich komplexer Attribute wie (MULTI)COORD, (MULTI)POLYLINE, (MULTI)SURFACE, (MULTI)AREA, STRUCTURE, LIST OF, BAG OF, etc.) wird wie folgt codiert:
Attribute = { <[ %ns%: ]%AttributeName%> AttributeValue </[%ns%:]%AttributeName%> } | ReferenceAttribute. AttributeValue = ( TextValue | MTextValue | EnumValue | NumericValue | FormattedValue | DateValue | TimeValue | DateTimeValue | BlackboxValue | ClassTypeValue | AttributePathTypeValue | StructureValue | CoordValue | MultiCoordValue | PolylineValue | MultiPolylineValue | SurfaceValue | MultiSurfaceValue | OIDAttributeValue ).
Bei undefiniertem Attributwert wird das Attribut nicht übertragen. Die Masseinheit des Attributwerts wird nicht codiert. Beispiel für ein einfaches Attribut:
<Nummer>12345</Nummer>
Bei LIST und BAG kann das Attributtag mehrfach angegeben werden. Beispiel für eine einfache Liste von Nummern:
<Nummer>12345</Nummer> <Nummer>23456</Nummer> <Nummer>34567</Nummer>
4.3.11.2. Codierung von Zeichenketten
Attribute vom Basistyp TEXT bzw. MTEXT (und damit auch NAME und URI) werden wie folgt codiert:
TextValue = XML-NormalizedString. MTextValue = XML-String.
4.3.11.3. Codierung von Aufzählungen
Aufzählungen werden wie folgt codiert:
EnumValue = ( EnumElement-Name { '.' EnumElement-Name } ) | 'OTHERS'.
Für die Codierung von Aufzählungen (unabhängig davon, ob der Wertebereich nur die Blätter oder auch die Knoten umfasst) wird die Syntax für Aufzählungskonstanten angewendet (Regel EnumValue). Das Zeichen # wird dabei weggelassen. Die vordefinierten Textausrichtungstypen HALIGNMENT und VALIGNMENT werden wie Aufzählungen codiert. Ebenso wird der Typ BOOLEAN wie eine Aufzählung übertragen.
4.3.11.4. Codierung von numerischen Datentypen
Numerische Werte werden wie folgt codiert:
NumericValue = NumericConst.
Der Wert wird in der Form gemäss der Wertebereichdefinition codiert (Ausnahme: Zwischenpunkte von Kreispunkte dürfen eine höhere Genauigkeit aufweisen).
Bemerkung: Float-Zahlen können in verschiedenen Darstellungen übertragen werden (mit oder ohne Mantisse). Sie können mit höherer Genauigkeit transferiert werden als durch den Wertebereich verlangt. Wesentlich ist dann lediglich, dass der Wert der Float-Zahl den verlangten Wertebereich nicht verletzt. Damit kann z.B. 100 (bei einem angenommenen Wertebereich von 0..999) als 100, 100.0000001, 10.0e1 oder 1.0e2 übertragen werden.
Der Empfänger ist gehalten, die Werte, ausser bei Zwischenpunkten von Kreisbogen (vgl. Kapitel 4.3.11.14, “Codierung von Linienzügen”), entsprechend dem numerischen Wertebereich zu runden.
4.3.11.5. Codierung von formatierten Wertebereichen
Formatierte Wertebereiche werden entsprechend der Formatdefinition codiert:
FormattedValue = XML-NormalizedString.
4.3.11.6. Codierung von Datum
Der Typ DATE wird wie folgt codiert:
DateValue = JJJJ-MM-TT.
JJJJ steht für das Jahr, MM für den Monat (01 .. 12), TT für den Tag (01 .. 31). Der 1. Dezember 1997 wird also mit 1997-12-01
übertragen.
4.3.11.7. Codierung von Zeit
Der Typ TIME wird wie folgt codiert:
TimeValue = HH:MM:SS.
Für Stunde (HH), Minute (MM) und Sekunde (SS) müssen immer zweistellige Werte angegeben werden (z.B. 01:13:00
).
4.3.11.8. Codierung von Datum mit Zeit
Der Typ DATETIME wird wie folgt codiert:
DateTimeValue = DateValueTTimeValue.
Zwischen Datum und Zeit steht der Buchstabe T (z.B. 1997-12-01T01:13:00
).
4.3.11.9. Codierung von Gefässen
Attributwerte vom Typ BLACKBOX werden wie folgt codiert:
BlackboxValue = XML-Any | XML-base64Binary.
Die XML-Variante des Typs BLACKBOX wird als XML-Any codiert, die binäre Variante als XML-base64Binary.
4.3.11.10. Codierung von Klassentypen
Attributwerte vom Typ CLASS oder STRUCTURE werden wie folgt codiert:
ClassTypeValue = XML-NormalizedString.
Der XML-NormalizedString enthält den vollständig qualifizierten Klassen-, Struktur- oder Assoziationsnamen (z.B. DM01AVCH24D.FixpunkteKategorie1.LFP1
).
4.3.11.11. Codierung von Attributpfadtypen
Attributwerte vom Typ ATTRIBUTE werden wie folgt codiert:
AttributePathTypeValue = XML-NormalizedString.
Der XML-NormalizedString enthält den vollständig qualifizierten Klassennamen gefolgt vom durch einen Punkt abgetrennten Attributnamen (z.B. Grunddatensatz.Fixpunkte.LFP.Nummer
).
4.3.11.12. Codierung von Strukturattributen
Strukturelemente vom Typ STRUCTURE werden wie folgt codiert:
StructureValue = <[ %ns%: ] [ %TopicName%. ] %StructureName%> (* Attribute *) </[ %ns%: ] [ %TopicName%. ] %StructureName%>.
%TopicName%
muss nur für Strukturen angegeben werden, für welche ein Namenskonflikt mit Klassen / Beziehungen / Strukturen aus anderen Topics des gleichen Modells besteht.
4.3.11.13. Codierung von Koordinaten
Attributwerte vom Typ COORD werden wie folgt codiert:
CoordValue = <geom:coord> <geom:c1>NumericConst</geom:c1> <geom:c2>NumericConst</geom:c2> [ <geom:c3>NumericConst</geom:c3> ] </geom:coord>.
Die einzelnen XML-Unterobjekte müssen wie folgt gefüllt werden:
-
c1. Erste Komponente der Koordinate (codiert wie numerischer Wert).
-
c2. Zweite Komponente der Koordinate (nur bei 2D- und 3D-Koordinaten, codiert wie numerischer Wert).
-
c3. Dritte Komponente der Koordinate (nur bei 3D-Koordinaten, codiert wie numerischer Wert).
Attributwerte vom Typ MULTICOORD werden wie folgt codiert:
MultiCoordValue = <geom:multicoord> (* CoordValue *) </geom:multicoord>.
4.3.11.14. Codierung von Linienzügen
Attributwerte vom Typ POLYLINE werden wie folgt codiert:
PolylineValue = <geom:polyline> SegmentSequence </geom:polyline>. StartSegment = CoordValue. StraightSegment = CoordValue. ArcSegment = <geom:arc> <geom:c1>NumericConst</geom:c1> <geom:c2>NumericConst</geom:c2> [ <geom:c3>NumericConst</geom:c3> ] <geom:a1>NumericConst</geom:a1> <geom:a2>NumericConst</geom:a2> [ <geom:r>NumericConst</geom:r> ] </geom:arc>. LineFormSegment = StructureValue. SegmentSequence = StartSegment (* StraightSegment | ArcSegment | LineFormSegment *).
Gerade Kurvenstücke eines Linienzugs werden gemäss Regel StraightSegment codiert, für kreisbogenförmige Segmente gilt die Regel ArcSegment. Mit LINE FORM definierte Liniensegmente werden wie eine Struktur (LineStructure) codiert.
Bemerkungen: Für Kreisbogensegmente (Regel ArcSegment) kann der Radius (optionales XML-Attribut r) zusätzlich zur Zwischenpunktkoordinate (a1/a2) übermittelt werden. Er ist immer positiv. Der Zwischenpunkt eines Kreisbogens ist nur für die Lage von Bedeutung. Bei Differenzen zwischen Radius und Koordinatenwerten gilt der Radius (vgl. Kapitel 3.8.12.2, “Linienzug mit Strecken und Kreisbogen als vordefinierte Kurvenstücke”). Damit bei fehlendem Radius die systeminternen Kreisbogenattribute möglichst präzis bestimmt werden können, sollen die Koordinatenwerte des Zwischenpunktes nicht gemäss Wertebereichsdefinition gerundet werden. Wenn der Radius definiert ist, darf der Zwischenpunkt um höchstens 1 Genauigkeitseinheit (der Wert 1 der hintersten Stelle gemäss Wertebereichsdefinition) multipliziert mit der Hälfte der Quadratwurzel von 2 von der Spur des aus dem Radius gerechneten Kreisbogens abweichen. Die Stützpunkthöhe (c3) muss nur bei 3D-Polylines übertragen werden.
Attributwerte vom Typ MULTIPOLYLINE (und auch für POLYLINE im Falle von einem Datenbestands-Ausschnitt) werden wie folgt codiert:
MultiPolylineValue = <geom:multipolyline> (* PolylineValue *) </geom:multipolyline>.
4.3.11.15. Codierung von Einzelflächen und Gebietseinteilungen
SURFACE und AREA werden wie folgt codiert:
SurfaceValue = <geom:surface> Boundaries </geom:surface>. Boundaries = OuterBoundary { InnerBoundary }. OuterBoundary = <geom:exterior> PolylineValue </geom:exterior>. InnerBoundary = <geom:interior> PolylineValue </geom:interior>.
Flächen werden als Folge von Rändern (Boundaries) übertragen.
Ein Rand ist eine Folge von Randlinien, wobei jeweils die nächste Randlinie mit dem Endpunkt der vorhergehenden Randlinie beginnt. Der Endpunkt der letzten Randlinie ist identisch mit dem Anfangspunkt der ersten Randlinie. Die Randlinien eines Randes bilden also zusammen einen geschlossenen Linienzug (Polygon). Bei diesem müssen alle Punkte (ausser Anfangs-/Endpunkt) disjunkt sein (vgl. Kapitel 3.8.12.2, “Linienzug mit Strecken und Kreisbogen als vordefinierte Kurvenstücke” und Abbildung 22). Ein Rand darf bei beliebigen Stützpunkten in Randlinien aufgeteilt werden. Die Aufteilung in Randlinien darf bei jedem Transfer – insbesondere auch bei inkrementeller Nachlieferung – unterschiedlich sein.
Der erste Rand einer Fläche (OuterBoundary) ist der äussere Rand der Fläche. Die allenfalls folgenden inneren Ränder (InnerBoundary) der Fläche begrenzen die Inseln der Fläche. Sie dürfen gemeinsame Stützpunkte mit anderen Rändern aufweisen, soweit die Bedingungen gemäss Kapitel 3.8.13.1, “Geometrie von Flächen” erfüllt sind. Liegen auf beiden Seiten einer Randlinie definierte Gebietsobjekte (AREA), müssen die beiden Randlinien deckungsgleich sein. Dies ist der Fall, wenn alle Stützpunkte identisch aber in umgekehrter Reihenfolge angeordnet sind und alle weiteren Werte deckungsgleicher Linienstücke (Zwischenpunktkoordinaten, Radius) identisch sind.
Attributwerte vom Typ MULTISURFACE (und auch für SURFACE im Falle von einem Datenbestands-Ausschnitt) werden wie folgt codiert:
MultiSurfaceValue = <geom:multisurface> (* SurfaceValue *) </geom:multisurface>.
4.3.11.16. Codierung von Referenzen
Attribute vom Typ REFERENCE TO werden wie folgt codiert:
ReferenceAttribute = <[ %ns%: ] %AttributeName% %ili%:ref="%Tid%"> </[ %ns%: ] %AttributeName%>.
Das XML-Attribut ref
hat die gleiche Bedeutung wie bei eigentlichen Beziehungen.
4.3.11.17. Codierung von Metaobjekten
Attribute vom Typ METAOBJECT (vgl. Anhang A Das interne INTERLIS-Datenmodell) werden wie LIST OF oder BAG OF codiert. Parameter vom Typ METAOBJECT (Syntaxregel ParameterDef) werden jedoch nicht übermittelt. Parameter vom Typ METAOBJECT OF werden wie Attribute vom Typ NAME übertragen.
4.3.11.18. Codierung von OIDType
Attributwerte vom Typ OIDType werden wie eine XML-ID inkl. Oid-Werteraum codiert. Ist OIDType ein NumericType gelten ausserdem für den Wert (ohne den Oid-Werteraum) die Regeln für die Codierung von numerischen Typen.
OIDAttributeValue = XML-ID.
4.4. Herleitung des XML-Schema aus dem Datenmodell
4.4.1. Einleitung
Jede XML-Schema Datei (XSD) muss den Regeln gemäss {2} genügen. Ausserdem hat jede aus einem INTERLIS 2.4 Datenmodell abgeleitete XSD-Datei folgende Grundstruktur:
XSDDef = <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.interlis.ch/xtf/2.4/%ModelName%" targetNamespace="http://www.interlis.ch/xtf/2.4/%ModelName%" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:ili="http://www.interlis.ch/xtf/2.4/INTERLIS" xmlns:geom="http://www.interlis.ch/geometry/1.0" > { TypeDef | ClassTypeDef | ObjectDef } { BasketDef } </xsd:schema>
Die XSD-Datei besteht aus einem Header mit Angaben zum Modell (ModelName). Danach folgen die Deklarationen für Typen (TypeDef) und Klassen (ClassTypeDef) und schliesslich die Basketdefinitionen (BasketDef). Jedes XML-Schema für ein Interlis Modell importiert die externen XML-Schemas "http://www.interlis.ch/xtf/2.4/INTERLIS" (INTERLIS 2.4 Basisdefinitionen, s.a. Anhang B) und "http://www.interlis.ch/geometry/1.0" (INTERLIS Geometrieschema, s.a. Anhang C).
Das generierte XML-Schema kann beliebig viele Kommentare (<!-- … -->
) oder zusätzliche xsd:annotation-Elemente enthalten. Das generierte XML-Schema darf das INTERLIS-Modell exakter, d.h. mit zusätzlichen «facets», umsetzen.
4.4.2. Typdeklarationen
Alle Typen eines Modells (global oder auf Stufe Thema) werden wie folgt definiert:
TypeDef = SimpleTypeDef | ComplexTypeDef SimpleTypeDef = <xsd:simpleType name=" [ %TopicName%. ] %TypeName%Type"> SimpleTypeRestriction </xsd:simpleType> ComplexTypeDef = <xsd:complexType name=" [ %TopicName%. ] %TypeName%Type"> ComplexTypeContent </xsd:complexType>
Für alle Typen muss am Ende des Namen "Type" angehängt werden (z.B. LKoordType für den INTERLIS Typ LKoord). Für Typdeklarationen auf Stufe Thema muss den Typnamen zusätzlich %TopicName%
vorangestellt werden (z.B. Bodenbedeckung.BBArtType), falls der Typname bereits auf Stufe Modell verwendet wurde.
4.4.3. Einfache Typen (SimpleTypeRestriction)
4.4.3.1. Numerische Typen
Numerische Typen ohne Skalierung (Längen, Flächen, Volumen, Winkel, Bereiche) werden wie folgt übersetzt:
<xsd:restriction base="xsd:decimal"> [ <xsd:minInclusive value="%min-Dez%"> <xsd:maxInclusive value="%max-Dez%"> ] </xsd:restriction>
Die Einschränkung des Bereichs erfolgt nur, wenn der Typ im Modell als FINAL gekennzeichnet ist.
Numerische Typen mit Dezimalpunkt und Skalierung (Längen, Flächen, Volumen, Winkel, Bereiche) werden wie folgt übersetzt:
<xsd:restriction base="xsd:double"> [ <xsd:minInclusive value="%min-Dez%"> <xsd:maxInclusive value="%max-Dez%"> ] </xsd:restriction>
Die Einschränkung des Bereichs erfolgt nur, wenn der Typ im Modell als FINAL gekennzeichnet ist.
Numerische Typen ohne Dezimalpunkt (Längen, Flächen, Volumen, Winkel, Bereiche), die im Modell als FINAL genkennzeichnet sind, werden wie folgt übersetzt:
<xsd:restriction base="xsd:integer"> <xsd:minInclusive value="%min-Dez%"> <xsd:maxInclusive value="%max-Dez%"> </xsd:restriction>
4.4.3.2. Text
Der Typ TEXT*n wird wie folgt übersetzt:
<xsd:restriction base="xsd:normalizedString"> <xsd:maxLength value="%N%"> </xsd:restriction>
4.4.3.3. MText
Der Typ MTEXT*n wird wie folgt übersetzt:
<xsd:restriction base="xsd:string"> <xsd:maxLength value="%N%"> </xsd:restriction>
4.4.3.4. OIDType, formatierte Wertebereiche, Klassentypen, Attributpfade
OIDType, formatierte Wertebereiche, Klassentypen und Attributpfade werden wie folgt übersetzt:
<xsd:restriction base="xsd:NCName"/>
4.4.3.5. XML-Gefässe
Der Typ BLACKBOX XML wird wie folgt übersetzt:
<xsd:restriction base="xsd:anyType"/>
4.4.3.6. Binäre Gefässe
Der Typ BLACKBOX BINARY wird wie folgt übersetzt:
<xsd:restriction base="xsd:base64Binary"/>
4.4.3.9. Datum mit Zeit
Der Typ DATETIME wird wie folgt übersetzt:
<xsd:restriction base="xsd:dateTime"/>
4.4.3.10. Aufzählungen
Aufzählungen inkl. Textausrichtungen werden wie folgt übersetzt:
<xsd:restriction base="xsd:normalizedString"> { EnumerationValue } </xsd:restriction> EnumerationValue = <xsd:enumeration value="%EnumerationValue%"/>
Die Auflistung der %EnumerationValue%
erfolgt nur, wenn der Typ im Modell als FINAL gekennzeichnet ist. Für %EnumerationValue%
müssen dann alle gültigen Werte des Aufzähltyps angegeben werden. Ist der Typ im Modell nicht FINAL, erfolgt keine Auflistung.
4.4.4. Komplexe Typen (ComplexTypeContent)
4.4.4.1. Koordinaten
COORD2 bzw. COORD3 werden wie folgt übersetzt:
<xsd:sequcence> <xsd:element ref="geom:coord" minOccurs="1" maxOccurs="1"/> (1) </xsd:sequcence>
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) fehlt der abschliessende Schrägstrich. Siehe dazu auch dieses Issue. Zudem ist die Beschränkung minOccurs="1" maxOccurs="1" überflüssig, da dies die Default-Werte sind (siehe XML-Spezifikation). |
4.4.4.2. Multi-Koordinaten
MULTICOORD2 bzw. MULTICOORD3 werden wie folgt übersetzt:
<xsd:sequcence> <xsd:element ref="geom:multicoord" minOccurs="1" maxOccurs="1"/> (1) </xsd:sequcence>
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) fehlt der abschliessende Schrägstrich. Siehe dazu auch dieses Issue. Zudem ist die Beschränkung minOccurs="1" maxOccurs="1" überflüssig, da dies die Default-Werte sind (siehe XML-Spezifikation). |
4.4.4.3. Polylinien
Der Typ POLYLINE wird wie folgt übersetzt:
<xsd:sequcence> <xsd:element ref="geom:polyline" minOccurs="1" maxOccurs="1"/> (1) </xsd:sequcence>
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) fehlt der abschliessende Schrägstrich. Siehe dazu auch dieses Issue. Zudem ist die Beschränkung minOccurs="1" maxOccurs="1" überflüssig, da dies die Default-Werte sind (siehe XML-Spezifikation). |
4.4.4.4. Multi-Polylinien
Der Typ MULTIPOLYLINE wird wie folgt übersetzt:
<xsd:sequcence> <xsd:element ref="geom:multipolyline" minOccurs="1" maxOccurs="1"/> (1) </xsd:sequcence>
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) fehlt der abschliessende Schrägstrich. Siehe dazu auch dieses Issue. Zudem ist die Beschränkung minOccurs="1" maxOccurs="1" überflüssig, da dies die Default-Werte sind (siehe XML-Spezifikation). |
4.4.4.5. Flächen
Der Typ SURFACE wird wie folgt übersetzt:
<xsd:sequcence> <xsd:element ref="geom:surface" minOccurs="1" maxOccurs="1"/> (1) </xsd:sequcence>
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) fehlt der abschliessende Schrägstrich. Siehe dazu auch dieses Issue. Zudem ist die Beschränkung minOccurs="1" maxOccurs="1" überflüssig, da dies die Default-Werte sind (siehe XML-Spezifikation). |
4.4.4.6. Multi-Flächen
Der Typ MULTISURFACE wird wie folgt übersetzt:
<xsd:sequcence> <xsd:element ref="geom:multisurface" minOccurs="1" maxOccurs="1"/> (1) </xsd:sequcence>
1 | Im PDF-Dokument des Referenzhandbuchs (Version 2.1.0) fehlt der abschliessende Schrägstrich. Siehe dazu auch dieses Issue. Zudem ist die Beschränkung minOccurs="1" maxOccurs="1" überflüssig, da dies die Default-Werte sind (siehe XML-Spezifikation). |
4.4.4.7. Rollen
Rollen werden wie folgt übersetzt:
<xsd:attribute ref="ili:ref" use="required"/> <xsd:attribute ref="ili:order_pos"/>
4.4.4.8. Referenzattribute
Referenzattribute werden wie folgt übersetzt:
<xsd:attribute ref="ili:ref" use="required"/>
4.4.5. Klassen, Strukturen und Beziehungen
Klassen, Strukturen und eigenständige Beziehungen werden wie folgt übersetzt:
ClassTypeDef = RootClassTypeDef | ExtendedClassTypeDef RootClassTypeDef = <xsd:complexType name=" [ %TopicName%. ] %ClassName%Type"> <xsd:sequence> <xsd:element ref="ili:extensions" minOccurs="0"/> (* AttributeDef | EmbeddedLinkDef | RoleDef *) </xsd:sequence> <xsd:anyAttribute processContents="lax"/> [ <xsd:attribute ref="ili:tid"/> ] [ <xsd:attribute ref="ili:operation"/> ] </xsd:complexType> ExtendedClassTypeDef = <xsd:complexType name=" [ %TopicName%. ] %ClassName%Type"> <xsd:complexContent> <xsd:extension base=" [ %TopicName%. ] %ClassName%Type"> <xsd:sequence> (* AttributeDef | EmbeddedLinkDef | RoleDef *) </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> ObjectDef = <xsd:element name= [ %TopicName%. ] "%ClassName%" type="%ClassName%Type" [ substitutionGroup=" [ %TopicName%. ] "%ClassName%" ] />
Bei Klassen ist die Angabe des XML-Attributs TID obligatorisch. In Strukturen dürfen die Attribute TID und OPERATION nicht vorkommen.
AttributeDef = AttributeWithNamedTypeDef | AttributeWithLocalTypeDef AttributeWithNamedTypeDef = <xsd:element name="%Attribut-Name%" minOccurs="%MinCard%" maxOccurs="%MaxCard%" type="%NamedTypeRef%"/> AttributeWithLocalTypeDef = <xsd:element name="%Attribut-Name%" minOccurs="%MinCard%" maxOccurs="%MaxCard%"> TypeDef </xsd:element> EmbeddedLinkDef = <xsd:element name="%Role-Name%"> <xsd:complexType> [ <xsd:sequence> <xsd:element ref=" [ %TopicName%. ] %ClassName%" minOccurs="0"/> </xsd:sequence> ] <xsd:attribute ref="ili:ref" use="required"/> [ <xsd:attribute ref="ili:order_pos" /> ] <xsd:anyAttribute processContents="lax"/> </xsd:complexType> </xsd:element> RoleDef = <xsd:element name="%Role-Name%"> <xsd:complexType> <xsd:attribute ref="ili:ref" use="required"/> [ <xsd:attribute ref="ili:order_pos" /> ] <xsd:anyAttribute processContents="lax"/> </xsd:complexType> </xsd:element>
Für die Reihenfolge der Attribute, Rollen und EmbeddedLink innerhalb der Klasse gilt: Die Attribute/Referenzattribute und Rollen werden gemäss ihrer Definitionsreihenfolge in der Modelldatei codiert. Die EmbeddedLink werden innerhalb der gleichen Erweiterungsstufe alphabetisch aufsteigend sortiert. Die Rollen, Attribute und EmbeddedLink, die von einer Basisklasse geerbt werden, werden nicht wiederholt.
Für Listen- und Bag-Attribute muss für %MinCard%
die minimale bzw. für %MaxCard%
die maximale Kardinalität eingegetragen werden.
Für alle übrigen Attribute ist %MaxCard%
gleich 1. Für MANDATORY Attribute beträgt %MinCard%
ebenfalls 1, sonst 0.
Eingebettete Beziehungen werden gemäss der Regel EmbeddedLinkDef
definiert.
TypeDef für Attribute mit lokaler Typdeklaration werden ohne XSD-Attribut name
ausgegeben.
4.4.6. BasketDef
Pro Thema wird folgende Definition ausgegeben:
BasketDef = <xsd:element name="%Thema-Name%"> <xsd:complexType> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element ref="ili:extensions"/> { <xsd:element ref=" [ %TopicName%. ] %ClassName%" minoccurs="0" maxOccurs="unbounded"/> } </xsd:choice> <xsd:attribute ref="ili:bid" use="required"/> <xsd:attribute ref="ili:consistency"/> [ <xsd:attribute ref="ili:domains"/> ] [ <xsd:attribute ref="ili:kind"/> <xsd:attribute ref="ili:startstate"/> <xsd:attribute ref="ili:endstate"/> ] <xsd:anyAttribute processContents="lax"/> </xsd:complexType> </xsd:element>
Für Elementdefinitionen der Klassen innerhalb der BasketDef gilt: Zuerst werden alle Klassen der Basistopics, dann alle Klassen des Erweiterungstopics codiert, etc. (Zwiebelprinzip). Wobei Klassen des Erweiterungstopics nur codiert werden, wenn die Basisklasse nicht als Teil des Basistopics bereits codiert wurde.
Themen müssen in der XSD-Datei in der gleichen Reihenfolge wie im Datenmodell definiert werden.