'
```
--v--
### Exemple avec Model Baker (3)
Définition dans le modèle **KbS_V1_5**
MODEL KbS_V1_5 (de) =
TOPIC Belastete_Standorte =
!!@qgis.modelbaker.dispExpression = "'Nr: '|| uid ||' / '|| katastername"
CLASS ZustaendigkeitKataster =
[...]

--v--
### Listes de méta-attributs
- [Compilateur INTERLIS (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)
- [Validateur INTERLIS (ilivalidator) ](https://github.com/claeis/ilivalidator/blob/master/docs/ilivalidator.rst#interlis-metaattribute)
- [Gestionnaire INTERLIS (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/)
*(incomplet) Voir aussi https://interlis.discourse.group/t/uebersicht-interlis-meta-attribute/70*
--v--
### Les méta-attributs dans le modèle sont formidables
Mais nous ne pouvons pas simplement bricoler le modèle !
--v--
### Fichier de méta-attributs supplémentaire
... connu comme "fichier de configuration", "fichier de méta-attributs", "fichier INI", "fichier TOML"...
***En réalité au format INI, mais généralement enregistré sous `.toml`.***
À ne pas confondre avec le ***fichier de méta-configuration*** pour "contrôler" ili2db (également en relation avec UsabILIty Hub).
--v--
#### Exemple avec Model Baker
Définition dans le fichier de configuration pour **KbS_V1_5**
```INI
["KbS_V1_5.Belastete_Standorte.ZustaendigkeitKataster"]
qgis.modelbaker.dispExpression = "'Nr: '|| uid ||' / '||katastername"
```

--v--
### Contrôler les validations avec des méta-attributs
Juste pour information...
```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--
### De quoi avons-nous besoin pour KbS_V1_5 ?
- Multi-géométrie construite à partir de `STRUCTURE MultiPolygon`
- "Multilinguisme aplati" sur `STRUCTURE MultilingualUri`
--v--
#### L'attribut de mapping
`ili2db.mapping`
- Sur la classe ou la structure
*Les structures sont mappées avec des colonnes au lieu de relations (par exemple, la multi-géométrie).*
- Sur l'attribut
*Les attributs de structure (`BAG OF`/`LIST OF`) sont mappés avec un type de données au lieu de relations.*
--v--
#### Définition dans le modèle INTERLIS
!!@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--
#### Définition dans le fichier de méta-attributs supplémentaire
```INI
[KbS_V1_5.Belastete_Standorte.MultiPolygon]
ili2db.mapping = "MultiSurface"
[KbS_V1_5.Belastete_Standorte.MultilingualUri]
ili2db.mapping = "Multilingual"
```
--v--
## Prêt pour l'exercice 1 🚀
--v--
## Intermède 2.1 : Héritages dans INTERLIS
--v--
### Cas d'utilisation : Travailler avec KbS_V1_5
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Confédération
participant E as Canton
Note left of A: Definit un
Modèle de Geo-Données Minimal
MGDM_V1
A ->>+E: impose le modèle
Note right of E: Collecte les données dans le format
MGDM_V1
Note right of E: Valide les données dans le format
MGDM_V1
E ->>-A: Fournit les données dans le format
MGDM_V1
Note left of A: Valide les données dans le format
MGDM_V1
```
--v--
### Cas d'utilisation : Travailler avec une extension
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Confédération
participant E as Canton
Note left of A: Definit un
Modèle de Geo-Données Minimal
MGDM_V1
A ->>+E: impose le modèle
Note right of E: Definit un modèle avec
informations supplémentaire
CT_MGDM_V1
Note right of E: Collecte les données dans le format
CT_MGDM_V1
Note right of E: Valide les données dans le format
CT_MGDM_V1
E ->>-A: Fournit les données dans le format
MGDM_V1
Note left of A: Valide les données dans le format
MGDM_V1
```
--v--
### Exemple plus simple `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--
### Nous avons besoin de "plus"
Nous devons utiliser un attribut supplémentaire pour un projet écologique : `EntsprichtStandard`
Mais nous souhaitons toujours renvoyer les données sous forme de `Gebaeudeinventar_V1`.
--v--
### Cas d'utilisation : Projet écologique
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Projet initial
participant E as Projet écologique
Note left of A: Modèle donné
Gebauedeinventar_V1
A ->>+E: Utilisation du modèle de base
Note right of E: Definition du modèle avec attribut supplémentaire
OekoGebaeudeinventar_V1
Note right of E: Collecte les données dans le format
OekoGebaeudeinventar_V1
Note right of E: Valide les données dans le format
OekoGebaeudeinventar_V1
E ->>-A: Exportation des données dans le format
Gebauedeinventar_V1
Note left of A: Valide les données dans le format
Gebauedeinventar_V1
```
--v--
### Comment "héritons-nous" ?
**Étendre** une classe (classe de base) en une dérivation "améliorée".
Une classe étendue (dérivation) a **toutes les propriétés** de la classe de base **+ "plus"**.
**"plus"** signifie des **attributs** ou des **restrictions** supplémentaires.
--v--
### De `Gebaeude` devient un meilleur `Gebaeude`

--v--
#### La dérivation en INTERLIS (1)
... avec `EXTENDED`
CLASS Gebaeude =
EGID : MANDATORY TEXT*16;
Koordinaten : MANDATORY GeometryCHLV95_V1.Coord2;
END Gebaeude;
CLASS Gebaeude (EXTENDED) =
EntsprichtStandard: BOOLEAN;
END Gebaeude;
--v--
### Et voilà, nous l'avons !
```mermaid
%%{init: {'theme': 'dark' } }%%
sequenceDiagram
participant A as Projet initial
participant E as Projet écologique
Note left of A: Modèle donné
Gebauedeinventar_V1
A ->>+E: Utilisation du modèle de base
Note right of E: Definition du modèle avec attribut supplémentaire
OekoGebaeudeinventar_V1
Note right of E: Collecte les données dans le format
OekoGebaeudeinventar_V1
Note right of E: Valide les données dans le format
OekoGebaeudeinventar_V1
E ->>-A: Exportation des données dans le format
Gebauedeinventar_V1
Note left of A: Valide les données dans le format
Gebauedeinventar_V1
```
--v--
### Vérifiez !
--v--
### Mais il y a encore plus
Nous voulons maintenant saisir plusieurs types de bâtiments :
- Bâtiments résidentiels (avec `Anzahl_Wohnungen`)
- Bâtiments commerciaux (avec `Anzahl_Firmen`)
- Bâtiments commerciaux publics (avec `Anzahl_Firmen` et `Zweck`)
... et tout renvoyer finalement comme `Gebaeude`.
--v--
#### La dérivation en INTERLIS (partie 2)
... avec `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--
### Exemple de modèle `MultiGebaeudeinventar_V1`
--v--
#### Les classes en 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--
## Prêt pour l'exercice 2 🚀
--v--
## Intermède 2.2 : Représentation physique des héritages
--v--
### D'abord
> Essayez avec Smart2 et si ça ne va pas, essayez avec Smart1.
>
> ***Citation : Romedi Filli - 2022***
--v--
### Stratégies de mapping d'héritage
- New Class
- Super Class
- Sub Class
- New+Sub Class
--v--
#### Exemple de modèle

--v--
#### New Class
```none
Gebaeude.t_type : (
Wohngebaeude,
Gewerbegebaeude,
Oeffentliches_
Gewerbegebaeude
)
```
- Les extensions sont mappées avec des relations.
- La condition NON NUL est respectée.
- Plusieurs importations sont nécessaires par objet.

--v--
#### Exemple de modèle

--v--
#### Super Class
```none
Oeffentliches_
Gewerbegebaeude.t_type: (
Gewerbegebaeude,
Oeffentliches_
Gewerbegebaeude
)
```
- Moins de tables et de relations (facile à utiliser)
- La condition NOT NULL **n'est pas** respectée

--v--
#### Exemple de modèle

--v--
#### Sub Class
```none
Oeffentliches_
Gewerbegebaeude.t_type: (
Gewerbegebaeude,
Oeffentliches_
Gewerbegebaeude
)
```
- La condition NON NUL **n'est pas** respectée.

--v--
#### Exemple de modèle

--v--
#### New+Sub Class
- Pas de types
- À mon avis, la procédure attendue
- La condition NOT NULL est respectée

--v--
### Smart Mapping dans ili2db
--v--
#### noSmartMapping
- Toutes les classes sont mappées avec la stratégie *New Class*.
--v--
#### noSmartMapping
Résulte en ce que nous voyons dans le graphique *New Class*.

--v--
#### smart1Inheritance
- Classes abstraites sans relations -> stratégie *Super Class*
- Classes abstraites avec relations et sans super classe concrète -> stratégie *New Class*
- Classes concrètes sans super classe concrète -> stratégie *New Class*
- Toutes les autres classes -> stratégie *Super class*
--v--
#### smart1Inheritance
Signifie donc que `Gebaeude` utilise la stratégie *New Class* et toutes les autres la stratégie *Super class*.
Résulte en ce que nous voyons dans le graphique *Super class*.

--v--
#### smart2Inheritance
- Classes abstraites -> stratégie *Super Class*
- Toutes les classes concrètes -> stratégie *New+Sub Class*
--v--
#### smart2Inheritance
Signifie donc que toutes utilisent la stratégie *New+Sub Class*.
Résulte en ce que nous voyons dans le graphique *New+Sub Class*.

--v--
#### En résumé
- smart 1 ↗️
- smart 2 ↘️
--v--
## Il est temps de faire l'exercice 2.1 ? 🚀
--v--
## Intermède 2.3 : Optimisation de projet avec Smart2
--v--
### Créons un projet sans optimisation

... essayons avec `OekoGebaeudeinventar_V1` (ou aussi `ZG_Nutzungsplanung_V1_1`)
--v--
### Problématique
Si un modèle ou un topic contient des classes étendues, celles-ci sont implémentées dans la base de données physique, y compris les classes de base...
... et par conséquent, des couches sont créées dans QGIS.
--v--
### Pouvons-nous simplement ignorer les classes de base ?
--v--
### Mais quelles couches voulons-nous voir ?
- Les classes de base avec des extensions du même nom sont ***non pertinentes***
- Les classes de base avec plusieurs extensions sont ***non pertinentes***
- Sauf si l'extension est dans le même modèle, elles ne sont pas ***non pertinentes***
--v--
### Stratégies
- Masquer les classes de base non pertinentes
- Grouper les classes de base non pertinentes
- Aucune : les couches sont renommées pour être uniques
--v--
### Vérifiez !
--v--
## Prêt pour le dîner 🍲
--v--
## Intermède 3 : Conteneurs et ensembles de données
--v--
### Ensembles de données (datasets)
- Ensembles de données d'un domaine **spatial ou thématique** spécifique
- **Indépendant** du modèle (contrairement au topic)
- Les données d'un ensemble de données peuvent être **gérées, validées et exportées** indépendamment des autres données.
--v--
### conteneurs (baskets)
- Une instance plus petite
- Alors que les ensembles de données couvrent généralement l'ensemble du modèle, les conteneurs font généralement partie d'un topic
- Le plus souvent, ils sont l'intersection du topic et de l'ensemble de données
--v--

--v--

--v--

--v--

--v--

--v--

--v--
## Prêt à démarrer 🚀
--v--
## Intermède 4 : Que sont les OID ?
--v--
### OID
Les identifiants d'objet (OID) sont des chaînes de caractères **uniques à travers les systèmes** qui identifient un objet INTERLIS.
Pour **échanger** et **mettre à jour** des objets **sans conflit** à travers différents endroits.
--v--
### TID
Dans le fichier de transfert, l'OID est visible sous TID.
```xml
Rue des Fleures1
```
--v--
### Pourquoi TID et pas OID ?
- Un OID dans un XTF est un TID
- Un TID dans un XTF n'est *pas toujours* un OID
Car il n'est pas obligatoire de travailler avec des OID. Un fichier XTF a besoin de TID pour les références, etc.
Si vous n'utilisez pas d'OID, les TID sont simplement des nombres ou des caractères quelconques (pas de stabilité à travers les systèmes garantie !)
--v--
### Et dans le schéma de base de données physique ?

--v--
#### t_id vs. t_ili_tid
- Le `t_ili_tid` correspond au **TID** dans le XTF et donc à l'OID (si des OID sont utilisés)
- Le `t_id` n'est qu'un numéro de séquence **interne au système**
--v--
#### Quand le t_id devient-il TID et le TID devient-il t_ili_tid ?
- Si le `t_ili_tid` reste vide, alors lors d'une **exportation**, le `t_id` est écrit dans le TID.
- Lors de l'**importation**, le TID est alors écrit dans le `t_ili_tid`.
--v--

--v--
### Quand dois-je utiliser des OID ?
- Dès que plusieurs endroits collectent et gèrent des données
- Si le modèle le requiert :
```
[...]
TOPIC Constructions =
BASKET OID AS INTERLIS.UUIDOID;
OID AS INTERLIS.STANDARDOID;
[...]
```
--v--
### Types d'OID
- UUIDOID
- I32OID
- STANDARDOID
- ANYOID
- OID défini par l'utilisateur
--v--
#### UUIDOID
- `OID TEXT*36`
- Identificateur Unique Universellement
##### Valeur par défaut Model Baker
```
uuid('WithoutBraces')
```
--v--
#### I32OID
- `OID 0 ... 2147483647`
##### Valeur par défaut Model Baker
```
t_id
```
--v--
#### STANDARDOID
- `OID TEXT*16`
- **Préfixe (2 + 6 caractères)**
Identifiant du pays + une partie d'identifications *globale*.
- **Postfix (8 caractères)**
Séquence (numérique ou alphanumérique) du système comme partie d'identifications *locale*.
##### Valeur par défaut Model Baker
```
'%change%' || lpad( T_Id, 8, 0 )
```
--v--
#### ANYOID
Ne définis pas de format pour l'OID, mais seulement qu'un OID doit être défini dans tous les modèles Symbolisations étendus.
--v--
#### OID non définis
Les règles du **type XML-ID** (www.w3.org/TR/REC-xml) s'appliquent
- le **premier** caractère doit être une **lettre ou un souligné**
- suivi de **lettres, chiffres, points, tirets, soulignés** - rien d'autre.
##### Valeur par défaut dans Model Baker
```
'_' || uuid('WithoutBraces')
```
***La même chose s'applique aux OID définis par l'utilisateur.***
--v--
### Gestionnaire d'OID
*Base de données > Model Baker > Gestionnaire d'OID*

--v--
### Vérifiez !
--v--
## Intermède 5 : UsabILIty Hub
--v--
### À quoi sert UsabILIty Hub ?
- Obtenir des informations supplémentaires sur les **modèles INTERLIS** et leurs **projets (QGIS)** automatiquement via le web.
- Configurations supplémentaires faites **une seule fois** et utilisées plusieurs fois.
--v--
### Comment fonctionne UsabILIty Hub ?
--v--
#### 1. L'utilisateur sélectionne le **modèle**
- Recherche inter-référentiels de **fichiers de méta-configuration**.
- Trouver les **fichiers de méta-configuration** dans les `ilidata.xml` sur UsabILItyHub (https://models.opengis.ch) ou les référentiels propres.
--v--
#### 2. Le fichier de méta-configuration est analysé
Les **configurations** pour ili2db, Model Baker et d'autres outils y sont définies.
Également des **liens** (Ids) vers :
- Catalogues
- Fichier de méta-attributs supplémentaire
- Fichiers de surcouche
--v--
#### 3. Les configurations sont définies
- ili2db : Smart-Mapping, gestion des conteneurs, etc.
--v--
#### 4. Les liens sont résolus
- Recherche inter-référentiels des **catalogues, fichier de méta-attributs supplémentaire et fichiers de surcouche**
Les **fichiers de surcouche** contiennent des informations sur :
- Symbologies et configurations de formulaires
- Disposition des légendes et ordre des couches
- Thèmes de carte, mises en page d'impression
- etc.
--v--
#### 5. Utilisation des informations
- Exécuter ili2db en utilisant les configurations et le fichier de méta-attributs supplémentaire
- Importer les catalogues trouvés
- Générer le projet en utilisant les fichiers de surcouche
--v--
### Déroulement

--v--
### Documentation
Voir https://usabilityhub.opengis.ch/
Ou la [documentation de Model Baker](https://opengisch.github.io/QgisModelBaker/background_info/usabilityhub/modelbaker_integration/)
--v--
## Prêt à démarrer 🚀
--v--
## Intermède 6 : Modèles de traduction
--v--
### Que sont les modèles de traduction ?
Les modèles de traduction sont des ***modèles traduits*** qui ne diffèrent ***pas*** du modèle original en termes de structure.
--v--
### Exemple Gebaeudeinventar_V1

--v--
## Prêt à démarrer 🚀
### Exemple 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--
## Prêt à démarrer 🚀
---
# Exercices
... la pratique rend parfait
--v--
## Exercice 1 : Créer un projet utilisable
- Créer un projet pour `KbS_V1_5` incluant un fichier de méta-attributs supplémentaire
- Ajouter une carte de fond
- Enregistrer le projet
--v--
## Exercice 2 : Smart Inheritance Mapping
- Importer le modèle `MultiGebaeudeinventar_V1` avec **Smart1Inheritance**
- Renommer les couches en `_Smart1`
- Importer le modèle `MultiGebaeudeinventar_V1` avec **Smart2Inheritance**
Ne pas utiliser d'optimisation :

--v--
## Exercice 2.1 : Optimisation du projet
- Importer le modèle `OekoGebaeudeinventar_V1` avec **Smart2Inheritance**
- Importer le modèle `ZG_Nutzungsplanung_V1_1` avec **Smart2Inheritance**
Ne pas utiliser d'optimisation :

--v--
## Exercice 3 : Saisie dans les ensembles de données
- Créer le projet avec des ensembles de données pour TG et SH (si ce n'est pas déjà fait)
- Ajouter une zone à Stein am Rhein TG.
- Saisir une zone dans SH.
- Créer un nouvel ensemble de données pour ZH.
- Saisir une zone dans ZH.
--v--
## Exercice 4 : Exportation
- Exporter toutes les données dans un fichier de transfert (y compris les listes de codes)
- Exporter uniquement les données utilisateur de SH dans un fichier de transfert
### Tâche supplémentaire
- Créer un projet pour `OekoGebaeudeinventar_V1` avec Smart2 et l'optimisation de masquage
- Saisir un objet
- Exporter pour `OekoGebaeudeinventar_V1` et pour `Gebaeudeinventar_V1`
--v--
## Exercice 5 : UsabILItyHub
- Configurer un projet quelconque
- Exporter les surcouches
- Importer le modèle avec les surcouches du référentiel local
---
PAUSE
---
Un groupe de différents intéressés...
# Model Baker Group
--v--
## Équipe de projet
*par ordre d'apparition*
- Romedi Filli, Canton SH (direction)
- Manuel Kaufmann, Agroscope
- David Signer, OPENGIS.ch
- Pascal Megert, Canton AI
- Marleen Schulze, Canton SZ
- Adrian Weber, Canton SO
--v--
## Financement
--v--
## Contribution annuelle avec des niveaux
(à partir du parrain avec heures de support incluses) :
- Visionnaire
- Parrain
- Soutien
- Donateur
--v--
## Par projet

---
Des questions ?
---
### C'est tout...
#### Web : www.opengis.ch
#### Courriel : david@opengis.ch
#### Github : github.com/opengisch / github.com/signedav
#### Mastodon : @opengisch@fosstodon.org / @signedav@fosstodon.org