'
```
--v--
### Beispiel mit Model Baker (3)
Definition in Modell **KbS_V1_5**
MODEL KbS_V1_5 (de) =
TOPIC Belastete_Standorte =
!!@qgis.modelbaker.dispExpression = "'Nr: '|| uid ||' / '|| katastername"
CLASS ZustaendigkeitKataster =
[...]

--v--
### Listen von Metaattributen
- [INTERLIS Compiler (ili2c) ](https://github.com/claeis/ili2c/blob/master/doc/ili2c.rst#interlis-metaattribute)
- [ili2db ](https://github.com/claeis/ili2db/blob/master/docs/ili2db.rst#interlis-metaattribute)
- [INTERLIS Validator (ilivalidator) ](https://github.com/claeis/ilivalidator/blob/master/docs/ilivalidator.rst#interlis-metaattribute)
- [INTERLIS Manager (ilimanager) ](https://github.com/claeis/ilimanager/blob/main/docs/ilimanager.rst#interlis-metaattribute)
- [QGIS Model Baker ](https://opengisch.github.io/QgisModelBaker/background_info/meta_attributes/)
*(unvollständig) Siehe auch https://interlis.discourse.group/t/uebersicht-interlis-meta-attribute/70*
--v--
### Metaattribute im Modell sind toll
Aber wir können doch nicht einfach am Modell rumbasteln!
--v--
### Extra Meta Attribute File
... a.k.a. "Konfigfile", "Metaattributefile", "INI-File", "TOML-File"...
***Eigentlich im Format INI aber wird meistens als `.toml` gespeichert.***
Nicht zu verwechseln mit ***Meta-Konfigurationsdatei*** um ili2db zu "steuern" (auch im Zusammenhang mit UsabILIty Hub).
--v--
#### Beispiel mit Model Baker
Definition in Konfigurationsdatei für **KbS_V1_5**
```INI
["KbS_V1_5.Belastete_Standorte.ZustaendigketKataster"]
qgis.modelbaker.dispExpression = "'Nr: '|| uid ||' / '||katastername"
```

--v--
### Validierungen steuern mit Metaattributen
Nur zur Info...
```ini
["KbS_V1_5.Standorte.Belasteter_Standort.Nr"]
# disable mandatory constraint of Katasternummer
multiplicity="off"
["KbS_V1_5.Standorte.Belasteter_Standort.Constraint1"]
msg = "Mind. eine Untersuchungsmassnahme erfassen."
```
--v--
### Was brauchen wir für KbS_V1_5?
- Multigeometrie konstruiert aus `STRUCTURE MultiPolygon`
- "Plattgewalzte Mehrsprachigkeit" auf `STRUCTURE MultilingualUri`
--v--
#### Das Mapping-Attribut
`ili2db.mapping`
- Auf Klasse oder Struktur
*Strukturen werden anstatt mit Beziehungen mit Spalten abgebildet (zBs. Multi-Geometrie).*
- Auf Attribut
*Strukturattribute (`BAG OF`/`LIST OF`) werden anstatt mit Beziehungen mit einem Datentyp abgebildet.*
--v--
#### Definition im INTERLIS Modell
!!@ili2db.mapping=MultiSurface
STRUCTURE MultiPolygon =
Polygones: BAG {1..*} OF PolygonStructure;
END MultiPolygon;
!!@ili2db.mapping=Multilingual
STRUCTURE MultilingualUri =
LocalisedText : BAG {1..*} OF LocalisedUri;
UNIQUE (LOCAL) LocalisedText: Language;
END MultilingualUri;
--v--
#### Definition im Extra Meta Attribute File
```INI
[KbS_V1_5.Belastete_Standorte.MultiPolygon]
ili2db.mapping = "MultiSurface"
[KbS_V1_5.Belastete_Standorte.MultilingualUri]
ili2db.mapping = "Multilingual"
```
--v--
## Ready für Übung 1 🚀
--v--
## Exkurs 2.1: Vererbungen in INTERLIS
--v--
### Use Case: Arbeiten mit KbS_V1_5
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Bund
participant E as Kanton
Note left of A: Definiert ein
Minimales Geo-Daten Modell
KbS_V1_5
A ->>+E: gibt Modell vor
Note right of E: Sammelt Daten im Format von
KbS_V1_5
Note right of E: Validiert Daten im Format von
KbS_V1_5
E ->>-A: Liefert Daten im Format von
KbS_V1_5
Note left of A: Validiert Daten im Format von
KbS_V1_5
```
--v--
### Use Case: Arbeiten mit Erweiterung
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Bund
participant E as Kanton
Note left of A: Definiert ein
Minimales Geo-Daten Modell
KbS_V1_5
A ->>+E: gibt Modell vor
Note right of E: Definiert Modell mit zusätzlichen Informationen
KT_KbS_V1_5
Note right of E: Sammelt Daten im Format von
KT_KbS_V1_5
Note right of E: Validiert Daten im Format von
KT_KbS_V1_5
E ->>-A: Liefert Daten im Format von
KbS_V1_5
Note left of A: Validiert Daten im Format von
KbS_V1_5
```
--v--
### Einfacheres Beispiel `Gebaeudeinventar_V1`
MODEL Gebaeudeinventar_V1 (de)
AT "mailto:signedav@localhost"
VERSION "2023-01-19" =
IMPORTS GeometryCHLV95_V1;
TOPIC Gebaeude =
CLASS Gebaeude =
EGID : MANDATORY TEXT*16;
Koordinaten : MANDATORY GeometryCHLV95_V1.Coord2;
END Gebaeude;
CLASS Adresse =
Strasse : TEXT*200;
Ort : MANDATORY TEXT*200;
END Adresse;
ASSOCIATION AdresseGebaeude =
GebaeudeAdresse -- {1..*} Adresse;
Gebaeude -- {1} Gebaeude;
END AdresseGebaeude;
END Gebaeude;
END Gebaeudeinventar_V1.
--v--
### Wir brauchen "mehr"
Müssen für ein Öko-Projekt ein weiteres Attribut verwenden: `EntsprichtStandard`
Möchten aber dennoch die Daten als `Gebaeudeinventar_V1` zurückliefern.
--v--
### Use Case: Öko-Projekt
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Initialprojekt
participant E as Öko-Projekt
Note left of A: Gegebenes Modell
Gebauedeinventar_V1
A ->>+E: nutzen Basismodell
Note right of E: Definieren Modell mit zusätzlichem Attribut
OekoGebaeudeinventar_V1
Note right of E: Sammeln Daten im Format von
OekoGebaeudeinventar_V1
Note right of E: Validieren Daten im Format von
OekoGebaeudeinventar_V1
E ->>-A: Exportieren Daten im
Gebauedeinventar_V1
Note left of A: Validiert Daten im Format von
Gebauedeinventar_V1
```
--v--
### Wie "vererben" wir?
**Erweitern** einer Klasse (Basisklasse) in eine "verbesserte" Ableitung.
Eine erweiterte Klasse (Ableitung) hat **alle Eigenschaften** der Basisklasse **+ "mehr"**.
**"mehr"** heisst zusätzliche **Attribute** und **Beschränkungen**.
--v--
### Aus `Gebaeude` wird ein besseres `Gebaeude`

--v--
#### Die Ableitung in INTERLIS (1)
...mit `EXTENDED`
CLASS Gebaeude =
EGID : MANDATORY TEXT*16;
Koordinaten : MANDATORY GeometryCHLV95_V1.Coord2;
END Gebaeude;
CLASS Gebaeude (EXTENDED) =
EntsprichtStandard: BOOLEAN;
END Gebaeude;
--v--
### Und schon haben wir es!
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Initialprojekt
participant E as Öko-Projekt
Note left of A: Gegebenes Modell
Gebauedeinventar_V1
A ->>+E: nutzen Basismodell
Note right of E: Definieren Modell mit zusätzlichem Attribut
OekoGebaeudeinventar_V1
Note right of E: Sammeln Daten im Format von
OekoGebaeudeinventar_V1
Note right of E: Validieren Daten im Format von
OekoGebaeudeinventar_V1
E ->>-A: Exportieren Daten im
Gebauedeinventar_V1
Note left of A: Validiert Daten im Format von
Gebauedeinventar_V1
```
--v--
### Check it out!
--v--
### Doch es gibt aber noch mehr
Wollen wir nun mehrere Arten von Gebäude erfassen:
- Wohngebäude (mit `Anzahl_Wohnungen`)
- Gewerbegebäude (mit `Anzahl_Firmen`)
- Öffentliche Gewerbegebäude (mit `Anzahl_Firmen` und `Zweck`)
... und dennoch alle schlussendlich als `Gebaeude` zurückliefern.
--v--
#### Die Ableitung in INTERLIS (Teil 2)
...mit `EXTENDS`
CLASS Gebaeude =
EGID : MANDATORY TEXT*16;
Koordinaten : MANDATORY GeometryCHLV95_V1.Coord2;
END Gebaeude;
CLASS Gewerbegebaeude
EXTENDS Gebaeude =
Anzahl_Firmen : MANDATORY 1 .. 100;
END Gewerbegebaeude;
--v--
### Beispielmodell `MultiGebaeudeinventar_V1`
--v--
#### Die Klassen in INTERLIS
MODEL Gebaeudeinventar_V1 (de) =
TOPIC Gebaeude =
CLASS Gebaeude =
EGID : MANDATORY TEXT*16;
Koordinaten : MANDATORY GeometryCHLV95_V1.Coord2;
END Gebaeude;
CLASS Adresse =
Strasse : TEXT*200;
Ort : MANDATORY TEXT*200;
END Adresse;
ASSOCIATION AdresseGebaeude =
GebaeudeAdresse -- {1..*} Adresse;
Gebaeude -- {1} Gebaeude;
END AdresseGebaeude;
END Gebaeude;
END Gebaeudeinventar_V1.
MODEL MultiGebaeudeinventar_V1 (de) =
IMPORTS Gebaeudeinventar_V1;
TOPIC Gebaeude EXTENDS Gebaeudeinventar_V1.Gebaeude=
!! First inheritance
CLASS Wohngebaeude
EXTENDS Gebaeude =
Anzahl_Wohnungen : MANDATORY 1 .. 1000;
END Wohngebaeude;
!! Second inheritance
CLASS Gewerbegebaeude
EXTENDS Gebaeude =
Anzahl_Firmen : MANDATORY 1 .. 100;
END Gewerbegebaeude;
!! Inheritance of first inheritance
CLASS Oeffentliches_GewerbeGebaude
EXTENDS Gewerbegebaeude =
Zweck : MANDATORY TEXT*255;
END Oeffentliches_GewerbeGebaude;
END Gebaeude;
END MultiGebaeudeinventar_V1.
--v--
## Ready für Übung 2 🚀
--v--
## Exkurs 2.2: Physische Abbildung von Vererbungen
--v--
### Mal vornweg
> Versuchs mal mit Smart2 und wenns nicht gut aussieht mit Smart1.
>
> ***Zitat: Romedi Filli - 2022***
--v--
### Vererbungsmapping Strategien
- New Class
- Super Class
- Sub Class
- New+Sub Class
--v--
#### Beispielmodell

--v--
#### New Class
```none
Gebaeude.t_type: (
Wohngebaeude,
Gewerbegebaeude,
Oeffentliches_
Gewerbegebaeude
)
```
- Erweiterungen sind mit Beziehungen gemappt
- NOT NULL Bedingung wird eingehalten
- Mehrere Imports benötigt pro Objekt

--v--
#### Beispielmodell

--v--
#### Super Class
```none
Gebaeude.t_type: (
Wohngebaeude,
Gewerbegebaeude,
Oeffentliches_
Gewerbegebaeude
)
```
- Weniger Tabellen und Beziehungen (easy to use)
- NOT NULL Bedingung wird **nicht** eingehalten

--v--
#### Beispielmodell

--v--
#### Sub Class
```none
Oeffentliches_
Gewerbegebaeude.t_type: (
Gewerbegebaeude,
Oeffentliches_
Gewerbegebaeude
)
```
- NOT NULL Bedingung wird **nicht** eingehalten

--v--
#### Beispielmodell

--v--
#### New + Sub Class
- Keine types
- IMO das erwartete Vorgehen
- NOT NULL Bedingung wird eingehalten

--v--
### Smart Mapping in ili2db
--v--
#### noSmartMapping
- Alle Klassen werden mit der *New Class* Strategie gemappt.
--v--
#### noSmartMapping
Resultiert in was wir sehen in der *New Class* Grafik.

--v--
#### smart1Inheritance
- Abstrakte Klassen ohne Beziehungen -> *Sub Class* Strategie
- Abstrakte Klassen mit Beziehungen und keiner konkreten Super Klasse -> *New Class* Strategie
- Konkrete Klassen mit keiner konkreten Super Klasse -> *New Class* Strategie
- Alle anderen Klassen -> *Super Class* Strategie
--v--
#### smart1Inheritance
Heisst also `Gebaeude` nutzt *New Class* und alle andern *Super Class* Strategie.
Resultiert in was wir sehen in der *Super Class* Grafik.

--v--
#### smart2Inheritance
- Abstrakte Klassen -> *Sub Class* Strategie
- Alle konkreten Klassen -> *New + Sub Class* Strategie
--v--
#### smart2Inheritance
Heisst also alle nutzen *New+Sub Class* Strategie.
Resultiert in was wir sehen in der *New+Sub Class* Grafik.

--v--
#### Zusammengefasst
- smart 1 ↗️
- smart 2 ↘️
--v--
## Zeit für Übung 2.1? 🚀
--v--
## Exkurs 2.3: Projektoptimierung mit Smart2
--v--
### Erstellen wir ein Projekt ohne Optimierung

...probieren wirs aus mit `OekoGebaeudeinventar_V1` (oder auch `ZG_Nutzungsplanung_V1_1`)
--v--
### Problematik
Wenn ein Modell bzw. Topic erweiterte Klassen enthält, werden die inklusive Basisklassen in der physischen Datenbank implementiert...
... und folglich Layer in QGIS erstellt.
--v--
### Können wir Basisklassen einfach ignorieren?
--v--
### Aber welche Layer wollen wir denn sehen?
- Basisklassen mit gleichnamigen Erweiterungen sind ***irrelevant***
- Basisklassen mit mehreren Erweiterungen sind ***irrelevant***
- Ausser wenn die Erweiterung im gleichen Modell ist, sind sie nicht nicht ***irrelevant***
--v--
### Strategien
- Verstecke irrelevante Basisklassen
- Gruppiere irrelevante Basisklassen
- Keine: Layer werden so umbenannt, dass sie eindeutig sind
--v--
### Check it out!
--v--
## Ready for Zmittag 🍲
--v--
## Exkurs 3: Behälter und Datasets
--v--
### Datasets
- Datensätze eines bestimmten **räumlichen oder thematischen** Bereichs
- **Unabhängig** des Modells (im Gegensatz zum Topic)
- Die Daten eines Datasets können unabhängig von den anderen Daten **verwaltet, validiert und exportiert** werden.
--v--
### Baskets (Behälter)
- Eine kleinere Instanz
- Währenddem die Datasets meist das ganze Modell umfassen, sind die Behälter meist Teil eines Topics
- Meistens sind sie die Schnittmenge von Topic und Dataset
--v--

--v--

--v--

--v--

--v--

--v--

--v--
## Ready to go 🚀
--v--
## Exkurs 4: Was sind OIDs?
--v--
### OIDs
Objekt-IDs (OID) sind **systemübergreifend eindeutige** Zeichenketten, die ein INTERLIS Objekt identifizieren.
Um Objekte **konfiliktlos** über verschiedene Stellen **austauschen** und **updaten**.
--v--
### TIDs
In der Transferdatei ist die OID unter TID einsehbar.
```xml
Rue des Fleures1
```
--v--
### Weshalb TID und nicht OID?
- Eine OID ist im XTF eine TID
- Eine TID im XTF ist aber *nicht immer* eine OID
Denn man muss nicht unbedingt mit OIDs arbeiten. Eine XTF Datei braucht aber TIDs für Referenzen etc.
Wenn man keine OIDs benutzt, sind die TIDs einfach irgendwelche Nummern oder Zeichen (keine systemübergreifende Stabilität garantiert!)
--v--
### Und im physischen Datenbankschema?

--v--
#### t_id vs. t_ili_tid
- Die `t_ili_tid` entspricht der **TID** im XTF und somit der OID (sofern OIDs verwendet werden)
- Die `t_id` ist nur eine **systeminterne** Sequenz-Nummer
--v--
#### Wann wird die t_id zur TID und die TID zur t_ili_tid?
- die `t_ili_tid` leer bleibt, dann wird bei einem **Export** die `t_id` in die TID geschrieben.
- beim **Import** wird dann die TID in die `t_ili_tid` geschrieben.
--v--

--v--
### Wann muss/soll ich OIDs verwenden?
- Sobald mehr als eine Stelle Daten sammelt und verwaltet
- Wenn es das Modell voraussetzt:
```
[...]
TOPIC Constructions =
BASKET OID AS INTERLIS.UUIDOID;
OID AS INTERLIS.STANDARDOID;
[...]
```
--v--
### Arten von OIDs
- UUIDOID
- I32OID
- STANDARDOID
- ANYOID
- Benutzerdefinierte OID
--v--
#### UUIDOID
- `OID TEXT*36`
- Universally Unique IDentifier
##### Standardwert Model Baker
```
uuid('WithoutBraces')
```
--v--
#### I32OID
- `OID 0 ... 2147483647`
##### Standardwert Model Baker
```
t_id
```
--v--
#### STANDARDOID
- `OID TEXT*16`
- **Präfix (2 + 6 Zeichen)**
Länderkennung + ein *globaler* Identifikationsteil.
- **Postfix (8 Zeichen)**
Sequenz (numerisch oder alphanumerisch) des Systems als *lokaler* Identifikationsteil.
##### Standardwert Model Baker
```
'%change%' || lpad( T_Id, 8, 0 )
```
--v--
#### ANYOID
Definiert kein Format für die OID, sondern nur, dass eine OID in allen erweiterten Modellen definiert werden muss.
--v--
#### Nicht definierte OIDs
Es gelten Regeln des **XML-ID-Typs** (www.w3.org/TR/REC-xml)
- **erstes** Zeichen muss ein **Buchstabe oder Unterstrich** sein
- gefolgt von **Buchstaben, Zahlen, Punkten, Minuszeichen, Unterstrichen** - sonst nix.
##### Standardwert im Model Baker
```
'_' || uuid('WithoutBraces')
```
***Gleiches gilt für benutzerdefinierte OIDs.***
--v--
### OID Manager
*Datenbank > Model Baker > OID Manager*

--v--
### Check it out!
--v--
## Exkurs 5: UsabILIty Hub
--v--
### Wofür ist UsabILIty Hub?
- Erhalten von Zusatzinformationen zu **INTERLIS Modellen** und ihre **(QGIS) Projekte** automatisch übers Web.
- Zusätzliche Konfigurationen **einmalig** gemacht und mehrfach verwendet.
--v--
### Wie funktioniert UsabILIty Hub?
--v--
#### 1. Anwender:in wählt **Modell**
- Repositorien-übergreifende Suche nach **Metakonfigurationsfiles**.
- Finden der **Metakonfigurationsfiles** in den `ilidata.xml` auf UsabILItyHub (https://models.opengis.ch) oder eigenen Repositories.
--v--
#### 2. Metakonfigurationsfile wird geparst
Dort sind **Konfigurationen** für ili2db, Model Baker und andere Tools definiert.
Ebenso auch **Links** (Ids) zu:
- Katalogen
- Extra Meta Attribute File
- Toppingfiles
--v--
#### 3. Konfigurationen werden gesetzt
- ili2db: Smart-Mapping, Basket-Handling etc.
--v--
#### 4. Links werden aufgelöst
- Repositorien-übergreifende Suche der **Kataloge, Extra Meta Attribut File und Toppingfiles**
**Toppingfiles** enthalten Informationen zu:
- Symbologien und Formularkonfigurationen
- Legendenlayout und Layer-Reihenfolge
- Map Themes, Print Layouts
- etc.
--v--
#### 5. Nutzen der Informationen
- Führe ili2db aus anhand der Konfigurationen und Extra Meta Attribut File
- Importiere die gefundenen Kataloge
- Generiere das Projekt anhand der Toppingfiles
--v--
### Ablauf

--v--
### Dokumentation
Siehe https://usabilityhub.opengis.ch/
Oder die [Model Baker Dokumentation](https://opengisch.github.io/QgisModelBaker/background_info/usabilityhub/modelbaker_integration/)
--v--
## Ready to go 🚀
--v--
## Exkurs 6: Übersetzungsmodelle
--v--
### Was sind Übersetzungsmodelle?
Übersetzungsmodelle sind ***übersetzte Modelle***, die sich von der Struktur her vom Originalmodell ***nicht*** unterscheiden.
--v--
### Beispiel Gebaeudeinventar_V1

--v--
## Ready to go 🚀
### Beispiel Plans d'affectation
Fr:
https://models.geo.admin.ch/ARE/PlansDAffectation_V1_2.ili
De:
https://models.geo.admin.ch/ARE/Nutzungsplanung_V1_2.ili
--v--
## Ready to go 🚀
---
# Übungen
... machen Meister:innen
--v--
## Übung 1: Erstellen eines benutzbaren Projektes
- Erstellt ein Projekt für `KbS_V1_5` inklusive Extra Meta Attribut File
- Fügt eine Hintergrundkarte hinzu
- Speichert das Projekt ab.
--v--
## Übung 2: Smart Inheritance Mapping
- Importiere das Modell `MultiGebaeudeinventar_V1` mit **Smart1Inheritance**
- Umbenennen der Layer zu `_Smart1`
- Importiere das Modell `MultiGebaeudeinventar_V1` mit **Smart2Inheritance**
Nutze dabei keine Optimierung:

--v--
## Übung 2.1: Optimierung des Projekts
- Importiere das Modell `OekoGebaeudeinventar_V1` mit **Smart2Inheritance**
- Importiere das Modell `ZG_Nutzungsplanung_V1_1` mit **Smart2Inheritance**
Nutze dabei keine Optimierung:

--v--
## Übung 3: Erfassen in Datasets
- Erstelle das Projekt mit Datasets für TG und SH (sofern noch nicht gemacht)
- Füge ein Gebiet in Stein am Rhein TG zu.
- Erfasse ein Gebiet in SH
- Erstelle ein neuer Dataset für ZH
- Erfasse ein Gebiet in ZH
--v--
## Übung 4: Export
- Exportiere alle Daten in eine Transferdatei (inkl. Codelists)
- Exportiere nur die Nutzdaten von SH in eine Transferdatei
### Zusatzaufgabe
- Erstelle ein Projekt für `OekoGebaeudeinventar_V1` mit Smart2 und Hide-Optimierung
- Erfasse ein Objekt
- Exportiere für `OekoGebaeudeinventar_V1` und für `Gebaeudeinventar_V1`
--v--
## Übung 5: UsabILItyHub
- Konfiguriere ein beliebiges Projekt
- Exportiere die Toppings
- Importiere das Model zusammen mit den Toppings vom lokalen Repo
---
PAUSE
---
Eine Gruppe verschiedener Interessenten...
# Model Baker Group
--v--
## Projektteam
*in Order of Appearance*
- Romedi Filli, Kanton SH (Leitung)
- Manuel Kaufmann, Agroscope
- David Signer, OPENGIS.ch
- Pascal Megert, Kanton AI
- Marleen Schulze, Kanton SZ
- Adrian Weber, Kanton SO
--v--
## Finanzierung
--v--
## Jährlicher Beitrag mit Abstufungen
(ab Förderer mit Supportstunden inklusive):
- Visionär
- Förderer
- Unterstützer
- Gönner
--v--
## Projektbezogen

---
Fragen?
---
## opengis.ch/de/kursbewertung
---
### Das wars...
#### Web: www.opengis.ch
#### Email: david@opengis.ch
#### Github: github.com/opengisch / github.com/signedav
#### Mastodon: @opengisch@fosstodon.org / @signedav@fosstodon.org