{"id":458,"date":"2012-01-09T18:09:52","date_gmt":"2012-01-09T16:09:52","guid":{"rendered":"https:\/\/blog.georezo.net\/geointerop\/?p=458"},"modified":"2012-01-10T13:42:49","modified_gmt":"2012-01-10T11:42:49","slug":"conception-dun-format-gml-avec-contraintes","status":"publish","type":"post","link":"https:\/\/blog.georezo.net\/geointerop\/2012\/01\/09\/conception-dun-format-gml-avec-contraintes\/","title":{"rendered":"Conception d&rsquo;un format GML avec contraintes"},"content":{"rendered":"<div>\n<h1>1.   Introduction<\/h1>\n<\/div>\n<p>Ce document est le deuxi\u00e8me d&rsquo;une s\u00e9rie de trois articles consacr\u00e9s \u00e0 GML.<\/p>\n<p>Le premier, intitul\u00e9 \u00ab\u00a0<a title=\"Pourquoi utiliser GML ?\" href=\"https:\/\/blog.georezo.net\/geointerop\/2011\/06\/21\/pourquoi-utiliser-gml\/\">Pourquoi utiliser GML ?<\/a>\u00a0\u00bb pr\u00e9sentait les caract\u00e9ristiques de ce format et ses capacit\u00e9s de validation.<\/p>\n<p>Le pr\u00e9sent article d\u00e9crit de mani\u00e8re plus d\u00e9taill\u00e9e les \u00e9tapes de conception d&rsquo;un format GML int\u00e9grant des contraintes. Ce sont ces contraintes qui vont permettre d&rsquo;assurer la qualit\u00e9 de l&rsquo;\u00e9change de donn\u00e9es et qui constituent une grande partie de l&rsquo;int\u00e9r\u00eat de ce format.<\/p>\n<p>Nous commencerons par revenir sur les notions de sch\u00e9mas et de validation XML avant de d\u00e9crire leur application \u00e0 la cr\u00e9ation d&rsquo;un exemple de format GML (\u00ab\u00a0BIG\u00a0\u00bb) permettant la repr\u00e9sentation d&rsquo;un mod\u00e8le de donn\u00e9es complexe.<\/p>\n<p>Au del\u00e0 des aspects purement techniques de l&rsquo;\u00e9criture d&rsquo;un sch\u00e9ma d&rsquo;application XSD, nous discuterons pour terminer des enjeux li\u00e9s aux diff\u00e9rents types de mod\u00e9lisation des donn\u00e9es.<\/p>\n<p><!--more--><\/p>\n<div>\n<h1>2.   Notions de sch\u00e9mas et de validation<\/h1>\n<\/div>\n<p>En XML, la description pr\u00e9cise de la structure des donn\u00e9es est d\u00e9finie dans un deuxi\u00e8me fichier XML appel\u00e9 sch\u00e9ma. Ce fichier XML d&rsquo;extension .xsd d\u00e9termine le nom des \u00e9l\u00e9ments et des attributs pouvant \u00eatre pr\u00e9sents dans le XML cibl\u00e9 ainsi que leur type, leur ordre, leur r\u00e9p\u00e9tition, etc.<br \/>\nNotez que les sch\u00e9mas sont eux-m\u00eames d\u00e9finis par un sch\u00e9ma sp\u00e9cifique (<a href=\"http:\/\/www.w3.org\/2001\/XMLSchema.xsd\" target=\"_blank\">http:\/\/www.w3.org\/2001\/XMLSchema.xsd)<\/a>.<\/p>\n<p>Lorsqu&rsquo;un fichier XML est associ\u00e9 \u00e0 un sch\u00e9ma, un logiciel tiers comme <a href=\"http:\/\/www.altova.com\/xmlspy.html\" target=\"_blank\">XMLSpy<\/a> permet de s&rsquo;assurer que le document XML est conforme \u00e0 ce sch\u00e9ma, ce processus s&rsquo;appelle la validation.<\/p>\n<p>GML r\u00e9pond \u00e0 cette notion de sch\u00e9ma : un fichier GML est en fait un fichier XML classique auquel on adjoint un sch\u00e9ma pr\u00e9d\u00e9fini accessible par l&rsquo;URL <a href=\"http:\/\/schemas.opengis.net\/gml\/3.2.1\/gml.xsd\" target=\"_blank\">http:\/\/schemas.opengis.net\/gml\/3.2.1\/gml.xsd<\/a>. C&rsquo;est ce sch\u00e9ma norm\u00e9 qui donne ses particularit\u00e9s au GML comme la gestion des objets g\u00e9ographiques et des syst\u00e8mes de projection.<br \/>\nLe sch\u00e9ma complet du GML est relativement complexe : vous constaterez en effet en affichant le contenu du fichier \u00ab gml.xsd \u00bb cit\u00e9 pr\u00e9c\u00e9demment que ce sch\u00e9ma en inclut d&rsquo;autres (par exemple \u00ab coverage.xsd \u00bb ou \u00ab coordinateReferenceSystems.xsd \u00bb) et que ces sch\u00e9mas incluent eux-m\u00eames encore d&rsquo;autres sch\u00e9mas&#8230;<br \/>\nEn r\u00e9alit\u00e9 la version 3.2.1 du GML fait r\u00e9f\u00e9rence \u00e0 29 sch\u00e9mas XSD visibles depuis l&rsquo;URL <a href=\"http:\/\/schemas.opengis.net\/gml\/3.2.1\/\" target=\"_blank\">http:\/\/schemas.opengis.net\/gml\/3.2.1\/<\/a>.<\/p>\n<p>A ce stade, si vous cr\u00e9ez un fichier GML, celui-ci devra donc suivre scrupuleusement le sch\u00e9ma impos\u00e9 par le fichier \u00ab gml.xsd \u00bb et ses inclusions (norme ISO 19136). Cependant vous souhaiterez certainement ajouter des informations comme des noms d&rsquo;attributs ou de couches ou encore d\u00e9finir des contraintes sp\u00e9cifiques de type parent-enfant pour repr\u00e9senter votre mod\u00e8le de donn\u00e9es. Pour cela il faudra cr\u00e9er votre propre sch\u00e9ma qui inclura lui-m\u00eame le sch\u00e9ma \u00ab gml.xsd \u00bb afin de b\u00e9n\u00e9ficier des nombreuses sp\u00e9cificit\u00e9s du GML.<\/p>\n<p>Le chapitre suivant d\u00e9crit les diff\u00e9rents contr\u00f4les support\u00e9s par les sch\u00e9mas XSD. Ces contr\u00f4les sont g\u00e9n\u00e9riques et sont utilisables en GML.<\/p>\n<div>\n<h1>3.   Sch\u00e9mas XSD<\/h1>\n<\/div>\n<p>Il existe deux types d&rsquo;objets dans un fichier XML ou GML : les \u00e9l\u00e9ments et les attributs. Les sch\u00e9mas XSD permettent de d\u00e9finir leur nom, leur contenu ou encore leur ordre dans le fichier XML ou GML cibl\u00e9.<\/p>\n<p>Un \u00e9l\u00e9ment s&rsquo;ouvre et se ferme sous forme de balises. La fermeture est obligatoire. Par exemple, cr\u00e9ons un \u00e9l\u00e9ment nomm\u00e9 \u00ab ville \u00bb contenant la cha\u00eene de caract\u00e8res \u00ab Montpellier\u00a0\u00bb\u00a0:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;ville&gt;Montpellier&lt;\/ville&gt;<\/pre>\n<p>Si un \u00e9l\u00e9ment ne contient pas de donn\u00e9es, il est possible de l&rsquo;ouvrir et le fermer avec une seule balise :<br \/>\nPar exemple<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;ville\/&gt;<\/pre>\n<p>est \u00e9quivalent \u00e0<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;ville&gt;&lt;\/ville&gt;<\/pre>\n<p>Remarquez le \u00ab\u00a0\/\u00a0\u00bb \u00e0 la fin de la balise qui \u00e9quivaut \u00e0<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;\/ville&gt;<\/pre>\n<p>Un attribut est une information directement stock\u00e9e dans la balise d&rsquo;ouverture d&rsquo;un \u00e9l\u00e9ment. Par exemple :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;ville id=&quot;1&quot;&gt;Montpellier&lt;\/ville&gt;<\/pre>\n<p>Les attributs s&rsquo;utilisent plut\u00f4t pour le stockage de m\u00e9tadonn\u00e9es internes au XML ou au GML comme dans l&rsquo;exemple ci-dessus o\u00f9 l&rsquo;attribut \u00ab id \u00bb repr\u00e9sente un identifiant.<br \/>\nPour le stockage de la donn\u00e9e elle-m\u00eame, les \u00e9l\u00e9ments sont recommand\u00e9s. En effet les \u00e9l\u00e9ments ont des avantages sur les attributs : ils donnent notamment un fichier XML plus lisible et peuvent contenir plusieurs valeurs. Un attribut au sens SIG sera donc repr\u00e9sent\u00e9 en XML\/GML par un \u00e9l\u00e9ment et non pas par un attribut au sens XML.<\/p>\n<p>Dans la suite de ce document, nous nous attarderons donc sur les \u00e9l\u00e9ments et non pas sur les attributs (au sens XML) m\u00eame si ceux-ci se d\u00e9finissent \u00e9galement dans les sch\u00e9mas XSD.<\/p>\n<div>\n<h1>4.   Mod\u00e9lisation GML par l&rsquo;exemple<\/h1>\n<\/div>\n<p>Comme un exemple vaut souvent mieux qu&rsquo;une longue th\u00e9orie, nous allons partir d&rsquo;une donn\u00e9e exemple que nous souhaitons convertir en fichier GML associ\u00e9 \u00e0 son sch\u00e9ma .xsd.<\/p>\n<p>Le mod\u00e8le Entit\u00e9-Association de nos donn\u00e9es est le suivant :<\/p>\n<figure id=\"attachment_475\" aria-describedby=\"caption-attachment-475\" style=\"width: 373px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/ea.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-475\" src=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/ea.png\" alt=\"\" width=\"373\" height=\"253\" srcset=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/ea.png 373w, https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/ea-300x203.png 300w\" sizes=\"auto, (max-width: 373px) 100vw, 373px\" \/><\/a><figcaption id=\"caption-attachment-475\" class=\"wp-caption-text\">Mod\u00e8le de donn\u00e9es exemple<\/figcaption><\/figure>\n<p>Nous avons donc 2 tables \u00ab REGION \u00bb et \u00ab DEPARTEMENT \u00bb. Nous souhaitons les mod\u00e9liser en GML en conservant leurs caract\u00e9ristiques :<\/p>\n<ul>\n<li>Typage des attributs SIG (par exemple \u00ab surfDPT \u00bb est de type flottant);<\/li>\n<li>Nom des couches (REGION et DEPARTEMENT);<\/li>\n<li>Occurrence : il est possible d&rsquo;avoir plusieurs objets \u00ab DEPARTEMENT \u00bb et \u00ab REGION \u00bb dans le GML;<\/li>\n<li>Cl\u00e9s primaires (par exemple \u00ab idDPT \u00bb doit \u00eatre non nul et unique);<\/li>\n<li>Cl\u00e9s \u00e9trang\u00e8res (relations parents-enfants) : \u00ab REGION_idREG \u00bb est une cl\u00e9 \u00e9trang\u00e8re de \u00ab idREG \u00bb. La relation est de type 1-n;<\/li>\n<li>Il faudra enfin stocker ces informations dans un format compatible GML avec le stockage de la g\u00e9om\u00e9trie au format GML.<\/li>\n<\/ul>\n<p>Toutes ces caract\u00e9ristiques sont mod\u00e9lisables dans le sch\u00e9ma .xsd de notre futur format GML.<\/p>\n<h2>4.1    Mod\u00e9lisation des attributs SIG<\/h2>\n<p>Les attributs au sens SIG de nos donn\u00e9es sont les plus petits objets \u00e0 mod\u00e9liser. En XML\/GML ils seront d\u00e9finis comme \u00e9tant des <strong>\u00e9l\u00e9ments simples<\/strong> c&rsquo;est \u00e0 dire des \u00e9l\u00e9ments ne contenant qu&rsquo;une simple valeur mais pas de sous-\u00e9l\u00e9ments.<\/p>\n<p>La d\u00e9finition d&rsquo;un \u00e9l\u00e9ment simple dans un XSD se fait g\u00e9n\u00e9ralement de cette mani\u00e8re, en 2 \u00e9tapes :<\/p>\n<p>1\u00e8re \u00e9tape, on d\u00e9finit le \u00ab typage \u00bb de l&rsquo;\u00e9l\u00e9ment :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:simpleType name=&quot;type_entier&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:integer&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;<\/pre>\n<p><strong>type_entier<\/strong> : nom du type que l&rsquo;on d\u00e9finit (texte quelconque, doit \u00eatre unique).<br \/>\n<strong>xs:integer<\/strong> : correspond \u00e0 un type pr\u00e9d\u00e9fini \u00ab entier \u00bb indiquant que seuls les nombres entiers seront valides pour ce type. Nous verrons la liste des types pr\u00e9d\u00e9finis plus loin dans ce document.<\/p>\n<p>2\u00e8me \u00e9tape, on d\u00e9finit l&rsquo;\u00e9l\u00e9ment lui-m\u00eame en faisant r\u00e9f\u00e9rence au \u00ab typage \u00bb :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:element name=&quot;test&quot; type=&quot;type_entier&quot;\/&gt;<\/pre>\n<p><strong>test <\/strong>: nom de l&rsquo;\u00e9l\u00e9ment tel qu&rsquo;il appara\u00eetra dans le XML\/GML.<br \/>\n<strong>type_entier<\/strong> : pour \u00eatre valide l&rsquo;\u00e9l\u00e9ment devra contenir une valeur respectant le type \u00ab type_entier \u00bb que l&rsquo;on a d\u00e9fini pr\u00e9c\u00e9demment.<\/p>\n<p>On aurait pu combiner les 2 \u00e9tapes en une seule, mais l\u2019int\u00e9r\u00eat de s\u00e9parer le \u00ab typage \u00bb de d&rsquo;\u00e9l\u00e9ment est que le \u00ab typage \u00bb pourra \u00eatre r\u00e9utilis\u00e9 pour d\u00e9finir un autre \u00e9l\u00e9ment.<\/p>\n<p>La mod\u00e9lisation des attributs SIG de nos donn\u00e9es exemple ressemblera donc \u00e0 ceci :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;xs:simpleType name=&quot;type_entier&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:integer&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:simpleType name=&quot;type_caracteres&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:string&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:simpleType name=&quot;type_flottant&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:float&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:element name=&quot;idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n&lt;xs:element name=&quot;nomREG&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n&lt;xs:element name=&quot;idDPT&quot; type=&quot;type_entier&quot;\/&gt;\r\n&lt;xs:element name=&quot;nomDPT&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n&lt;xs:element name=&quot;surfDPT&quot; type=&quot;type_flottant&quot;\/&gt;\r\n&lt;xs:element name=&quot;REGION_idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n<\/pre>\n<p>Dans cet exemple nous avons donc d&rsquo;abord d\u00e9fini les diff\u00e9rents types de base (type_entier, type_caracteres et type_flottant) puis les \u00e9l\u00e9ments \u00e0 partir des types de base.<\/p>\n<h2>4.2    Mod\u00e9lisation des couches SIG<\/h2>\n<p>Maintenant que nous avons mod\u00e9lis\u00e9 les attributs SIG, il faut mod\u00e9liser les couches ou types d&rsquo;entit\u00e9s. En GML celles-ci seront d\u00e9finies comme \u00e9tant des \u00e9l\u00e9ments complexes c&rsquo;est \u00e0 dire des \u00e9l\u00e9ments autoris\u00e9s \u00e0 contenir d&rsquo;autres \u00e9l\u00e9ments (en l\u2019occurrence les \u00e9l\u00e9ments d\u00e9finissant les attributs au sens SIG).<\/p>\n<p>La d\u00e9finition d&rsquo;un \u00e9l\u00e9ment complexe dans un XSD se fait g\u00e9n\u00e9ralement de cette mani\u00e8re, en 2 \u00e9tapes :<\/p>\n<p>1\u00e8re \u00e9tape, on d\u00e9finit le \u00ab typage \u00bb de l&rsquo;\u00e9l\u00e9ment :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;xs:complexType name=&quot;type_nom&quot;&gt;\r\n\t&lt;xs:sequence&gt;\r\n\t\t&lt;xs:element name=&quot;element1&quot; type=&quot;type1&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;element2&quot; type=&quot;type2&quot;\/&gt;\r\n\t&lt;\/xs:sequence&gt;\r\n&lt;\/xs:complexType&gt;\r\n<\/pre>\n<p><strong>type_nom <\/strong>: nom du type que l&rsquo;on d\u00e9finit (texte quelconque, doit \u00eatre unique).<br \/>\n<strong>xs:sequence <\/strong>: indique que notre \u00e9l\u00e9ment complexe contient une s\u00e9quence ordonn\u00e9e de sous-\u00e9l\u00e9ments.<\/p>\n<p>2\u00e8me \u00e9tape, comme pour les \u00e9l\u00e9ments simples, on d\u00e9finit l&rsquo;\u00e9l\u00e9ment lui-m\u00eame en faisant r\u00e9f\u00e9rence au \u00ab typage \u00bb :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:element name=&quot;element&quot; type=&quot;type_nom&quot;\/&gt;<\/pre>\n<p><strong>element<\/strong> : nom de l&rsquo;\u00e9l\u00e9ment tel qu&rsquo;il appara\u00eetra dans le XML\/GML.<br \/>\n<strong>type_nom<\/strong> : pour \u00eatre valide l&rsquo;\u00e9l\u00e9ment devra contenir la s\u00e9quence de sous-\u00e9l\u00e9ments impos\u00e9e par le type complexe \u00ab type_nom \u00bb que l&rsquo;on a d\u00e9fini pr\u00e9c\u00e9demment.<\/p>\n<p>On aurait pu combiner les 2 \u00e9tapes en une seule, mais l\u2019int\u00e9r\u00eat de s\u00e9parer le \u00ab typage \u00bb de d&rsquo;\u00e9l\u00e9ment est que le \u00ab typage \u00bb pourra \u00eatre r\u00e9utilis\u00e9 pour d\u00e9finir un autre \u00e9l\u00e9ment.<\/p>\n<p>La mod\u00e9lisation des attributs et des couches SIG de nos donn\u00e9es exemple ressemblera donc \u00e0 ceci :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:simpleType name=&quot;type_entier&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:integer&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:simpleType name=&quot;type_caracteres&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:string&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:simpleType name=&quot;type_flottant&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:float&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:complexType name=&quot;type_region&quot;&gt;\r\n\t&lt;xs:sequence&gt;\r\n\t\t&lt;xs:element name=&quot;idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;nomREG&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t&lt;\/xs:sequence&gt;\r\n&lt;\/xs:complexType&gt;\r\n&lt;xs:complexType name=&quot;type_departement&quot;&gt;\r\n\t&lt;xs:sequence&gt;\r\n\t\t&lt;xs:element name=&quot;idDPT&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;nomDPT&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;surfDPT&quot; type=&quot;type_flottant&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;REGION_idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t&lt;\/xs:sequence&gt;\r\n&lt;\/xs:complexType&gt;\r\n&lt;xs:element name=&quot;REGION&quot; type=&quot;type_region&quot;\/&gt;\r\n&lt;xs:element name=&quot;DEPARTEMENT&quot; type=&quot;type_departement&quot;\/&gt;<\/pre>\n<p>On d\u00e9finit d&rsquo;abord les types simples, puis les types complexes qui contiennent les \u00e9l\u00e9ments simples, puis les \u00e9l\u00e9ments complexes faisant r\u00e9f\u00e9rence aux types complexes.<\/p>\n<h2>4.3    Structure du document GML<\/h2>\n<p>La mod\u00e9lisation de la structure de donn\u00e9es \u00e0 repr\u00e9senter est une \u00e9tape tr\u00e8s importante de la conception d&rsquo;un format GML. Les diff\u00e9rents types de repr\u00e9sentation sont pr\u00e9sent\u00e9s dans le chapitre 7 \u00ab\u00a0Mod\u00e9lisation de la structure de donn\u00e9es\u00a0\u00bb.<\/p>\n<p>Pour l&rsquo;instant, consid\u00e9rons que nous souhaitons repr\u00e9senter les d\u00e9partements et les r\u00e9gions comme deux types d&rsquo;entit\u00e9s ind\u00e9pendants.<\/p>\n<p>Dans un fichier XML, l&rsquo;ensemble des \u00e9l\u00e9ments doit \u00eatre encadr\u00e9 par un \u00e9l\u00e9ment racine c&rsquo;est \u00e0 dire un \u00e9l\u00e9ment parent global repr\u00e9sentant l&rsquo;ensemble des donn\u00e9es. Dans notre exemple il pourrait s&rsquo;agir d&rsquo;un \u00e9l\u00e9ment nomm\u00e9 \u00ab PAYS \u00bb.<\/p>\n<p>Cet \u00e9l\u00e9ment racine contiendra les \u00e9l\u00e9ments complexes qui eux-m\u00eames contiendront les \u00e9l\u00e9ments simples ce qui nous donne une arborescence \u00e0 3 niveaux  :<\/p>\n<p>L&rsquo;\u00e9l\u00e9ment racine, les types d&rsquo;entit\u00e9s (au sens SIG), les attributs (au sens SIG).<\/p>\n<figure id=\"attachment_477\" aria-describedby=\"caption-attachment-477\" style=\"width: 208px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/arborescence.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-477\" src=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/arborescence.png\" alt=\"\" width=\"208\" height=\"318\" srcset=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/arborescence.png 208w, https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/arborescence-196x300.png 196w\" sizes=\"auto, (max-width: 208px) 100vw, 208px\" \/><\/a><figcaption id=\"caption-attachment-477\" class=\"wp-caption-text\">Organisation g\u00e9n\u00e9rale du document \u00e0 produire<\/figcaption><\/figure>\n<p>La mod\u00e9lisation de nos donn\u00e9es exemple doit donc ressembler \u00e0 ceci :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:simpleType name=&quot;type_entier&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:integer&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:simpleType name=&quot;type_caracteres&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:string&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:simpleType name=&quot;type_flottant&quot;&gt;\r\n\t&lt;xs:restriction base=&quot;xs:float&quot;\/&gt;\r\n&lt;\/xs:simpleType&gt;\r\n&lt;xs:complexType name=&quot;type_region&quot;&gt;\r\n\t&lt;xs:sequence&gt;\r\n\t\t&lt;xs:element name=&quot;idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;nomREG&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t&lt;\/xs:sequence&gt;\r\n&lt;\/xs:complexType&gt;\r\n&lt;xs:complexType name=&quot;type_departement&quot;&gt;\r\n\t&lt;xs:sequence&gt;\r\n\t\t&lt;xs:element name=&quot;idDPT&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;nomDPT&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;surfDPT&quot; type=&quot;type_flottant&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;REGION_idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t&lt;\/xs:sequence&gt;\r\n&lt;\/xs:complexType&gt;\r\n&lt;xs:complexType name=&quot;type_pays&quot;&gt;\r\n\t&lt;xs:sequence&gt;\r\n\t\t&lt;xs:element name=&quot;REGION&quot; type=&quot;type_region&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;DEPARTEMENT&quot; type=&quot;type_departement&quot;\/&gt;\r\n\t&lt;\/xs:sequence&gt;\r\n&lt;\/xs:complexType&gt;\r\n&lt;xs:element name=&quot;PAYS&quot; type=&quot;type_pays&quot;\/&gt;<\/pre>\n<p>On d\u00e9finit d&rsquo;abord les types simples, puis les types complexes qui contiennent les \u00e9l\u00e9ments simples, puis un type complexe global contenant les autres types complexes et enfin un seul \u00e9l\u00e9ment faisant r\u00e9f\u00e9rence au type complexe global. Cet \u00e9l\u00e9ment sera l&rsquo;\u00e9l\u00e9ment racine du XSD.<\/p>\n<h2>4.4    Occurrence des \u00e9l\u00e9ments<\/h2>\n<p>Par d\u00e9finition, l&rsquo;\u00e9l\u00e9ment racine du XML\/GML doit \u00eatre unique (dans notre exemple il ne peut y avoir qu&rsquo;un seul \u00e9l\u00e9ment \u00ab PAYS \u00bb).<\/p>\n<p>Par contre nous aimerions pouvoir ins\u00e9rer plusieurs \u00ab REGION \u00bb et \u00ab DEPARTEMENT \u00bb dans notre XML\/GML. Or par d\u00e9faut lorsque l&rsquo;on d\u00e9finit un \u00e9l\u00e9ment dans le sch\u00e9ma XSD, celui-ci devra \u00eatre unique dans le XML\/GML.<\/p>\n<p>Pour d\u00e9finir le nombre d\u2019occurrences minimal et maximal d&rsquo;un \u00e9l\u00e9ment, il faut ajouter les propri\u00e9t\u00e9s \u00ab minOccurs \u00bb et \u00ab maxOccurs \u00bb dans le sch\u00e9ma XSD. Ce sont des attributs sp\u00e9cifiques dont la valeur doit \u00eatre un entier indiquant le nombre d\u2019occurrences ou le mot \u00ab unbounded \u00bb pour signifier \u00ab illimit\u00e9 \u00bb. Par d\u00e9faut, m\u00eame s&rsquo;ils n&rsquo;apparaissent pas dans le sch\u00e9ma, les attributs \u00ab minOccurs \u00bb et \u00ab maxOccurs \u00bb valent \u00ab 1 \u00bb ce qui explique que par d\u00e9faut un \u00e9l\u00e9ment ne doit appara\u00eetre qu&rsquo;une et une seule fois dans le XML\/GML.<\/p>\n<p>Par exemple, pour autoriser la pr\u00e9sence d&rsquo;au moins une r\u00e9gion et d&rsquo;au moins un d\u00e9partement mais d&rsquo;un nombre illimit\u00e9 en tout, il faudra modifier le type complexe de l&rsquo;\u00e9l\u00e9ment racine \u00ab PAYS \u00bb de cette fa\u00e7on :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:complexType name=&quot;type_pays&quot;&gt;\r\n\t&lt;xs:sequence&gt;\r\n\t\t&lt;xs:element name=&quot;REGION&quot; type=&quot;type_region&quot; minOccurs=&quot;1&quot; maxOccurs=&quot;unbounded&quot;\/&gt;\r\n\t\t&lt;xs:element name=&quot;DEPARTEMENT&quot; type=&quot;type_departement&quot; minOccurs=&quot;1&quot; maxOccurs=&quot;unbounded&quot;\/&gt;\r\n\t&lt;\/xs:sequence&gt;\r\n&lt;\/xs:complexType&gt;<\/pre>\n<p>Ainsi \u00ab PAYS \u00bb pourra contenir de 1 \u00e0 n \u00ab REGION \u00bb et de 1 \u00e0 n \u00ab DEPARTEMENT \u00bb.<\/p>\n<h2>4.5    Mod\u00e9lisation des cl\u00e9s primaires<\/h2>\n<p>En XML\/GML il est possible de d\u00e9finir qu&rsquo;un \u00e9l\u00e9ment est une cl\u00e9 primaire c&rsquo;est \u00e0 dire que sa valeur doit \u00eatre unique. La syntaxe est la suivante :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;key name=&quot;nom de la cl\u00e9&quot;&gt;\r\n\t&lt;selector xpath=&quot;chemin vers l'\u00e9l\u00e9ment contenant la cl\u00e9&quot;\/&gt;\r\n\t&lt;field xpath=&quot;nom du sous-\u00e9l\u00e9ment faisant office de cl\u00e9&quot;\/&gt;\r\n&lt;\/key&gt;<\/pre>\n<p>La v\u00e9rification de la cl\u00e9 primaire d\u00e9pendra de l&#8217;emplacement de la d\u00e9finition. Par exemple si l&rsquo;on veut que l&rsquo;identifiant des r\u00e9gions et des d\u00e9partements soient uniques dans tout l&rsquo;\u00e9l\u00e9ment racine \u00ab PAYS \u00bb, la d\u00e9finition des cl\u00e9s primaires doit se faire dans l&rsquo;\u00e9l\u00e9ment racine \u00ab PAYS \u00bb ce qui donne :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:element name=&quot;PAYS&quot; type=&quot;type_pays&quot;&gt;\r\n\t&lt;xs:key name=&quot;PK_REGION&quot;&gt;\r\n\t\t&lt;xs:selector xpath=&quot;REGION&quot;\/&gt;\r\n\t\t&lt;xs:field xpath=&quot;idREG&quot;\/&gt;\r\n\t&lt;\/xs:key&gt;\r\n\t&lt;xs:key name=&quot;PK_DEPARTEMENT&quot;&gt;\r\n\t\t&lt;xs:selector xpath=&quot;DEPARTEMENT&quot;\/&gt;\r\n\t\t&lt;xs:field xpath=&quot;idDPT&quot;\/&gt;\r\n\t&lt;\/xs:key&gt;\r\n&lt;\/xs:element&gt;<\/pre>\n<p>Ainsi chaque idREG devra \u00eatre unique de m\u00eame que chaque idDPT. Ces cl\u00e9s sont ind\u00e9pendantes c&rsquo;est \u00e0 dire qu&rsquo;un idREG pourra avoir la m\u00eame valeur qu&rsquo;un idDPT.<\/p>\n<p>Attention la d\u00e9finition d&rsquo;une cl\u00e9 primaire de cette fa\u00e7on n&rsquo;interdit pas que la valeur de l&rsquo;\u00e9l\u00e9ment soit nulle, seulement qu&rsquo;elle soit unique. Pour emp\u00eacher les valeurs nulles, il faut par exemple que le type de l&rsquo;\u00e9l\u00e9ment soit d\u00e9fini \u00e0 \u00ab integer \u00bb.<\/p>\n<h2>4.6    Mod\u00e9lisation des cl\u00e9s \u00e9trang\u00e8res<\/h2>\n<p>Pour d\u00e9finir une cl\u00e9 \u00e9trang\u00e8re en XML\/GML il faut lier un \u00e9l\u00e9ment \u00e0 un \u00e9l\u00e9ment d\u00e9j\u00e0 d\u00e9fini comme \u00e9tant une cl\u00e9 primaire. La syntaxe est la suivante :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;keyref name=&quot;nom de la cl\u00e9 \u00e9trang\u00e8re&quot; refer=&quot;nom de la cl\u00e9 primaire r\u00e9f\u00e9renc\u00e9e&quot;&gt;\r\n\t&lt;selector xpath=&quot;chemin vers l'\u00e9l\u00e9ment contenant la cl\u00e9 \u00e9trang\u00e8re&quot;\/&gt;\r\n\t&lt;field xpath=&quot;nom du sous-\u00e9l\u00e9ment faisant office de cl\u00e9 \u00e9trang\u00e8re&quot;\/&gt;\r\n&lt;\/keyref&gt;<\/pre>\n<p>Ainsi pour indiquer que l&rsquo;\u00e9l\u00e9ment \u00ab REGION_idREG \u00bb est une r\u00e9f\u00e9rence \u00e0 la cl\u00e9 primaire \u00ab  PK_REGION \u00bb d\u00e9finie pr\u00e9c\u00e9demment, nous \u00e9crirons dans le XSD, au niveau de l&rsquo;\u00e9l\u00e9ment \u00ab PAYS \u00bb :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:keyref name=&quot;FK_REGION_DEPARTEMENT&quot; refer=&quot;PK_REGION&quot;&gt;\r\n\t&lt;xs:selector xpath=&quot;DEPARTEMENT&quot;\/&gt;\r\n\t&lt;xs:field xpath=&quot;REGION_idREG&quot;\/&gt;\r\n&lt;\/xs:keyref&gt;<\/pre>\n<p>Chaque REGION_idREG des d\u00e9partements devra avoir pour valeur celle d&rsquo;un idREG existant dans une r\u00e9gion.<\/p>\n<p>Le sch\u00e9ma complet ressemble maintenant \u00e0 ceci :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;xs:schema xmlns:xs=&quot;http:\/\/www.w3.org\/2001\/XMLSchema&quot; elementFormDefault=&quot;qualified&quot; attributeFormDefault=&quot;qualified&quot;&gt;\r\n\t&lt;xs:simpleType name=&quot;type_entier&quot;&gt;\r\n\t\t&lt;xs:restriction base=&quot;xs:integer&quot;\/&gt;\r\n\t&lt;\/xs:simpleType&gt;\r\n\t&lt;xs:simpleType name=&quot;type_caracteres&quot;&gt;\r\n\t\t&lt;xs:restriction base=&quot;xs:string&quot;\/&gt;\r\n\t&lt;\/xs:simpleType&gt;\r\n\t&lt;xs:simpleType name=&quot;type_flottant&quot;&gt;\r\n\t\t&lt;xs:restriction base=&quot;xs:float&quot;\/&gt;\r\n\t&lt;\/xs:simpleType&gt;\r\n\t&lt;xs:complexType name=&quot;type_region&quot;&gt;\r\n\t\t&lt;xs:sequence&gt;\r\n\t\t\t&lt;xs:element name=&quot;idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t&lt;xs:element name=&quot;nomREG&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t&lt;\/xs:sequence&gt;\r\n\t&lt;\/xs:complexType&gt;\r\n\t&lt;xs:complexType name=&quot;type_departement&quot;&gt;\r\n\t\t&lt;xs:sequence&gt;\r\n\t\t\t&lt;xs:element name=&quot;idDPT&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t&lt;xs:element name=&quot;nomDPT&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t\t&lt;xs:element name=&quot;surfDPT&quot; type=&quot;type_flottant&quot;\/&gt;\r\n\t\t\t&lt;xs:element name=&quot;REGION_idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t&lt;\/xs:sequence&gt;\r\n\t&lt;\/xs:complexType&gt;\r\n\t&lt;xs:complexType name=&quot;type_pays&quot;&gt;\r\n\t\t&lt;xs:sequence&gt;\r\n\t\t\t&lt;xs:element name=&quot;REGION&quot; type=&quot;type_region&quot; minOccurs=&quot;1&quot; maxOccurs=&quot;unbounded&quot;\/&gt;\r\n\t\t\t&lt;xs:element name=&quot;DEPARTEMENT&quot; type=&quot;type_departement&quot; minOccurs=&quot;1&quot; maxOccurs=&quot;unbounded&quot;\/&gt;\r\n\t\t&lt;\/xs:sequence&gt;\r\n\t&lt;\/xs:complexType&gt;\r\n\t&lt;xs:element name=&quot;PAYS&quot; type=&quot;type_pays&quot;&gt;\r\n\t\t&lt;xs:key name=&quot;PK_REGION&quot;&gt;\r\n\t\t\t&lt;xs:selector xpath=&quot;REGION&quot;\/&gt;\r\n\t\t\t&lt;xs:field xpath=&quot;idREG&quot;\/&gt;\r\n\t\t&lt;\/xs:key&gt;\r\n\t\t&lt;xs:key name=&quot;PK_DEPARTEMENT&quot;&gt;\r\n\t\t\t&lt;xs:selector xpath=&quot;DEPARTEMENT&quot;\/&gt;\r\n\t\t\t&lt;xs:field xpath=&quot;idDPT&quot;\/&gt;\r\n\t\t&lt;\/xs:key&gt;\r\n\t\t&lt;xs:keyref name=&quot;FK_REGION_DEPARTEMENT&quot; refer=&quot;PK_REGION&quot;&gt;\r\n\t\t\t&lt;xs:selector xpath=&quot;DEPARTEMENT&quot;\/&gt;\r\n\t\t\t&lt;xs:field xpath=&quot;REGION_idREG&quot;\/&gt;\r\n\t\t&lt;\/xs:keyref&gt;\r\n\t&lt;\/xs:element&gt;\r\n&lt;\/xs:schema&gt;<\/pre>\n<h2>4.7    Mod\u00e9lisation du XSD final compatible GML<\/h2>\n<p>Pour l&rsquo;instant notre sch\u00e9ma permet de d\u00e9crire la structure de donn\u00e9es en XML mais nous voulons produire du GML pour b\u00e9n\u00e9ficier de ses caract\u00e9ristiques telles que le support de la g\u00e9om\u00e9trie. Plusieurs op\u00e9rations restent \u00e0 effectuer pour d\u00e9finir un v\u00e9ritable sch\u00e9ma d&rsquo;application GML.<\/p>\n<ul>\n<li>Tout d&rsquo;abord il faut inclure l&rsquo;espace de noms du GML dans l&rsquo;ent\u00eate, par exemple :<\/li>\n<\/ul>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">xmlns:gml=&quot;http:\/\/www.opengis.net\/gml\/3.2&quot;<\/pre>\n<ul>\n<li>Il faut ensuite d\u00e9finir l&rsquo;espace de nommage de notre format que nous appelerons BIG<\/li>\n<\/ul>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">xmlns:big=&quot;http:\/\/www.veremes.com\/big&quot; targetNamespace=&quot;http:\/\/www.veremes.com\/big&quot;<\/pre>\n<p>On pourra ainsi appeler dans le XSD des \u00e9l\u00e9ments appartenant aux sch\u00e9mas officiels du GML en les pr\u00e9fixant par \u00ab gml: \u00bb.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Mais pour appeler des \u00e9l\u00e9ments depuis les sch\u00e9mas GML, il faut \u00e9galement importer ces sch\u00e9mas dans notre propre sch\u00e9ma. Cela se fait \u00e0 l&rsquo;aide de la commande \u00ab import \u00bb :<\/li>\n<\/ul>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:import namespace=&quot;http:\/\/www.opengis.net\/gml\/3.2&quot; schemaLocation=&quot;http:\/\/schemas.opengis.net\/gml\/3.2.1\/gml.xsd&quot;\/&gt;<\/pre>\n<p>L&rsquo;ent\u00eate de notre sch\u00e9ma ressemblera donc \u00e0 ceci :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;xs:schema xmlns:xs=&quot;http:\/\/www.w3.org\/2001\/XMLSchema&quot; xmlns:gml=&quot;http:\/\/www.opengis.net\/gml\/3.2&quot; xmlns:big=&quot;http:\/\/www.veremes.com\/big&quot; targetNamespace=&quot;http:\/\/www.veremes.com\/big&quot; elementFormDefault=&quot;qualified&quot;&gt;\r\n\t&lt;xs:import namespace=&quot;http:\/\/www.opengis.net\/gml\/3.2&quot; schemaLocation=&quot;http:\/\/schemas.opengis.net\/gml\/3.2.1\/gml.xsd&quot;\/&gt;<\/pre>\n<ul>\n<li>Pour que nos \u00e9l\u00e9ments \u00ab REGION \u00bb et \u00ab DEPARTEMENT \u00bb soient reconnus par le GML et puissent contenir des coordonn\u00e9es g\u00e9ographiques, il faut \u00e9galement faire d\u00e9river leur type par h\u00e9ritage du type GML pr\u00e9d\u00e9fini : \u00ab AbstractFeatureType \u00bb. En fait on indique que les types de \u00ab REGION \u00bb et \u00ab DEPARTEMENT \u00bb sont une extension (car on rajoute des sous-\u00e9l\u00e9ments sp\u00e9cifiques) du type \u00ab  AbstractFeatureType \u00bb. Cela se fait avec le mot-cl\u00e9 \u00ab extension \u00bb :<\/li>\n<\/ul>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:complexType name=&quot;type_region&quot;&gt;\r\n\t&lt;xs:complexContent&gt;\r\n\t\t&lt;xs:extension base=&quot;gml:AbstractFeatureType&quot;&gt;\r\n\t\t\t&lt;xs:sequence&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;nomREG&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t\t&lt;\/xs:sequence&gt;\r\n\t\t&lt;\/xs:extension&gt;\r\n\t&lt;\/xs:complexContent&gt;\r\n&lt;\/xs:complexType&gt;\r\n&lt;xs:complexType name=&quot;type_departement&quot;&gt;\r\n\t&lt;xs:complexContent&gt;\r\n\t\t&lt;xs:extension base=&quot;gml:AbstractFeatureType&quot;&gt;\r\n\t\t\t&lt;xs:sequence&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;idDPT&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;nomDPT&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;surfDPT&quot; type=&quot;type_flottant&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;REGION_idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t&lt;\/xs:sequence&gt;\r\n\t\t&lt;\/xs:extension&gt;\r\n\t&lt;\/xs:complexContent&gt;\r\n&lt;\/xs:complexType&gt;<\/pre>\n<p>Il faut ensuite ajouter dans la s\u00e9quence un \u00e9l\u00e9ment qui permettra de d\u00e9crire la g\u00e9om\u00e9trie de chaque objet. Pour d\u00e9crire des polygones on ajoutera (on peut bien s\u00fbr d\u00e9crire \u00e9galement des points, des lignes, etc.) :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:element ref=&quot;gml:surfaceProperty&quot;\/&gt;<\/pre>\n<p>Ce qui donne :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:complexType name=&quot;type_region&quot;&gt;\r\n\t&lt;xs:complexContent&gt;\r\n\t\t&lt;xs:extension base=&quot;gml:AbstractFeatureType&quot;&gt;\r\n\t\t\t&lt;xs:sequence&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;nomREG&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element ref=&quot;gml:surfaceProperty&quot;\/&gt;\r\n\t\t\t&lt;\/xs:sequence&gt;\r\n\t\t&lt;\/xs:extension&gt;\r\n\t&lt;\/xs:complexContent&gt;\r\n&lt;\/xs:complexType&gt;\r\n&lt;xs:complexType name=&quot;type_departement&quot;&gt;\r\n\t&lt;xs:complexContent&gt;\r\n\t\t&lt;xs:extension base=&quot;gml:AbstractFeatureType&quot;&gt;\r\n\t\t\t&lt;xs:sequence&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;idDPT&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;nomDPT&quot; type=&quot;type_caracteres&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;surfDPT&quot; type=&quot;type_flottant&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element name=&quot;REGION_idREG&quot; type=&quot;type_entier&quot;\/&gt;\r\n\t\t\t\t&lt;xs:element ref=&quot;gml:surfaceProperty&quot;\/&gt;\r\n\t\t\t&lt;\/xs:sequence&gt;\r\n\t\t&lt;\/xs:extension&gt;\r\n\t&lt;\/xs:complexContent&gt;\r\n&lt;\/xs:complexType&gt;<\/pre>\n<p>Les types \u00ab type_region \u00bb et \u00ab type_departement \u00bb sont maintenant une extension du type GML \u00ab AbstractFeatureType \u00bb et permettent le stockage de la g\u00e9om\u00e9trie de chaque objet en type \u00ab surface \u00bb.<\/p>\n<p>Note : dans GML 3.2 le type \u00ab  AbstractFeatureType \u00bb impose que chaque objet soit identifi\u00e9 par un attribut \u00ab id \u00bb.<\/p>\n<ul>\n<li>Normalement les objets du GML sont des \u00ab AbstractFeature \u00bb. Pour que nos \u00e9l\u00e9ments \u00ab REGION \u00bb et \u00ab DEPARTEMENT \u00bb soient consid\u00e9r\u00e9s ainsi, il faut rajouter dans le XSD les 2 lignes suivantes :<\/li>\n<\/ul>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:element name=&quot;REGION&quot; type=&quot;big:type_region&quot; substitutionGroup=&quot;gml:AbstractFeature&quot;\/&gt;\r\n&lt;xs:element name=&quot;DEPARTEMENT&quot; type=&quot;big:type_departement&quot; substitutionGroup=&quot;gml:AbstractFeature&quot;\/&gt;<\/pre>\n<ul>\n<li> L&rsquo;\u00e9l\u00e9ment racine du GML doit \u00eatre \u00ab FeatureCollection \u00bb. Si l&rsquo;on souhaite qu&rsquo;il s&rsquo;appelle \u00ab PAYS \u00bb, il faudra \u00e9galement faire une substitution :<\/li>\n<\/ul>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;xs:element name=&quot;PAYS&quot; substitutionGroup=&quot;gml:FeatureCollection&quot;\/&gt;<\/pre>\n<h2>4.8    Sch\u00e9ma d&rsquo;application XSD final<\/h2>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;xs:schema xmlns:xs=&quot;http:\/\/www.w3.org\/2001\/XMLSchema&quot; xmlns:gml=&quot;http:\/\/www.opengis.net\/gml\/3.2&quot; xmlns:big=&quot;http:\/\/www.veremes.com\/big&quot; targetNamespace=&quot;http:\/\/www.veremes.com\/big&quot; elementFormDefault=&quot;qualified&quot;&gt;\r\n\t&lt;xs:import namespace=&quot;http:\/\/www.opengis.net\/gml\/3.2&quot; schemaLocation=&quot;http:\/\/schemas.opengis.net\/gml\/3.2.1\/gml.xsd&quot;\/&gt;\r\n\t&lt;xs:simpleType name=&quot;type_entier&quot;&gt;\r\n\t\t&lt;xs:restriction base=&quot;xs:integer&quot;\/&gt;\r\n\t&lt;\/xs:simpleType&gt;\r\n\t&lt;xs:simpleType name=&quot;type_caracteres&quot;&gt;\r\n\t\t&lt;xs:restriction base=&quot;xs:string&quot;\/&gt;\r\n\t&lt;\/xs:simpleType&gt;\r\n\t&lt;xs:simpleType name=&quot;type_flottant&quot;&gt;\r\n\t\t&lt;xs:restriction base=&quot;xs:float&quot;\/&gt;\r\n\t&lt;\/xs:simpleType&gt;\r\n\t&lt;xs:complexType name=&quot;type_region&quot;&gt;\r\n\t\t&lt;xs:complexContent&gt;\r\n\t\t\t&lt;xs:extension base=&quot;gml:AbstractFeatureType&quot;&gt;\r\n\t\t\t\t&lt;xs:sequence&gt;\r\n\t\t\t\t\t&lt;xs:element name=&quot;idREG&quot; type=&quot;big:type_entier&quot;\/&gt;\r\n\t\t\t\t\t&lt;xs:element name=&quot;nomREG&quot; type=&quot;big:type_caracteres&quot;\/&gt;\r\n\t\t\t\t\t&lt;xs:element ref=&quot;gml:surfaceProperty&quot;\/&gt;\r\n\t\t\t\t&lt;\/xs:sequence&gt;\r\n\t\t\t&lt;\/xs:extension&gt;\r\n\t\t&lt;\/xs:complexContent&gt;\r\n\t&lt;\/xs:complexType&gt;\r\n\t&lt;xs:complexType name=&quot;type_departement&quot;&gt;\r\n\t\t&lt;xs:complexContent&gt;\r\n\t\t\t&lt;xs:extension base=&quot;gml:AbstractFeatureType&quot;&gt;\r\n\t\t\t\t&lt;xs:sequence&gt;\r\n\t\t\t\t\t&lt;xs:element name=&quot;idDPT&quot; type=&quot;big:type_entier&quot;\/&gt;\r\n\t\t\t\t\t&lt;xs:element name=&quot;nomDPT&quot; type=&quot;big:type_caracteres&quot;\/&gt;\r\n\t\t\t\t\t&lt;xs:element name=&quot;surfDPT&quot; type=&quot;big:type_flottant&quot;\/&gt;\r\n\t\t\t\t\t&lt;xs:element name=&quot;REGION_idREG&quot; type=&quot;big:type_entier&quot;\/&gt;\r\n\t\t\t\t\t&lt;xs:element ref=&quot;gml:surfaceProperty&quot;\/&gt;\r\n\t\t\t\t&lt;\/xs:sequence&gt;\r\n\t\t\t&lt;\/xs:extension&gt;\r\n\t\t&lt;\/xs:complexContent&gt;\r\n\t&lt;\/xs:complexType&gt;\r\n\t&lt;xs:element name=&quot;REGION&quot; type=&quot;big:type_region&quot; substitutionGroup=&quot;gml:AbstractFeature&quot;\/&gt;\r\n\t&lt;xs:element name=&quot;DEPARTEMENT&quot; type=&quot;big:type_departement&quot; substitutionGroup=&quot;gml:AbstractFeature&quot;\/&gt;\r\n\t&lt;xs:element name=&quot;PAYS&quot; substitutionGroup=&quot;gml:FeatureCollection&quot;&gt;\r\n\t\t&lt;xs:key name=&quot;PK_REGION&quot;&gt;\r\n\t\t\t&lt;xs:selector xpath=&quot;gml:featureMember\/big:REGION&quot;\/&gt;\r\n\t\t\t&lt;xs:field xpath=&quot;big:idREG&quot;\/&gt;\r\n\t\t&lt;\/xs:key&gt;\r\n\t\t&lt;xs:key name=&quot;PK_DEPARTEMENT&quot;&gt;\r\n\t\t\t&lt;xs:selector xpath=&quot;gml:featureMember\/big:DEPARTEMENT&quot;\/&gt;\r\n\t\t\t&lt;xs:field xpath=&quot;big:idDPT&quot;\/&gt;\r\n\t\t&lt;\/xs:key&gt;\r\n\t\t&lt;xs:keyref name=&quot;FK_REGION_DEPARTEMENT&quot; refer=&quot;big:PK_REGION&quot;&gt;\r\n\t\t\t&lt;xs:selector xpath=&quot;gml:featureMember\/big:DEPARTEMENT&quot;\/&gt;\r\n\t\t\t&lt;xs:field xpath=&quot;big:REGION_idREG&quot;\/&gt;\r\n\t\t&lt;\/xs:keyref&gt;\r\n\t&lt;\/xs:element&gt;\r\n&lt;\/xs:schema&gt;<\/pre>\n<h2>4.9    Document GML final<\/h2>\n<p>Voici un exemple de ce que donnerait le document GML final, avec 2 r\u00e9gions et 1 d\u00e9partement et les espaces de noms correctement renseign\u00e9s :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;big:PAYS xmlns:gml=&quot;http:\/\/www.opengis.net\/gml\/3.2&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot; xmlns:big=&quot;http:\/\/www.veremes.com\/big&quot; xsi:schemaLocation=&quot;http:\/\/www.veremes.com\/big pays.xsd&quot; gml:id=&quot;collection&quot;&gt;\r\n\t&lt;gml:featureMember&gt;\r\n\t\t&lt;big:REGION gml:id=&quot;R_1&quot;&gt;\r\n\t\t\t&lt;big:idREG&gt;1&lt;\/big:idREG&gt;\r\n\t\t\t&lt;big:nomREG&gt;Languedoc-Roussillon&lt;\/big:nomREG&gt;\r\n\t\t\t&lt;gml:surfaceProperty&gt;\r\n\t\t\t\t&lt;gml:Polygon gml:id=&quot;P_1&quot;&gt;\r\n\t\t\t\t\t&lt;gml:exterior&gt;\r\n\t\t\t\t\t\t&lt;gml:LinearRing&gt;\r\n\t\t\t\t\t\t\t&lt;gml:posList srsDimension=&quot;2&quot;&gt;0 0 100 0 100 100 0 100 0 0&lt;\/gml:posList&gt;\r\n\t\t\t\t\t\t&lt;\/gml:LinearRing&gt;\r\n\t\t\t\t\t&lt;\/gml:exterior&gt;\r\n\t\t\t\t&lt;\/gml:Polygon&gt;\r\n\t\t\t&lt;\/gml:surfaceProperty&gt;\r\n\t\t&lt;\/big:REGION&gt;\r\n\t&lt;\/gml:featureMember&gt;\r\n\t&lt;gml:featureMember&gt;\r\n\t\t&lt;big:REGION gml:id=&quot;R_2&quot;&gt;\r\n\t\t\t&lt;big:idREG&gt;2&lt;\/big:idREG&gt;\r\n\t\t\t&lt;big:nomREG&gt;PACA&lt;\/big:nomREG&gt;\r\n\t\t\t&lt;gml:surfaceProperty&gt;\r\n\t\t\t\t&lt;gml:Polygon gml:id=&quot;P_2&quot;&gt;\r\n\t\t\t\t\t&lt;gml:exterior&gt;\r\n\t\t\t\t\t\t&lt;gml:LinearRing&gt;\r\n\t\t\t\t\t\t\t&lt;gml:posList srsDimension=&quot;2&quot;&gt;100 0 200 0 200 100 100 100 100 0&lt;\/gml:posList&gt;\r\n\t\t\t\t\t\t&lt;\/gml:LinearRing&gt;\r\n\t\t\t\t\t&lt;\/gml:exterior&gt;\r\n\t\t\t\t&lt;\/gml:Polygon&gt;\r\n\t\t\t&lt;\/gml:surfaceProperty&gt;\r\n\t\t&lt;\/big:REGION&gt;\r\n\t&lt;\/gml:featureMember&gt;\r\n\t&lt;gml:featureMember&gt;\r\n\t\t&lt;big:DEPARTEMENT gml:id=&quot;D_1&quot;&gt;\r\n\t\t\t&lt;big:idDPT&gt;34&lt;\/big:idDPT&gt;\r\n\t\t\t&lt;big:nomDPT&gt;H\u00e9rault&lt;\/big:nomDPT&gt;\r\n\t\t\t&lt;big:surfDPT&gt;999999&lt;\/big:surfDPT&gt;\r\n\t\t\t&lt;big:REGION_idREG&gt;1&lt;\/big:REGION_idREG&gt;\r\n\t\t\t&lt;gml:surfaceProperty&gt;\r\n\t\t\t\t&lt;gml:Polygon gml:id=&quot;P_3&quot;&gt;\r\n\t\t\t\t\t&lt;gml:exterior&gt;\r\n\t\t\t\t\t\t&lt;gml:LinearRing&gt;\r\n\t\t\t\t\t\t\t&lt;gml:posList srsDimension=&quot;2&quot;&gt;10 10 90 10 90 90 10 90 10 10&lt;\/gml:posList&gt;\r\n\t\t\t\t\t\t&lt;\/gml:LinearRing&gt;\r\n\t\t\t\t\t&lt;\/gml:exterior&gt;\r\n\t\t\t\t&lt;\/gml:Polygon&gt;\r\n\t\t\t&lt;\/gml:surfaceProperty&gt;\r\n\t\t&lt;\/big:DEPARTEMENT&gt;\r\n\t&lt;\/gml:featureMember&gt;\r\n&lt;\/big:PAYS&gt;<\/pre>\n<p>Les coordonn\u00e9es sont tr\u00e8s simplistes et nous n&rsquo;avons pas sp\u00e9cifi\u00e9 de syst\u00e8me de coordonn\u00e9es mais ce document GML accompagn\u00e9 de son sch\u00e9ma d&rsquo;application XSD se lit correctement dans le logiciel <a href=\"http:\/\/www.veremes.com\/produits\/fme-desktop\" target=\"_blank\">FME Viewer<\/a> :<\/p>\n<figure id=\"attachment_478\" aria-describedby=\"caption-attachment-478\" style=\"width: 513px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/fme_viewer.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-478 \" src=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/fme_viewer.png\" alt=\"\" width=\"513\" height=\"237\" srcset=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/fme_viewer.png 1026w, https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/fme_viewer-300x138.png 300w, https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/fme_viewer-1024x473.png 1024w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/><\/a><figcaption id=\"caption-attachment-478\" class=\"wp-caption-text\">Affichage de la g\u00e9om\u00e9trie et des attributs du document GML dans FME Viewer<\/figcaption><\/figure>\n<div>\n<h1>5.   Restrictions pr\u00e9d\u00e9finies dans les XSD<\/h1>\n<\/div>\n<p>Dans notre exemple du chapitre 4, nous avons vu les restrictions \u00ab string \u00bb, \u00ab integer \u00bb et \u00ab float \u00bb sur le \u00ab typage \u00bb des \u00e9l\u00e9ments. De nombreuses autres restrictions sont disponibles et sch\u00e9matis\u00e9es dans ce diagramme :<\/p>\n<figure id=\"attachment_480\" aria-describedby=\"caption-attachment-480\" style=\"width: 546px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/types_xml.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-480 \" src=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/types_xml.png\" alt=\"\" width=\"546\" height=\"624\" srcset=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/types_xml.png 819w, https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/types_xml-262x300.png 262w\" sizes=\"auto, (max-width: 546px) 100vw, 546px\" \/><\/a><figcaption id=\"caption-attachment-480\" class=\"wp-caption-text\">Types XML (source : http:\/\/www.w3.org\/TR\/xmlschema-2\/#built-in-datatypes)<\/figcaption><\/figure>\n<p>Il y a deux grands types de restrictions, les restrictions primitives (en bleu) qui sont des restrictions de base pr\u00e9d\u00e9finies dans les sch\u00e9mas XSD et les restrictions d\u00e9riv\u00e9es (en vert) qui sont des restrictions dont la d\u00e9finition est bas\u00e9e sur une restriction primitive.<\/p>\n<p>Le but de cet article n&rsquo;\u00e9tant pas d&rsquo;\u00eatre exhaustif, nous n&rsquo;allons pas d\u00e9tailler toutes ces restrictions.<\/p>\n<p>Citons cependant la restriction \u00ab date \u00bb qui d\u00e9finit une date du calendrier gr\u00e9gorien. La date doit \u00eatre sous la forme YYYY-MM-DDZ, Z \u00e9tant le fuseau horaire (optionnel). Par exemple : 2011-12-16+02:00<\/p>\n<p>La restriction \u00ab float \u00bb est un nombre flottant \u00e0 simple pr\u00e9cision de 32 bits. Par exemple : 3.14E12<\/p>\n<p>La restriction \u00ab double \u00bb est un nombre flottant \u00e0 double pr\u00e9cision de 64 bits. Par exemple : 3.14E40<\/p>\n<p>Pour des informations compl\u00e8tes sur l&rsquo;ensemble de ces restrictions, vous pouvez consulter (en anglais) la page : <a href=\"http:\/\/www.w3.org\/TR\/xmlschema-2\/#built-in-datatypes\" target=\"_blank\">http:\/\/www.w3.org\/TR\/xmlschema-2\/#built-in-datatypes<\/a><\/p>\n<div>\n<h1>6.   Cr\u00e9ation de restrictions personnalis\u00e9es<\/h1>\n<\/div>\n<p>Nous avons vu qu&rsquo;il est possible de restreindre le contenu d&rsquo;un \u00e9l\u00e9ment (sa valeur) \u00e0 des types pr\u00e9d\u00e9finis dans le XSD (entier, flottant, \u2026).<\/p>\n<p>Il est possible de cr\u00e9er ses propres types \u00e0 l&rsquo;aide d&rsquo;un certain nombre de contraintes reconnues par le XSD.<\/p>\n<p>On peut par exemple indiquer les valeurs minimales et maximales autoris\u00e9es d&rsquo;un nombre, indiquer la longueur maximale d&rsquo;une cha\u00eene de caract\u00e8res ou encore n&rsquo;autoriser qu&rsquo;une liste fixe de valeurs.<\/p>\n<p>Cela se passe \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;\u00e9l\u00e9ment \u00ab restriction \u00bb du XSD.<\/p>\n<p>Par exemple, pour d\u00e9finir un \u00e9l\u00e9ment ne pouvant contenir qu&rsquo;une date comprise entre 1910 et 2012, la syntaxe du XSD serait la suivante :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;simpleType name=&quot;type_annee&quot;&gt;\r\n\t&lt;restriction base=&quot;gYear&quot;&gt;\r\n\t\t&lt;minInclusive value=&quot;1910&quot;\/&gt;\r\n\t\t&lt;maxInclusive value=&quot;2012&quot;\/&gt;\r\n\t&lt;\/restriction&gt;\r\n&lt;\/simpleType&gt;\r\n&lt;element name=&quot;ANNEE&quot; type=&quot;type_annee&quot;\/&gt;<\/pre>\n<p>minInclusive indique une borne inf\u00e9rieure incluse et maxInclusive une borne sup\u00e9rieure incluse.<\/p>\n<p>Il existe \u00e9galement (non exhaustif) :<\/p>\n<ul>\n<li>minExclusive et maxExclusive (bornes non incluses)<\/li>\n<li>enumeration pour d\u00e9finir une liste de valeurs possibles (domaine de valeurs)<\/li>\n<li>length pour sp\u00e9cifier le nombre exact de caract\u00e8res<\/li>\n<li>maxLength pour sp\u00e9cifier le nombre maximal de caract\u00e8res<\/li>\n<li>minLength pour sp\u00e9cifier le nombre minimal de caract\u00e8res<\/li>\n<li>pattern pour d\u00e9finir une expression r\u00e9guli\u00e8re<\/li>\n<li>fractionDigits pour sp\u00e9cifier le nombre maximal de d\u00e9cimales<\/li>\n<li>totalDigits pour sp\u00e9cifier le nombre exact de d\u00e9cimales<\/li>\n<\/ul>\n<p>Ces contraintes ne sont pas valables pour tous les types, par exemple \u00ab fractionDigits \u00bb ne pourra s&rsquo;utiliser que pour des restrictions de type nombres flottants ou doubles.<\/p>\n<div>\n<h1>7.   Mod\u00e9lisation de la structure de donn\u00e9es<\/h1>\n<\/div>\n<p>La conception d&rsquo;un format GML n&rsquo;est pas qu&rsquo;une affaire de syntaxe XML. Il faut avant tout savoir ce que l&rsquo;on souhaite repr\u00e9senter et connaitre les enjeux qui se cachent derri\u00e8re cette repr\u00e9sentation.<\/p>\n<p>Si nous reprenons l&rsquo;exemple des r\u00e9gions et d\u00e9partements nous pouvons avoir deux types de mod\u00e9lisation : objet et relationnelle.<\/p>\n<h2>7.1    Mod\u00e9lisation objet<\/h2>\n<p>La vision objet, tr\u00e8s puissante va nous permettre de repr\u00e9senter une r\u00e9gion comme une agr\u00e9gation de d\u00e9partements.<\/p>\n<p>En UML, cela se traduit par la repr\u00e9sentation ci-dessous.<\/p>\n<figure id=\"attachment_491\" aria-describedby=\"caption-attachment-491\" style=\"width: 240px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_agregation.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-491\" src=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_agregation.png\" alt=\"\" width=\"240\" height=\"305\" srcset=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_agregation.png 240w, https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_agregation-236x300.png 236w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/a><figcaption id=\"caption-attachment-491\" class=\"wp-caption-text\">Repr\u00e9sentation des r\u00e9gions comme un agr\u00e9gat de d\u00e9partements<\/figcaption><\/figure>\n<p>En XML, nous pourrions avoir l&rsquo;exemple suivant :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;REGION&gt;\r\n\t&lt;NOM&gt;LANGUEDOC-ROUSILLON&lt;\/NOM&gt;\r\n\t&lt;DEPARTEMENTS&gt;\r\n\t\t&lt;DEPARTEMENT&gt;&lt;NOM&gt;H\u00e9rault&lt;\/NOM&gt;&lt;\/DEPARTEMENT&gt;\r\n\t\t&lt;DEPARTEMENT&gt;&lt;NOM&gt;Pyr\u00e9n\u00e9es-Orientales&lt;\/NOM&gt;&lt;\/DEPARTEMENT&gt;\r\n\t&lt;\/DEPARTEMENTS&gt;\r\n&lt;\/REGION&gt;<\/pre>\n<p>Avantage : la relation de composition est explicite, il ne peut y avoir de d\u00e9partement sans r\u00e9gion.<\/p>\n<p>La mod\u00e9lisation objet permet d&rsquo;exploiter de nombreuses notions permettant une repr\u00e9sentation fine d&rsquo;un syst\u00e8me : classe,  agr\u00e9gation, composition, h\u00e9ritage, relation, propri\u00e9t\u00e9s, m\u00e9thodes&#8230;<\/p>\n<h2>7.2    Mod\u00e9lisation relationnelle<\/h2>\n<p>La vision relationnelle est beaucoup plus pauvre, elle ne permet de manipuler que trois notions : types d&rsquo;entit\u00e9s, relations et attributs.<\/p>\n<p>Dans ce mod\u00e8le, les r\u00e9gions et d\u00e9partements sont des types d&rsquo;entit\u00e9s reli\u00e9s par une relation d&rsquo;association.<\/p>\n<p>En UML, cela se traduit par la repr\u00e9sentation ci-dessous.<\/p>\n<figure id=\"attachment_483\" aria-describedby=\"caption-attachment-483\" style=\"width: 313px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_association.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-483\" src=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_association.png\" alt=\"\" width=\"313\" height=\"149\" srcset=\"https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_association.png 313w, https:\/\/blog.georezo.net\/geointerop\/files\/2012\/01\/uml_association-300x142.png 300w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/a><figcaption id=\"caption-attachment-483\" class=\"wp-caption-text\">Repr\u00e9sentation des r\u00e9gions et des d\u00e9partements comme des types d&#039;entit\u00e9s ind\u00e9pendants unis par un lien d&#039;association<\/figcaption><\/figure>\n<p>En XML, nous pourrions avoir l&rsquo;exemple suivant :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">&lt;REGIONS&gt;\r\n\t&lt;REGION&gt;&lt;NOM&gt;LANGUEDOC-ROUSILLON&lt;\/NOM&gt;&lt;\/REGION&gt;\r\n\t&lt;REGION&gt;&lt;NOM&gt;AUVERGNE&lt;\/NOM&gt;&lt;\/REGION&gt;\r\n&lt;\/REGIONS&gt;\r\n&lt;DEPARTEMENTS&gt;\r\n\t&lt;DEPARTEMENT&gt;\r\n\t\t&lt;NOM&gt;H\u00e9rault&lt;\/NOM&gt;\r\n\t\t&lt;REGION&gt;LANGUEDOC-ROUSILLON&lt;\/REGION&gt;\r\n\t&lt;\/DEPARTEMENT&gt;\r\n\t&lt;DEPARTEMENT&gt;\r\n\t\t&lt;NOM&gt;Pyr\u00e9n\u00e9es-Orientales&lt;\/NOM&gt;\r\n\t\t&lt;REGION&gt;LANGUEDOC-ROUSILLON&lt;\/REGION&gt;\r\n\t&lt;\/DEPARTEMENT&gt;\r\n&lt;\/DEPARTEMENTS&gt;<\/pre>\n<h2>7.3    Discussion<\/h2>\n<p>La structure de GML est tr\u00e8s puissante. Elle permet de concevoir des formats complexes issus d&rsquo;une mod\u00e9lisation objet en utilisant les notions d&rsquo;h\u00e9ritage, agr\u00e9gation, composition, association&#8230;<\/p>\n<p>Dans ce cas l\u00e0 pourquoi h\u00e9siter ? Pourquoi ne pas opter d&#8217;embl\u00e9e pour la mod\u00e9lisation objet ? D&rsquo;autant qu&rsquo;il est possible de produire automatiquement avec certains outils un sch\u00e9ma d&rsquo;application XSD \u00e0 partir de la repr\u00e9sentation UML d&rsquo;un mod\u00e8le de donn\u00e9es.<\/p>\n<p>Au risque de d\u00e9clencher des protestations, nous sommes plut\u00f4t partisans d&rsquo;une mod\u00e9lisation relationnelle. Pourquoi ?<\/p>\n<p>Les formats GML sont des formats d&rsquo;\u00e9change. Un syst\u00e8me producteur doit g\u00e9n\u00e9rer le document GML \u00e0 partir d&rsquo;un format source et un syst\u00e8me consommateur doit le retransformer en un format destination pour pouvoir l&rsquo;exploiter.<\/p>\n<p>Comme tous les outils SIG actuels exploitent des mod\u00e8les relationnels, il est plus pertinent de mettre en place un syst\u00e8me du type :<\/p>\n<p>Format Source\/Mod\u00e8le relationnel -&gt; Format GML\/Mod\u00e8le relationnel -&gt; Format destination\/Mod\u00e8le relationnel<\/p>\n<p>plut\u00f4t que :<\/p>\n<p>Format Source\/Mod\u00e8le relationnel -&gt; Format GML\/Mod\u00e8le objet -&gt; Format destination\/Mod\u00e8le relationnel<\/p>\n<p>Autrement dit, il est inutile et contre-productif d&rsquo;avoir une belle mod\u00e9lisation GML si les syst\u00e8mes source et destination exploitent des mod\u00e8les pauvres car la mod\u00e9lisation objet est nettement plus complexe \u00e0 exploiter pour les producteurs et consommateurs de GML.<\/p>\n<p>Il existe bien s\u00fbr des cas o\u00f9 la mod\u00e9lisation objet s&rsquo;impose. C&rsquo;est par exemple le cas pour la repr\u00e9sentation des donn\u00e9es urbaines 3D avec CityGML.<\/p>\n<p>Alors, objet ou relationnel ? Comme souvent il n&rsquo;y a donc pas de r\u00e8gle bien d\u00e9finie et c&rsquo;est tant mieux. C&rsquo;est aux chefs de projets d&rsquo;imposer leur vision du syst\u00e8me \u00e0 mod\u00e9liser et non aux outils de mod\u00e9lisation plus ou moins automatiques m\u00eame si ceux-ci seront bien s\u00fbr d&rsquo;un grand secours pour passer d&rsquo;une production artisanale telle que celle que nous venons de pr\u00e9senter \u00e0 une production industrielle n\u00e9cessaire \u00e0 un projet d&rsquo;envergure.<\/p>\n<div>\n<h1>8.   Conclusions<\/h1>\n<\/div>\n<p>Nous avons vu dans cet article comment concevoir un format GML int\u00e9grant de nombreuses contraintes garantes de la qualit\u00e9 des donn\u00e9es \u00e9chang\u00e9es : type des propri\u00e9t\u00e9s, int\u00e9grit\u00e9 relationnelle, unicit\u00e9, cardinalit\u00e9&#8230;<\/p>\n<p>Nous avons \u00e9galement \u00e9voqu\u00e9 les diff\u00e9rents types de mod\u00e9lisation des donn\u00e9es possibles en GML, objet ou relationnelle, et l&rsquo;impact de cette mod\u00e9lisation sur l&rsquo;exploitation des documents GML.<\/p>\n<p>Dans le troisi\u00e8me et dernier article consacr\u00e9 \u00e0 GML, nous pr\u00e9senterons une \u00e9tude de cas : l&rsquo;utilisation de GML pour repr\u00e9senter les donn\u00e9es d&rsquo;assainissement et d&rsquo;eau potable de la Communaut\u00e9 Urbaine du Grand Lyon.<\/p>\n<p>Auteurs : <a href=\"mailto:matthieu.ambrosy@veremes.com\">Matthieu Ambrosy<\/a> (Veremes) et <a href=\"mailto:olivier.gayte@veremes.com\">Olivier Gayte<\/a> (Veremes)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction Ce document est le deuxi\u00e8me d&rsquo;une s\u00e9rie de trois articles consacr\u00e9s \u00e0 GML. Le premier, intitul\u00e9 \u00ab\u00a0Pourquoi utiliser GML ?\u00a0\u00bb pr\u00e9sentait les caract\u00e9ristiques de ce format et ses &#8230;<\/p>\n","protected":false},"author":60,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4648],"tags":[4690,4710,4711],"class_list":["post-458","post","type-post","status-publish","format-standard","hentry","category-big-articles","tag-gml","tag-xml","tag-xsd"],"_links":{"self":[{"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/posts\/458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/users\/60"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/comments?post=458"}],"version-history":[{"count":70,"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/posts\/458\/revisions"}],"predecessor-version":[{"id":559,"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/posts\/458\/revisions\/559"}],"wp:attachment":[{"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/media?parent=458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/categories?post=458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.georezo.net\/geointerop\/wp-json\/wp\/v2\/tags?post=458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}