Modified: sis/site/trunk/book/fr/geoapi.html
URL: 
http://svn.apache.org/viewvc/sis/site/trunk/book/fr/geoapi.html?rev=1745551&r1=1745550&r2=1745551&view=diff
==============================================================================
--- sis/site/trunk/book/fr/geoapi.html (original)
+++ sis/site/trunk/book/fr/geoapi.html Thu May 26 00:52:22 2016
@@ -60,157 +60,57 @@
       </p></li>
     </ul>
 
-    <article>
-      <header>
-        <h1>Historique du projet GeoAPI</h1>
-      </header>
-      <p>
-        En 2001, le consortium <i>Open GIS</i> (l’ancien nom du consortium 
<i>Open Geospatial</i>) publia la spécification d’implémentation
-        <a href="http://www.opengeospatial.org/standards/ct";><abbr>OGC</abbr> 
01-009: <cite>Coordinate Transformation Services</cite></a>.
-        Cette spécification, élaborée par <i>Computer Aided Development 
Corporation</i> (Cadcorp),
-        était accompagnée d’interfaces <abbr>COM</abbr>, 
<abbr>CORBA</abbr> et Java.
-        À cette époque, la vague des services web n’avait pas encore 
éclipsé les interfaces de programmation classiques.
-        Les interfaces de l’<abbr>OGC</abbr> anticipaient tout de même un 
monde connecté en réseau,
-        mais misaient plutôt — dans le cas du Java — sur la technologie 
<abbr>RMI</abbr> (<i>Remote Method Invocation</i>).
-        Bien que le projet GeoAPI n’existait pas encore, nous désignons 
rétrospectivement ces interfaces historiques sous le nom de
-        « <a href="http://www.geoapi.org/0.1/index.html";>GeoAPI 0.1</a> ».
-        Ces interfaces utilisaient déjà le nom de paquet 
<code>org.opengis</code>, qui sera adopté par GeoAPI.
-      </p><p>
-        En 2002, des développeurs de projets libres ont lancé un
-        <a 
href="http://web.archive.org/web/20030509104308/http://digitalearth.org/story/2002/10/10/55046/206";>appel
 à la création d’un <abbr>API</abbr> géo-spatial</a>.
-        La proposition initiale suscita l’intérêt d’au moins cinq 
projets libres.
-        Le projet fut créé sur <a 
href="http://sourceforge.net/projects/geoapi/";>SourceForge</a>,
-        qui héberge depuis lors le code source dans un <a 
href="http://www.geoapi.org/source-repository.html";>dépôt Subversion</a>.
-        Le projet pris le nom de « GeoAPI » à ce moment là, et utilisa les 
interfaces de la spécification <abbr>OGC</abbr> 01-009 comme point de départ.
-      </p><p>
-        Quelques mois plus tard, l’<abbr>OGC</abbr> lança le projet
-        <a 
href="http://www.opengeospatial.org/standards/go";><abbr>GO-1</abbr>: 
<i>Geographic Objects</i></a>,
-        qui poursuivait des buts similaires à ceux de GeoAPI.
-        Entre-temps, l’<abbr>OGC</abbr> avait abandonné certaines de leur 
spécifications en faveur des normes <abbr>ISO</abbr>.
-        GeoAPI et <abbr>GO-1</abbr> ont joint leurs efforts pour une refonte 
des interfaces de GeoAPI en les basant sur ces nouvelles normes 
<abbr>ISO</abbr>.
-        La première mouture, <a 
href="http://www.geoapi.org/1.0/index.html";>GeoAPI 1.0</a>, a servit de point 
de départ
-        aux premières ébauches de la spécification <abbr>OGC</abbr> 03-064 
du groupe de travail <abbr>GO</abbr>-1.
-        La version finale de cette spécification est devenue un standard 
<abbr>OGC</abbr> en 2005, et
-        <a href="http://www.geoapi.org/2.0/index.html";>GeoAPI 2.0</a> a été 
publiée à cette occasion.
-      </p><p>
-        Le projet <abbr>GO</abbr>-1 était porté essentiellement par une 
compagnie nommée <i>Polexis</i>.
-        Son rachat par <i>Sys Technology</i> et le changement de priorité des 
nouveaux propriétaires
-        ont causé l’arrêt des travaux de <abbr>GO</abbr>-1, et par 
ricochet un ralentissement des développements de GeoAPI.
-        Afin de reprendre les développements, un nouveau groupe de travail « 
GeoAPI 3.0 » a été créé à l’<abbr>OGC</abbr>.
-        Ce groupe a réduit les ambitions par rapport à GeoAPI 2.0 en se 
concentrant sur les interfaces les plus stables,
-        et en plaçant les autres — notamment les géométries — dans un 
module nommé « <a 
href="http://www.geoapi.org/geoapi-pending/index.html";>pending</a> »,
-        pour considérations futures. <a 
href="http://www.geoapi.org/3.0/index.html";>GeoAPI 3.0</a> est devenu un
-        <a href="http://www.opengeospatial.org/standards/geoapi";>standard 
<abbr>OGC</abbr></a> en 2011.
-        Cette version a été la première à être déployée dans le <a 
href="http://search.maven.org/#search|ga|1|geoapi">dépôt central de Maven</a>.
-      </p>
-    </article>
-
-
-    <h2 id="SpecificationToInterfaces">Des spécifications aux interfaces</h2>
-    <p>
-      Les standards de l’<abbr>OGC</abbr> étant définis par des moyens 
bien éprouvés en génie logiciel,
-      il est possible de générer automatiquement des interfaces Java à 
l’aide d’outils relativement répandus.
-      Une des approches les plus utilisées est de transformer les <a 
href="http://schemas.opengis.net/gml/3.3/";>schémas <abbr>XSD</abbr></a>
-      en interfaces Java à l’aide de l’utilitaire en ligne de commande 
<code>xjc</code>.
-      Cet utilitaire étant fournit avec la plupart des distributions du Java 
(il fait partie des outils de <a 
href="http://jaxb.java.net";><abbr>JAXB</abbr></a>),
-      cette approche est choisie par plusieurs projets que l’on trouve sur 
internet.
-      D’autres approches utilisent des outils intégrés à 
l’environnement de développement Eclipse,
-      ou prennent comme point de départ les schémas <abbr>UML</abbr> plutôt 
que <abbr>XSD</abbr>.
-    </p><p>
-      Une approche similaire avait été tentée dans les débuts du projet 
GeoAPI, mais a été rapidement abandonnée.
-      Nous avons privilégié une approche manuelle pour les raisons suivantes:
-    </p>
-    <ul>
-      <li>
-        <p>
-          Certains schémas <abbr>XSD</abbr> sont beaucoup plus verbeux que 
les schémas <abbr>UML</abbr> d’origines.
-          Une conversion à partir des schémas <abbr>XSD</abbr> introduit, au 
moins dans le cas des méta-données,
-          près du double du nombre d’interfaces réellement définies par 
le standard, sans que cela n’apporte de nouvelles fonctionnalités.
-          Les schémas <abbr>XSD</abbr> définissent aussi des attributs 
propres aux documents <abbr>XML</abbr>
-          (<code class="OGC">id</code>, <code class="OGC">uuid</code>, 
<code>xlink:href</code>, <i>etc.</i>),
-          qui n’existent pas dans les diagrammes <abbr>UML</abbr> originaux 
et que l’on ne souhaite pas forcément exposer dans un <abbr>API</abbr> Java.
-          Une conversion à partir des schémas <abbr>UML</abbr> évite ce 
problème, mais les outils capable d’effectuer cette opération sont plus 
rares.
-        </p>
-        <div class="example"><p><b>Exemple:</b>
-          Les schémas <abbr>XSD</abbr> des méta-données insèrent
-          un élément <code>&lt;gmd:CI_Citation&gt;</code> à l’intérieur 
de <code>&lt;gmd:citation&gt;</code>,
-          un élément <code>&lt;gmd:CI_OnlineResource&gt;</code> à 
l’intérieur de <code>&lt;gmd:onlineResource&gt;</code>,
-          et ainsi de suite pour la centaine de classes définies dans le 
standard <abbr>ISO</abbr> 19115.
-          Cette redondance n’est absolument pas nécessaire à un programme 
Java.
-        </p></div>
-      </li>
-      <li>
-        <p>
-          Les standards de l’<abbr>OGC</abbr> utilisent des conventions de 
nommage qui sont différentes de celles du Java.
-          En particulier les noms de presque toutes les classes de 
l’<abbr>OGC</abbr> commencent par un préfixe de deux lettres,
-          comme dans <code>MD_Identifier</code>. Ces préfixes jouent le même 
rôle que les noms de paquets en Java.
-          GeoAPI adapte cette pratique en utilisant des noms d’interfaces 
sans préfixes,
-          et en plaçant ces interfaces dans des paquets correspondants aux 
préfixes mais avec des noms plus descriptifs.
-          Occasionnellement nous changeons aussi les noms, par exemple pour 
éviter des acronymes
-          ou pour se conformer à une convention établie telle que <i>Java 
beans</i>.
-        </p>
-        <div class="example"><p><b>Exemple:</b>
-          la classe <code>MD_Identifier</code> de l’<abbr>OGC</abbr> devient
-          l’interface <code>Identifier</code> dans le paquet 
<code>org.opengis.metadata</code>.
-          La classe <code>SC_CRS</code> de l’<abbr>OGC</abbr> devient 
l’interface <code>CoordinateReferenceSystem</code>,
-          et l’association <code class="OGC">usesDatum</code> devient une 
méthode <code class="GeoAPI">getDatum()</code> — et non pas
-          « <code>getUsesDatum()</code> » comme aurait fait un outil de 
conversion automatique.
-          Nous ne laissons pas des programmes appliquer aveuglement des 
règles qui ignorent les conventions de la communauté dont on traduit les 
schémas.
-        </p></div>
-      </li>
-      <li>
+    <details>
+      <summary>Pour en savoir plus sur les origines du projet GeoAPI</summary>
+      <article>
+        <header>
+          <h1>Historique du projet GeoAPI</h1>
+        </header>
         <p>
-          Les standards contiennent parfois des structures qui n’ont pas 
d’équivalent direct en Java,
-          notamment les unions telles qu’on peut trouver en C/C++.
-          La stratégie employée pour obtenir une fonctionnalité 
équivalente en Java dépend du contexte:
-          multi-héritage des interfaces, modification de la hiérarchie ou 
simplement omettre l’union.
-          Les décisions se font au cas-par-cas en fonction de l’analyse des 
besoins.
+          En 2001, le consortium <i>Open GIS</i> (l’ancien nom du consortium 
<i>Open Geospatial</i>) publia la spécification d’implémentation
+          <a 
href="http://www.opengeospatial.org/standards/ct";><abbr>OGC</abbr> 01-009: 
<cite>Coordinate Transformation Services</cite></a>.
+          Cette spécification, élaborée par <i>Computer Aided Development 
Corporation</i> (Cadcorp),
+          était accompagnée d’interfaces <abbr>COM</abbr>, 
<abbr>CORBA</abbr> et Java.
+          À cette époque, la vague des services web n’avait pas encore 
éclipsé les interfaces de programmation classiques.
+          Les interfaces de l’<abbr>OGC</abbr> anticipaient tout de même un 
monde connecté en réseau,
+          mais misaient plutôt — dans le cas du Java — sur la technologie 
<abbr>RMI</abbr> (<i>Remote Method Invocation</i>).
+          Bien que le projet GeoAPI n’existait pas encore, nous désignons 
rétrospectivement ces interfaces historiques sous le nom de
+          « <a href="http://www.geoapi.org/0.1/index.html";>GeoAPI 0.1</a> ».
+          Ces interfaces utilisaient déjà le nom de paquet 
<code>org.opengis</code>, qui sera adopté par GeoAPI.
+        </p><p>
+          En 2002, des développeurs de projets libres ont lancé un
+          <a 
href="http://web.archive.org/web/20030509104308/http://digitalearth.org/story/2002/10/10/55046/206";>appel
 à la création d’un <abbr>API</abbr> géo-spatial</a>.
+          La proposition initiale suscita l’intérêt d’au moins cinq 
projets libres.
+          Le projet fut créé sur <a 
href="http://sourceforge.net/projects/geoapi/";>SourceForge</a>,
+          qui héberge depuis lors le code source dans un <a 
href="http://www.geoapi.org/source-repository.html";>dépôt Subversion</a>.
+          Le projet pris le nom de « GeoAPI » à ce moment là, et utilisa 
les interfaces de la spécification <abbr>OGC</abbr> 01-009 comme point de 
départ.
+        </p><p>
+          Quelques mois plus tard, l’<abbr>OGC</abbr> lança le projet
+          <a 
href="http://www.opengeospatial.org/standards/go";><abbr>GO-1</abbr>: 
<i>Geographic Objects</i></a>,
+          qui poursuivait des buts similaires à ceux de GeoAPI.
+          Entre-temps, l’<abbr>OGC</abbr> avait abandonné certaines de leur 
spécifications en faveur des normes <abbr>ISO</abbr>.
+          GeoAPI et <abbr>GO-1</abbr> ont joint leurs efforts pour une refonte 
des interfaces de GeoAPI en les basant sur ces nouvelles normes 
<abbr>ISO</abbr>.
+          La première mouture, <a 
href="http://www.geoapi.org/1.0/index.html";>GeoAPI 1.0</a>, a servit de point 
de départ
+          aux premières ébauches de la spécification <abbr>OGC</abbr> 
03-064 du groupe de travail <abbr>GO</abbr>-1.
+          La version finale de cette spécification est devenue un standard 
<abbr>OGC</abbr> en 2005, et
+          <a href="http://www.geoapi.org/2.0/index.html";>GeoAPI 2.0</a> a 
été publiée à cette occasion.
+        </p><p>
+          Le projet <abbr>GO</abbr>-1 était porté essentiellement par une 
compagnie nommée <i>Polexis</i>.
+          Son rachat par <i>Sys Technology</i> et le changement de priorité 
des nouveaux propriétaires
+          ont causé l’arrêt des travaux de <abbr>GO</abbr>-1, et par 
ricochet un ralentissement des développements de GeoAPI.
+          Afin de reprendre les développements, un nouveau groupe de travail 
« GeoAPI 3.0 » a été créé à l’<abbr>OGC</abbr>.
+          Ce groupe a réduit les ambitions par rapport à GeoAPI 2.0 en se 
concentrant sur les interfaces les plus stables,
+          et en plaçant les autres — notamment les géométries — dans un 
module nommé « <a 
href="http://www.geoapi.org/geoapi-pending/index.html";>pending</a> »,
+          pour considérations futures. <a 
href="http://www.geoapi.org/3.0/index.html";>GeoAPI 3.0</a> est devenu un
+          <a href="http://www.opengeospatial.org/standards/geoapi";>standard 
<abbr>OGC</abbr></a> en 2011.
+          Cette version a été la première à être déployée dans le <a 
href="http://search.maven.org/#search|ga|1|geoapi">dépôt central de Maven</a>.
         </p>
-        <div class="example"><p><b>Exemple:</b>
-          Le standard <abbr>ISO</abbr> 19111 définit différents types de 
systèmes de coordonnées, tels que sphérique, cylindrique, polaire ou 
cartésien.
-          Puis, il définit différents <em>sous-ensembles</em> de ces types 
de systèmes de coordonnées.
-          Ces sous-ensembles, représentés par des unions, servent à 
spécifier qu’une classe peut être associée à seulement tel ou tel type de 
système de coordonnées.
-          Par exemple l’union des types pouvant être associés à une 
image, nommée <code>CS_ImageCS</code>,
-          ne contient que <code>CS_CartesianCS</code> et 
<code>CS_AffineCS</code>.
-          Dans ce cas particulier, nous obtenons en Java l’effet souhaité 
par une modification de la hiérarchie des classes:
-          nous définissons l’interface <code>CartesianCS</code> comme une 
spécialisation de <code>AffineCS</code>, ce qui est sémantiquement correct.
-          Mais il n’est pas possible d’appliquer une stratégie similaire 
pour les autres unions sans violer la sémantique.
-        </p></div>
-      </li>
-      <li>
-        <p>
-          Plusieurs spécifications se chevauchent. GeoAPI effectue un travail 
d’intégration en remplaçant certaines
-          structures qui font doublons par des références vers les 
structures équivalentes du standard qui les définies le mieux.
-        </p>
-        <div class="example"><p><b>Exemple:</b>
-          Le standard <abbr>ISO</abbr> 19115, qui définit des structures de 
méta-données, s’aventure aussi à décrire quelques
-          structures représentant les systèmes de références des 
coordonnées (<abbr title="Coordinate Reference System">CRS</abbr>).
-          Or ces derniers sont le sujet à part entière d’un autre 
standard: <abbr>ISO</abbr> 19111.
-          D’ailleurs le standard <abbr>ISO</abbr> 19111:2007 stipule, dans 
sa section 3, qu’il réutilise tous les éléments
-          de <abbr>ISO</abbr> 19115 à l’exclusion de <code>MD_CRS</code> et 
de ses composantes.
-          Les interfaces de GeoAPI réduisent la redondance en appliquant à 
l’ensemble du projet l’exclusion recommandée par <abbr>ISO</abbr> 19111.
-        </p></div>
-      </li>
-      <li>
-        <p>
-          Certains standards ont vu leur complexité s’accroître pour des 
raisons historiques plutôt que techniques,
-          liées au processus de standardisation. GeoAPI réduit la dette 
technique en concevant les interfaces comme
-          si chaque élément avait pu être intégré à sa place, sans les 
contraintes liées à l’ordre chronologique
-          dans lequel les standards ont été publiés.
-        </p>
-        <div class="example"><p><b>Exemple:</b>
-          Le standard <abbr>ISO</abbr> 19115-2 est une extension du standard 
<abbr>ISO</abbr> 19115-1 ajoutant des structures de méta-données d’images.
-          Ces méta-données ont été définies dans un standard séparé 
parce qu’elles n’ont pas été prêtes à temps pour la publication de la 
première partie du standard.
-          Comme il n’était pas possible, pour des raisons administratives, 
d’ajouter des attributs dans les classes déjà publiées,
-          les nouveaux attributs ont été ajoutées dans une sous-classe 
portant quasiment le même nom.
-          Ainsi, le standard <abbr>ISO</abbr> 19115-2 définit une classe 
<code>MI_Band</code> qui étend la
-          classe <code>MD_Band</code> du standard <abbr>ISO</abbr> 19115-1 en 
y ajoutant les attributs qui
-          auraient dû apparaître directement dans la classe parente s’ils 
avaient été prêts à temps.
-          Dans GeoAPI, nous avons choisis de « réparer » ces anomalies en 
fusionnant ces deux classes en une seule interface.
-        </p></div>
-      </li>
-    </ul>
-    <p>
+      </article>
+    </details>
+
+    <p>Les interfaces Java du projet GeoAPI sont parfois générées à partir 
d’autres fichiers fournis par l’<abbr>OGC</abbr>,
+      tels que les fichiers <abbr>XSD</abbr>. Mais il y a toujours une 
révision manuelle, et très souvent des modifications
+      par rapport aux fichiers générés par des processus automatiques.
       Les écarts par rapport aux normes sont documentés dans chaque classe 
et chaque méthode concernées.
       Chaque mention d’un écart est aussi recopiée dans <a 
href="http://www.geoapi.org/3.0/javadoc/departures.html";>une page unique</a>,
       pour donner une vue d’ensemble.
@@ -219,9 +119,197 @@
       et des fichiers de propriétés, décrits dans la section suivante.
     </p>
 
+    <details>
+      <summary>Pour en savoir plus sur les raisons d’une définition 
manuelle des interfaces Java</summary>
+      <article id="SpecificationToInterfaces">
+        <header>
+          <h1>Des spécifications de l’<abbr>OGC</abbr> aux interfaces 
Java</h1>
+        </header>
+        <p>
+          Il est possible de générer automatiquement des interfaces Java à 
partir des standards de l’<abbr>OGC</abbr> à l’aide d’outils existants.
+          Une des approches les plus utilisées est de transformer les <a 
href="http://schemas.opengis.net/gml/3.3/";>schémas <abbr>XSD</abbr></a>
+          en interfaces Java à l’aide de l’utilitaire en ligne de 
commande <code>xjc</code>.
+          Cet utilitaire étant fournit avec la plupart des distributions du 
Java (il fait partie des outils de <a 
href="http://jaxb.java.net";><abbr>JAXB</abbr></a>),
+          cette approche est choisie par plusieurs projets que l’on trouve 
sur internet.
+          D’autres approches utilisent des outils intégrés à 
l’environnement de développement Eclipse,
+          ou prennent comme point de départ les schémas <abbr>UML</abbr> 
plutôt que <abbr>XSD</abbr>.
+        </p><p>
+          Une approche similaire avait été tentée dans les débuts du 
projet GeoAPI, mais a été rapidement abandonnée.
+          Nous avons privilégié une approche manuelle pour les raisons 
suivantes:
+        </p>
+        <ul>
+          <li>
+            <p>
+              Certains schémas <abbr>XSD</abbr> sont beaucoup plus verbeux 
que les schémas <abbr>UML</abbr> d’origines.
+              Une conversion à partir des schémas <abbr>XSD</abbr> 
introduit, au moins dans le cas des méta-données,
+              près du double du nombre d’interfaces réellement définies 
par le standard, sans que cela n’apporte de nouvelles fonctionnalités.
+              Les schémas <abbr>XSD</abbr> définissent aussi des attributs 
propres aux documents <abbr>XML</abbr>
+              (<code class="OGC">id</code>, <code class="OGC">uuid</code>, 
<code>xlink:href</code>, <i>etc.</i>),
+              qui n’existent pas dans les diagrammes <abbr>UML</abbr> 
originaux et que l’on ne souhaite pas forcément exposer dans un 
<abbr>API</abbr> Java.
+              Une conversion à partir des schémas <abbr>UML</abbr> évite ce 
problème, mais les outils capable d’effectuer cette opération sont plus 
rares.
+            </p>
+            <div class="example"><p><b>Exemple:</b>
+              Les schémas <abbr>XSD</abbr> des méta-données insèrent
+              un élément <code>&lt;gmd:CI_Citation&gt;</code> à 
l’intérieur de <code>&lt;gmd:citation&gt;</code>,
+              un élément <code>&lt;gmd:CI_OnlineResource&gt;</code> à 
l’intérieur de <code>&lt;gmd:onlineResource&gt;</code>,
+              et ainsi de suite pour la centaine de classes définies dans le 
standard <abbr>ISO</abbr> 19115.
+              Cette redondance n’est absolument pas nécessaire à un 
programme Java.
+            </p></div>
+          </li>
+          <li>
+            <p>
+              Les standards de l’<abbr>OGC</abbr> utilisent des conventions 
de nommage qui sont différentes de celles du Java.
+              En particulier les noms de presque toutes les classes de 
l’<abbr>OGC</abbr> commencent par un préfixe de deux lettres,
+              comme dans <code>MD_Identifier</code>. Ces préfixes jouent le 
même rôle que les noms de paquets en Java.
+              GeoAPI adapte cette pratique en utilisant des noms 
d’interfaces sans préfixes,
+              et en plaçant ces interfaces dans des paquets correspondants 
aux préfixes mais avec des noms plus descriptifs.
+              Occasionnellement nous changeons aussi les noms, par exemple 
pour éviter des acronymes
+              ou pour se conformer à une convention établie telle que 
<i>Java beans</i>.
+            </p>
+            <div class="example"><p><b>Exemple:</b>
+              la classe <code>MD_Identifier</code> de l’<abbr>OGC</abbr> 
devient
+              l’interface <code>Identifier</code> dans le paquet 
<code>org.opengis.metadata</code>.
+              La classe <code>SC_CRS</code> de l’<abbr>OGC</abbr> devient 
l’interface <code>CoordinateReferenceSystem</code>,
+              et l’association <code class="OGC">usesDatum</code> devient 
une méthode <code class="GeoAPI">getDatum()</code> — et non pas
+              « <code>getUsesDatum()</code> » comme aurait fait un outil 
de conversion automatique.
+              Nous ne laissons pas des programmes appliquer aveuglement des 
règles qui ignorent les conventions de la communauté dont on traduit les 
schémas.
+            </p></div>
+          </li>
+          <li>
+            <p>
+              Les standards contiennent parfois des structures qui n’ont pas 
d’équivalent direct en Java,
+              notamment les unions telles qu’on peut trouver en C/C++.
+              La stratégie employée pour obtenir une fonctionnalité 
équivalente en Java dépend du contexte:
+              multi-héritage des interfaces, modification de la hiérarchie 
ou simplement omettre l’union.
+              Les décisions se font au cas-par-cas en fonction de l’analyse 
des besoins.
+            </p>
+            <div class="example"><p><b>Exemple:</b>
+              Le standard <abbr>ISO</abbr> 19111 définit différents types de 
systèmes de coordonnées, tels que sphérique, cylindrique, polaire ou 
cartésien.
+              Puis, il définit différents <em>sous-ensembles</em> de ces 
types de systèmes de coordonnées.
+              Ces sous-ensembles, représentés par des unions, servent à 
spécifier qu’une classe peut être associée à seulement tel ou tel type de 
système de coordonnées.
+              Par exemple l’union des types pouvant être associés à une 
image, nommée <code>CS_ImageCS</code>,
+              ne contient que <code>CS_CartesianCS</code> et 
<code>CS_AffineCS</code>.
+              Dans ce cas particulier, nous obtenons en Java l’effet 
souhaité par une modification de la hiérarchie des classes:
+              nous définissons l’interface <code>CartesianCS</code> comme 
une spécialisation de <code>AffineCS</code>, ce qui est sémantiquement 
correct.
+              Mais il n’est pas possible d’appliquer une stratégie 
similaire pour les autres unions sans violer la sémantique.
+            </p></div>
+          </li>
+          <li>
+            <p>
+              Plusieurs spécifications se chevauchent. GeoAPI effectue un 
travail d’intégration en remplaçant certaines
+              structures qui font doublons par des références vers les 
structures équivalentes du standard qui les définies le mieux.
+            </p>
+            <div class="example"><p><b>Exemple:</b>
+              Le standard <abbr>ISO</abbr> 19115, qui définit des structures 
de méta-données, s’aventure aussi à décrire quelques
+              structures représentant les systèmes de références des 
coordonnées (<abbr title="Coordinate Reference System">CRS</abbr>).
+              Or ces derniers sont le sujet à part entière d’un autre 
standard: <abbr>ISO</abbr> 19111.
+              D’ailleurs le standard <abbr>ISO</abbr> 19111:2007 stipule, 
dans sa section 3, qu’il réutilise tous les éléments
+              de <abbr>ISO</abbr> 19115 à l’exclusion de 
<code>MD_CRS</code> et de ses composantes.
+              Les interfaces de GeoAPI réduisent la redondance en appliquant 
à l’ensemble du projet l’exclusion recommandée par <abbr>ISO</abbr> 19111.
+            </p></div>
+          </li>
+          <li>
+            <p>
+              Certains standards ont vu leur complexité s’accroître pour 
des raisons historiques plutôt que techniques,
+              liées au processus de standardisation. GeoAPI réduit la dette 
technique en concevant les interfaces comme
+              si chaque élément avait pu être intégré à sa place, sans 
les contraintes liées à l’ordre chronologique
+              dans lequel les standards ont été publiés.
+            </p>
+            <div class="example"><p><b>Exemple:</b>
+              Le standard <abbr>ISO</abbr> 19115-2 est une extension du 
standard <abbr>ISO</abbr> 19115-1 ajoutant des structures de méta-données 
d’images.
+              Ces méta-données ont été définies dans un standard séparé 
parce qu’elles n’ont pas été prêtes à temps pour la publication de la 
première partie du standard.
+              Comme il n’était pas possible, pour des raisons 
administratives, d’ajouter des attributs dans les classes déjà publiées,
+              les nouveaux attributs ont été ajoutées dans une sous-classe 
portant quasiment le même nom.
+              Ainsi, le standard <abbr>ISO</abbr> 19115-2 définit une classe 
<code>MI_Band</code> qui étend la
+              classe <code>MD_Band</code> du standard <abbr>ISO</abbr> 19115-1 
en y ajoutant les attributs qui
+              auraient dû apparaître directement dans la classe parente 
s’ils avaient été prêts à temps.
+              Dans GeoAPI, nous avons choisis de « réparer » ces 
anomalies en fusionnant ces deux classes en une seule interface.
+            </p></div>
+          </li>
+        </ul>
+      </article>
+    </details>
+
+    <p id="GeoAPI-core">
+      GeoAPI est constitué de plusieurs modules.
+      Les modules <code>geoapi</code> et <code>geoapi-pending</code>
+      fournissent les interfaces dérivées des schémas <abbr>UML</abbr> des 
standards internationaux.
+      Le modèle conceptuel sera expliqué en détails dans les chapitres 
décrivant l’implémentation Apache <abbr>SIS</abbr>.
+      On peut toutefois avoir un aperçu de son contenu en consultant la page 
listant les
+      <a href="http://www.geoapi.org/3.0/javadoc/content.html";>types et 
méthodes de GeoAPI et les standards d’où ils proviennent</a>.
+    </p>
+
+    <details>
+      <summary>Pour en savoir plus sur les modules de GeoAPI</summary>
+      <article id="GeoAPI-modules">
+        <h1>Les modules de GeoAPI</h1>
+        <p>
+          Le projet GeoAPI est composé d’une partie standardisée 
(<code>geoapi</code>) et
+          d’une partie expérimentale (<code>geoapi-pending</code>). Ces 
deux parties étant
+          mutuellement exclusives, les utilisateurs doivent veiller à ne pas 
les mélanger dans un même projet.
+          Cette séparation est garantie pour tous les projets qui ne 
dépendent que du dépôt central de Maven
+          (incluant les versions finales de Apache <abbr>SIS</abbr>),
+          car le module <code>geoapi-pending</code> n’est jamais déployé 
sur ce dépôt central.
+          En revanche certaines branches de développement de <abbr>SIS</abbr> 
peuvent dépendre de <code>geoapi-pending</code>.
+        </p><p>
+          Les modules de GeoAPI sont:
+        </p>
+        <ul>
+          <li><p>
+            <b><code>geoapi</code></b> — contient les interfaces couvertes 
par le
+            <a href="http://www.opengeospatial.org/standards/geoapi";>standard 
GeoAPI de l’<abbr>OGC</abbr></a>.
+            Les versions finales de Apache <abbr>SIS</abbr> dépendent de ce 
module.
+          </p></li>
+          <li><p>
+            <b><code>geoapi-pending</code></b> — contient une
+            <em>copie</em> de toutes les interfaces du module 
<code>geoapi</code>
+            (non pas une dépendance) avec des ajouts qui n’ont pas encore 
été approuvés comme un standard <abbr>OGC</abbr>.
+            Certains ajouts apparaissent dans des interfaces normalement 
définies par le module <code>geoapi</code>,
+            d’où la nécessité de les copier.
+            Les branches de développement <code>jdk6</code>,
+            <code>jdk7</code> et <code>jdk8</code> de Apache <abbr>SIS</abbr> 
dépendent de ce module,
+            mais cette dépendance est transformée en une dépendance vers le 
module <code>geoapi</code>
+            standard au moment de fusionner les branches avec le tronc.
+          </p></li>
+          <li><p>
+            <b><code>geoapi-conformance</code></b> — contient
+            une suite de tests JUnit que les développeurs peuvent utiliser 
pour tester leurs implémentations.
+          </p></li>
+          <li><p>
+            <b><code>geoapi-examples</code></b> — contient des
+            exemples d’implémentations relativement simples. Ces exemples 
sont placés dans le domaine public
+            afin d’encourager les utilisateurs à les copier et les adapter 
à leurs besoins si les services
+            de Apache <abbr>SIS</abbr> ne conviennent pas.
+          </p></li>
+          <li><p>
+            <b><code>geoapi-proj4</code></b> — contient une
+            implémentation partielle des paquets 
<code>org.opengis.referencing</code>
+            sous forme d’adaptateurs basés sur la bibliothèque C/C++ 
Proj.4.
+            Ce module peut être utilisé comme alternative au module 
<code>sis-referencing</code>
+            pour certaines fonctions.
+          </p></li>
+          <li><p>
+            <b><code>geoapi-netcdf</code></b> — contient une 
implémentation partielle des paquets
+            <code>org.opengis.referencing</code> et 
<code>org.opengis.coverage</code>
+            sous forme d’adaptateurs basés sur la bibliothèque 
<abbr>NetCDF</abbr> de l’<abbr>UCAR</abbr>.
+            La suite de tests de ce module a été conçue de manière à 
être réutilisable par d’autres projets.
+            Apache <abbr>SIS</abbr> l’utilise pour tester son propre module 
<code>sis-netcdf</code>.
+          </p></li>
+          <li><p>
+            <b><code>geoapi-openoffice</code></b> — contient
+            un <i>add-in</i> pour les suites bureautiques Libre/OpenOffice.org.
+            <!--
+            Apache <abbr>SIS</abbr> offre son propre <i>add-in</i> dans le 
module <code>sis-openoffice</code>,
+            mais utilise les mêmes noms de fonctions que le module de GeoAPI 
afin d’assurer une certaine compatibilité.
+            -->
+          </p></li>
+        </ul>
+      </article>
+    </details>
+
 
 
-    <h3 id="UML-annotation">Correspondances explicitées par l’annotation 
<code>@UML</code></h3>
+    <h2 id="UML-annotation">Correspondances entre GeoAPI et les 
spécifications abstraites</h2>
     <p>
       Pour chaque classe, méthode et constante définie à partir d’un 
standard <abbr>OGC</abbr> ou <abbr>ISO</abbr>,
       GeoAPI indique sa provenance à l’aide d’annotations définies dans 
le paquet <code>org.opengis.annotation</code>.
@@ -242,61 +330,35 @@
 /**
  * A 2D coordinate reference system used to approximate the shape of the earth 
on a planar surface.
  */
-@UML(specification = ISO_19111,
-     identifier = "<code class="OGC">SC_ProjectedCRS</code>")
+@UML(specification=ISO_19111, identifier="<code 
class="OGC">SC_ProjectedCRS</code>")
 public interface ProjectedCRS extends GeneralDerivedCRS {
     /**
      * Returns the coordinate system, which must be Cartesian.
      */
-    @UML(obligation = MANDATORY,
-         specification = ISO_19111,
-         identifier = "<code class="OGC">coordinateSystem</code>")
+    @UML(obligation=MANDATORY, specification=ISO_19111, identifier="<code 
class="OGC">coordinateSystem</code>")
     CartesianCS <code class="GeoAPI">getCoordinateSystem()</code>;
 }</pre>
 
     <p>
       Les méthodes d’introspections du Java permettent d’accéder à ces 
informations pendant l’exécution d’une application.
       C’est utile pour obtenir les noms à afficher à des utilisateurs 
familiers avec les normes de l’<abbr>OGC</abbr>,
-      ou pour écrire des éléments dans un document <abbr>XML</abbr>. 
L’exemple suivant affiche le nom standard de la
-      méthode <code class="GeoAPI">getTitle()</code> de l’interface 
<code>Citation</code>:
-    </p>
-
-<pre>Class&lt;?&gt; type   = Citation.class;
-Method   method = type.getMethod("<code class="GeoAPI">getTitle</code>", 
(Class&lt;?&gt;[]) null);
-UML      annot  = method.getAnnotation(UML.class);
-String   id     = annot.identifier();
-System.out.println("Le nom standard de la méthode " + method.getName() + " 
est " + id);</pre>
-
-    <p>
-      La classe <code>org.apache.sis.util.iso.Types</code> fournit la méthode 
de commodité
-      <code class="SIS">getStandardName(Class)</code> pour effectuer cette 
opération.
-    </p>
-
-    <p>
-      L’opération inverse — obtenir la classe et méthode Java d’un 
nom standard — est un peu plus lourde.
-      Elle nécessite la lecture du fichier <code 
class="GeoAPI">class-index.properties</code> fournit dans le
-      paquet <code>org.opengis.annotation</code>. L’exemple suivant lit ce 
fichier juste avant
-      de rechercher le nom de l’interface correspondant à 
<code>CI_Citation</code>.
-      Toutefois les utilisateurs sont encouragés à ne lire ce fichier 
qu’une fois et de conserver son contenu dans
-      une cache de leur application.
+      ou pour écrire des éléments dans un document <abbr>XML</abbr>.
+      La classe <code>org.apache.sis.util.iso.Types</code> fournit des 
méthodes de commodité
+      telles que <code class="SIS">getStandardName(Class)</code> pour 
effectuer cette opération.
+      Par exemple le code suivant affichera
+      « Le nom standard du type 
<code>org.opengis.referencing.crs.ProjectedCRS</code> est 
<code>SC_ProjectedCRS</code> »:
     </p>
 
-<pre>Properties isoToGeoAPI = new Properties();
-try (InputStream in = UML.class.getResourceAsStream("<code 
class="GeoAPI">class-index.properties</code>")) {
-    isoToGeoAPI.load(in);
-}
-String isoName = "<code class="OGC">CI_Citation</code>";
-String geoName = getProperty(isoName);
-Class&lt;?&gt;  type = Class.forName(geoName);
-System.out.println("L’interface GeoAPI pour le type <abbr>ISO</abbr> " + 
isoName + " est " + type);</pre>
+<pre>Class&lt;?&gt; type = ProjectedCRS.class;
+System.out.println("Le nom standard du type " + type.getName() + " est " + 
Types.getStandardName(type));</pre>
 
     <p>
-      La classe <code>org.apache.sis.util.iso.Types</code> fournit la méthode 
de commodité
-      <code class="SIS">forStandardName(String)</code> pour effectuer cette 
opération.
+      La méthode de commodité <code 
class="SIS">Types.forStandardName(String)</code> effectue l’opération 
inverse.
+      Les applications qui souhaiteraient effectuer ces opérations sans 
utiliser les méthodes de commodités de Apache SIS
+      trouveront des indications dans un <a 
href="#UML-annotation-geoapi">chapitre séparé</a>.
     </p>
 
 
-
     <h3 id="MappingToJDK">Correspondances implicites avec le <abbr>JDK</abbr> 
standard</h3>
     <p>
       Certaines classes et méthodes n’ont ni annotation <code>@UML</code>,
@@ -484,369 +546,50 @@ assert MediumName.<code class="GeoAPI">v
 
 
 
-    <h2 id="ServiceLoader">Obtenir une implémentation des interfaces</h2>
-    <p>
-      GeoAPI définit des fabriques (<code>Factory</code>) permettant de 
créer des implémentations de ses interfaces.
-      Par exemple <code>DatumFactory</code> fournit des méthodes permettant 
de créer des instances
-      implémentant les interfaces du paquet 
<code>org.opengis.referencing.datum</code>.
-      Ces <code>Factory</code> doivent être implémentées par les 
bibliothèques géospatiales
-      et déclarées comme <i>services</i> tel que défini par la classe 
standard <code>java.util.ServiceLoader</code>.
-      La javadoc de <code>ServiceLoader</code> explique la façon de procéder.
-      Mais pour résumer, les bibliothèques doivent créer dans le 
répertoire <code>META-INF/services/</code>
-      un fichier dont le nom correspond au nom complet de l’interface de la 
fabrique
-      (<code>org.opengis.referencing.datum.DatumFactory</code> dans 
l’exemple précédent).
-      Ce fichier texte doit contenir sur une ligne le nom complet de la classe 
implémentant cette interface.
-      Il peut s’agir d’une classe cachée aux yeux des utilisateurs, car 
ils n’ont pas besoin de connaître son existence.
-    </p>
-    <p>
-      Si la bibliothèque a bien déclaré ses fabriques comme des services, 
alors
-      les utilisateurs peuvent les obtenir en utilisant 
<code>ServiceLoader</code> comme dans l’exemple ci-dessous.
-      Cet exemple ne prend que la première fabrique trouvée; s’il existe 
plusieurs fabriques,
-      par exemple lorsque plusieurs bibliothèques cohabitent, alors le choix 
est laissé à l’utilisateur.
-    </p>
-
-<pre>import org.opengis.referencing.GeodeticDatum;
-import org.opengis.referencing.DatumFactory;
-import java.util.ServiceLoader;
-
-public class MyApplication {
-    public void createMyDatum() {
-        ServiceLoader  loader = ServiceLoader.load(DatumFactory.class);
-        DatumFactory  factory = loader.iterator().next();
-        GeodeticDatum myDatum = factory.<code 
class="GeoAPI">createGeodeticDatum</code>(…);
-    }
-}</pre>
-
-
-
-    <h3 id="GeoAPI-simple">Fournir sa propre implémentation</h3>
-    <p>
-      Implémenter soi-même GeoAPI n’est pas si difficile si on se contente 
de besoins bien précis.
-      Un développeur peut se concentrer sur une poignée d’interfaces parmi 
les centaines de disponibles,
-      tout en disposant des autres interfaces comme autant de points 
d’extensions à éventuellement implémenter
-      au gré des besoins.
-    </p>
-    <p>
-      Le modèle conceptuel représenté par les interfaces est complexe. Mais 
cette complexité peut être réduite en combinant certaines interfaces.
-      Par exemple plusieurs bibliothèques, même réputées, ne font pas la 
distinction entre <cite>Système de coordonnées</cite> (<abbr>CS</abbr>)
-      et <cite>Système de <u>référence</u> des coordonnées</cite> 
(<abbr>CRS</abbr>).
-      Un développeur qui lui non-plus ne souhaite pas faire cette distinction 
peut implémenter ces deux interfaces par la même classe.
-      Il peut en résulter une implémentation dont la hiérarchie de classes 
est plus simple que la hiérarchie des interfaces de GeoAPI.
-      Le module <code>geoapi-examples</code>, discuté plus loin, fournit de 
telles combinaisons.
-      Le tableau suivant énumère quelques combinaisons possibles:
-    </p>
-    <table>
-      <tr>
-        <th>Interface principale</th>
-        <th>Interface auxiliaire</th>
-        <th>Usage</th>
-      </tr>
-      <tr>
-        <td><code>CoordinateReferenceSystem</code></td>
-        <td><code>CoordinateSystem</code></td>
-        <td>Description d’un système de référence spatial 
(<abbr>CRS</abbr>).</td>
-      </tr>
-      <tr>
-        <td><code>GeodeticDatum</code></td>
-        <td><code>Ellipsoid</code></td>
-        <td>Description d’un référentiel geodétique.</td>
-      </tr>
-      <tr>
-        <td><code>CoordinateOperation</code></td>
-        <td><code>MathTransform</code></td>
-        <td>Opération de transformation de coordonnées.</td>
-      </tr>
-      <tr>
-        <td><code>IdentifiedObject</code></td>
-        <td><code>ReferenceIdentifier</code></td>
-        <td>Objet (typiquement un <abbr>CRS</abbr>) que l’on peut identifier 
par un code.</td>
-      </tr>
-      <tr>
-        <td><code>Citation</code></td>
-        <td><code>InternationalString</code></td>
-        <td>Référence bibliographique composée d’un simple titre.</td>
-      </tr>
-      <tr>
-        <td><code>GeographicBoundingBox</code></td>
-        <td><code>Extent</code></td>
-        <td>Étendue spatiale en degrés de longitude et de latitude.</td>
-      </tr>
-      <tr>
-        <td><code>ParameterValue</code></td>
-        <td><code>ParameterDescriptor</code></td>
-        <td>Description d’un paramètre (nom, type) associée à sa 
valeur.</td>
-      </tr>
-      <tr>
-        <td><code>ParameterValueGroup</code></td>
-        <td><code>ParameterDescriptorGroup</code></td>
-        <td>Description d’un ensemble de paramètres associés à leurs 
valeurs.</td>
-      </tr>
-    </table>
-
-
-
-    <h2 id="GeoAPI-modules">Les modules de GeoAPI</h2>
-    <p>
-      Le projet GeoAPI est composé d’une partie standardisée 
(<code>geoapi</code>) et
-      d’une partie expérimentale (<code>geoapi-pending</code>). Ces deux 
parties étant
-      mutuellement exclusives, les utilisateurs doivent veiller à ne pas les 
mélanger dans un même projet.
-      Cette séparation est garantie pour tous les projets qui ne dépendent 
que du dépôt central de Maven
-      (incluant les versions finales de Apache <abbr>SIS</abbr>),
-      car le module <code>geoapi-pending</code> n’est jamais déployé sur 
ce dépôt central.
-      En revanche certaines branches de développement de <abbr>SIS</abbr> 
peuvent dépendre de <code>geoapi-pending</code>.
-    </p>
-    <p>
-      Les modules de GeoAPI sont:
-    </p>
-    <ul>
-      <li><p>
-        <b><code>geoapi</code></b> — contient les interfaces couvertes par 
le
-        <a href="http://www.opengeospatial.org/standards/geoapi";>standard 
GeoAPI de l’<abbr>OGC</abbr></a>.
-        Les versions finales de Apache <abbr>SIS</abbr> dépendent de ce 
module.
-      </p></li>
-      <li><p>
-        <b><code>geoapi-pending</code></b> — contient une
-        <em>copie</em> de toutes les interfaces du module <code>geoapi</code>
-        (non pas une dépendance) avec des ajouts qui n’ont pas encore été 
approuvés comme un standard <abbr>OGC</abbr>.
-        Certains ajouts apparaissent dans des interfaces normalement définies 
par le module <code>geoapi</code>,
-        d’où la nécessité de les copier.
-        Les branches de développement <code>jdk6</code>,
-        <code>jdk7</code> et <code>jdk8</code> de Apache <abbr>SIS</abbr> 
dépendent de ce module,
-        mais cette dépendance est transformée en une dépendance vers le 
module <code>geoapi</code>
-        standard au moment de fusionner les branches avec le tronc.
-      </p></li>
-      <li><p>
-        <b><code>geoapi-conformance</code></b> — contient
-        une suite de tests JUnit que les développeurs peuvent utiliser pour 
tester leurs implémentations.
-      </p></li>
-      <li><p>
-        <b><code>geoapi-examples</code></b> — contient des
-        exemples d’implémentations relativement simples. Ces exemples sont 
placés dans le domaine public
-        afin d’encourager les utilisateurs à les copier et les adapter à 
leurs besoins si les services
-        de Apache <abbr>SIS</abbr> ne conviennent pas.
-      </p></li>
-      <li><p>
-        <b><code>geoapi-proj4</code></b> — contient une
-        implémentation partielle des paquets 
<code>org.opengis.referencing</code>
-        sous forme d’adaptateurs basés sur la bibliothèque C/C++ Proj.4.
-        Ce module peut être utilisé comme alternative au module 
<code>sis-referencing</code>
-        pour certaines fonctions.
-      </p></li>
-      <li><p>
-        <b><code>geoapi-netcdf</code></b> — contient une implémentation 
partielle des paquets
-        <code>org.opengis.referencing</code> et 
<code>org.opengis.coverage</code>
-        sous forme d’adaptateurs basés sur la bibliothèque 
<abbr>NetCDF</abbr> de l’<abbr>UCAR</abbr>.
-        La suite de tests de ce module a été conçue de manière à être 
réutilisable par d’autres projets.
-        Apache <abbr>SIS</abbr> l’utilise pour tester son propre module 
<code>sis-netcdf</code>.
-      </p></li>
-      <li><p>
-        <b><code>geoapi-openoffice</code></b> — contient
-        un <i>add-in</i> pour les suites bureautiques Libre/OpenOffice.org.
-        <!--
-        Apache <abbr>SIS</abbr> offre son propre <i>add-in</i> dans le module 
<code>sis-openoffice</code>,
-        mais utilise les mêmes noms de fonctions que le module de GeoAPI afin 
d’assurer une certaine compatibilité.
-        -->
-      </p></li>
-    </ul>
-
-    <h3 id="GeoAPI-core">Les modules de définition des interfaces</h3>
-    <p>
-      Les modules <code>geoapi</code> et <code>geoapi-pending</code>
-      fournissent les interfaces dérivées des schémas <abbr>UML</abbr> des 
standards internationaux.
-      Le modèle conceptuel sera expliqué en détails dans les chapitres 
décrivant l’implémentation Apache <abbr>SIS</abbr>.
-      On peut toutefois avoir un aperçu de son contenu en consultant la page 
listant les
-      <a href="http://www.geoapi.org/3.0/javadoc/content.html";>types et 
méthodes de GeoAPI et les standards d’où ils proviennent</a>.
-    </p>
-
-
-
-    <h3 id="GeoAPI-conformance">Le module de tests de conformité</h3>
-    <p>
-      Le module <code>geoapi-conformance</code> fournit des 
<i>validateurs</i>, une <i>suite de tests</i> JUnit
-      et des <i>générateurs de rapports</i> sous forme de pages <abbr 
title="Hypertext Markup Language">HTML</abbr>.
-      Ce module peut être utilisé avec n’importe quelle implémentation de 
GeoAPI.
-      Pour les développeurs d’une bibliothèque géospatiale, il offre les 
avantages suivants:
-    </p>
-    <ul>
-      <li>Réduire la fastidieuse tâche d’écriture des tests, en 
réutilisant des tests existants.</li>
-      <li>Accroître la confiance en la validité des tests, du fait que 
<code>geoapi-conformance</code>
-          a lui-même sa propre suite de tests et est appliqué à d’autres 
implémentations.</li>
-      <li>Faciliter la comparaison avec les autres implémentations.</li>
-    </ul>
-
-
-
-    <h4 id="GeoAPI-validators">Validations des instances</h4>
-    <p>
-      GeoAPI peut valider une instance de ses interfaces en vérifiant que 
certaines contraintes sont respectées.
-      Certaines contraintes ne peuvent pas être exprimées dans la signature 
de la méthode. Ces contraintes sont
-      généralement décrites textuellement dans les spécifications 
abstraites ou dans la javadoc.
-    </p>
-    <div class="example"><p><b>Exemple:</b>
-      La conversion ou transformation d’une coordonnée 
(<code>CC_CoordinateOperation</code>) peut nécessiter l’enchaînement de 
plusieurs étapes.
-      Dans une telle chaîne d’opérations 
(<code>CC_ConcatenatedOperation</code>),
-      pour chaque étape (<code>CC_SingleOperation</code>) le nombre de 
dimensions
-      en sortie doit être égal au nombre de dimensions attendu en entré par 
l’opération suivante.
-      Exprimée en langage Java, cette contrainte stipule que pour tout index
-      0 &lt; <var>i</var> &lt; <var>n</var> où <var>n</var> est le nombre 
d’opérations, on a
-      <code>coordOperation[i].targetDimensions == 
coordOperation[i-1].sourceDimensions</code>.
-    </p></div>
-
-    <p>
-      La façon la plus simple d’effectuer ces vérifications est 
d’appeler les méthodes statiques
-      <code class="GeoAPI">validate(…)</code> de la classe 
<code>org.opengis.test.Validators</code>.
-      Ces méthodes portant toutes le même nom, il suffit d’écrire 
“<code>validate(<var>valeur</var>)</code>”
-      et de laisser le compilateur choisir la méthode la plus appropriée en 
fonction du type d’objet donné en argument.
-      Si le type d’objet n’est pas connu au moment de la compilation, 
alors la méthode <code class="GeoAPI">dispatch(Object)</code>
-      peut se charger de rediriger le travail à la méthode <code 
class="GeoAPI">validate(…)</code> appropriée.
-    </p>
-    <p>
-      Toutes les fonctions <code class="GeoAPI">validate(…)</code> suivent 
le fil des dépendances,
-      c’est-à-dire qu’elles valideront aussi chaque composantes de 
l’objet à valider.
-      Par exemple la validation d’un objet <code>GeographicCRS</code> 
impliquera
-      la validation de sa composante <code>GeodeticDatum</code>, qui 
impliquera elle-même
-      la validation de sa composante <code>Ellipsoid</code>, et ainsi de suite.
-      Il est donc inutile de valider soi-même les composantes, à moins de 
vouloir isoler le test d’un élément souvent problématique.
-    </p>
-    <p>
-      Par défaut, les validations sont aussi strictes que possible. Il est 
possible toutefois d’assouplir certaines règles.
-      L’assouplissement le plus fréquent consiste à tolérer l’absence 
d’attributs qui étaient sensés être obligatoires.
-      Cette règle et quelques autres peuvent être modifiées globalement 
pour tous les tests exécutés dans la
-      <abbr title="Java Virtual Machine">JVM</abbr> courante comme dans 
l’exemple suivant:
-    </p>
-
-<pre>import org.opengis.metadata.Metadata;
-import org.opengis.test.Validators;
-import org.junit.Test;
-
-public class MyTest {
-    /*
-     * Tolérer l’absence d’attributs obligatoires dans les paquets 
metadata et citation.
-     * Cette modification s’appliquera à tous les tests exécutés dans la 
<abbr>JVM</abbr> courante.
-     * S’il existe plusieurs classes de tests, cette initialisation peut 
être effectuée
-     * dans une classe parente à toutes les classes de tests.
-     */
-    static {
-        Validators.<code 
class="GeoAPI">DEFAULT.metadata.requireMandatoryAttributes</code> = false;
-        Validators.<code 
class="GeoAPI">DEFAULT.citation.requireMandatoryAttributes</code> = false;
-    }
-
-    @Test
-    public void testMyMetadata() {
-        Metadata myObject = …; // Construisez un objet ici.
-        Validators.<code class="GeoAPI">validate</code>(myObject);
-    }
-}</pre>
-
-    <p>
-      Les règles peuvent aussi être modifiées pour une suite de tests 
particulière,
-      sans affecter la configuration par défaut de la <abbr>JVM</abbr> 
courante.
-      Cette approche nécessite de créer une nouvelle instance du validateur 
dont on souhaite modifier la configuration.
-    </p>
-
-<pre>import org.opengis.metadata.Metadata;
-import org.opengis.test.ValidatorContainer;
-import org.junit.Test;
-
-public class MyTest {
-    private final ValidatorContainer validators;
-
-    public MyTest() {
-        validators = new ValidatorContainer();
-        validators.<code 
class="GeoAPI">metadata.requireMandatoryAttributes</code> = false;
-        validators.<code 
class="GeoAPI">citation.requireMandatoryAttributes</code> = false;
-    }
-
-    @Test
-    public void testMyMetadata() {
-        Metadata myObject = …; // Construisez un objet ici.
-        validators.<code class="GeoAPI">validate</code>(myObject);
-    }
-}</pre>
-
-
-
-    <h4 id="GeoAPI-tests">Exécution des tests pré-définis</h4>
-    <p>
-      Des classes de tests JUnit sont définies dans des sous-paquets de 
<code>org.opengis.test</code>.
-      Toutes les classes de tests portent un nom se terminant en 
"<code>Test</code>".
-      GeoAPI définie aussi une classe <code>org.opengis.test.TestSuite</code> 
englobant l’ensemble
-      des tests définis dans le module <code>geoapi-conformance</code>, mais 
Apache <abbr>SIS</abbr> ne l’utilise pas.
-      Apache <abbr>SIS</abbr> hérite plutôt des classes <code 
class="GeoAPI">*Test</code> de GeoAPI au cas-par-cas, dans les modules 
appropriés.
-      L’exemple ci-dessous donne un exemple de test de GeoAPI personnalisé.
-      La <a 
href="http://www.geoapi.org/geoapi-conformance/apidocs/org/opengis/test/referencing/ParameterizedTransformTest.html";>Javadoc
-      de la classe parente</a> documente en détails les tests effectués.
-      Dans cet exemple, un seul test est modifié et tous les autres tests 
sont hérités tels quels
-      (il n’est pas nécessaire de les répéter dans la sous-classe).
-      Toutefois, cet exemple ajoute une vérification supplémentaire, 
annotée <code>@After</code>,
-      qui sera exécutée après chacun des tests.
-    </p>
-
-<pre>import org.junit.*;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-import org.opengis.test.referencing.ParameterizedTransformTest;
-import static org.junit.Assert.*;
-
-@RunWith(JUnit4.class)
-public class MyTest extends ParameterizedTransformTest {
-    /**
-     * Spécifie aux tests de GeoAPI notre propre fabrique de transformations 
de coordonnées.
-     * GeoAPI testera les objets construits par cette fabrique.
-     */
-    public MyTest() {
-        super(new MyMathTransformFactory());
-    }
-
-    /**
-     * Modifie le comportement d’un test. Cet exemple assouplit un peu les 
exigences de ce test,
-     * en acceptant des erreurs jusqu’à 10 centimètres plutôt que la 
valeur par défaut de 1 cm.
-     * Ce changement ne s’applique qu’à cette méthode est n’affecte 
pas les autres tests hérités.
-     */
-    @Test
-    @Override
-    public void testLambertAzimuthalEqualArea() throws FactoryException, 
TransformException {
-        <code class="GeoAPI">tolerance</code> = 0.1; // Tolérance de 10 cm.
-        super.<code class="GeoAPI">testLambertAzimuthalEqualArea()</code>;
-    }
-
-    /**
-     * Vérification supplémentaire effectuée après chaque test, hérité 
ou non.
-     * Dans cet exemple, nous vérifions que la transformation qui a été 
testée
-     * travaillait bien dans des espaces bi-dimensionnels.
-     */
-    @After
-    public void ensureAllTransformAreMath2D() {
-        assertTrue(<code class="GeoAPI">transform</code> instanceof 
MathTransform2D);
-    }
-}</pre>
-
-
-
-    <h3 id="GeoAPI-examples">Les modules d’exemples</h3>
-    <p>
-      Le module <code>geoapi-examples</code> fournit des exemples 
d’implémentations simples.
-      Plusieurs de ces classes implémentent plus d’une interface à la fois 
afin de proposer un modèle conceptuel plus simple.
-      La <a 
href="http://www.geoapi.org/geoapi-examples/apidocs/overview-summary.html";>Javadoc
 de ce module</a>
-      énumère les paquets et classes clés avec les combinaisons effectuées.
-      Ce module illustre non-seulement comment GeoAPI peut-être implémenté, 
mais aussi comment l’implémentation
-      peut être testée en utilisant <code>geoapi-conformance</code>.
-    </p>
+    <h2 id="GeoAPI-implementation">Implémentations des interfaces</h2>
     <p>
-      Bien que sa mission première soit de servir d’inspiration aux 
implémenteurs,
-      <code>geoapi-examples</code> a tout-de-même été conçu de manière à 
être utilisable
-      par des applications ayant des besoins très simples. Tous les exemples 
étant dans le domaine publique,
-      les développeurs sont invités à adapter librement des copies de ces 
classes si nécessaires.
-      Toutefois si des modifications sont apportées hors du cadre du projet 
GeoAPI, le bon usage veut que les copies
-      modifiées soient placées dans un paquet portant un autre nom que 
<code>org.opengis</code>.
-    </p>
-    <p>
-      Pour des besoins un peu plus poussés, les développeurs sont invités à
 examiner les modules
-      <code>geoapi-proj4</code> et <code>geoapi-netcdf</code>.
-      Ces deux modules fournissent des exemples d’adaptateurs permettant 
d’utiliser, via les interfaces de GeoAPI,
-      une partie des fonctionnalités de bibliothèques externes (Proj.4 et 
<abbr>NetCDF</abbr>).
-      L’avantage de passer par ces interfaces est de disposer d’un modèle 
unifié pour exploiter deux <abbr>API</abbr> très différents,
-      tout en se gardant la possibilité de basculer plus facilement à une 
autre bibliothèque si désiré.
+      Apache SIS implémente la plupart des interfaces de GeoAPI avec une 
classe du même nom que l’interface,
+      mais préfixée de « <code>Abstract</code> », « 
<code>Default</code> » ou « <code>General</code> ».
+      Les classes de Apache SIS qui sont préfixées par « 
<code>Default</code> » peuvent être instanciées directement
+      par une instruction <code>new DefaultXXX(…)</code> ou par la méthode 
<code>createXXX(…)</code> correspondante d’une fabrique.
+    </p>
+    <div class="example"><b>Example:</b> pour représenter un système de 
référence de coordonnées projetées (Mercator, Lambert, <i>etc</i>):
+      <ul>
+        <li><code>org.opengis.referencing.crs.ProjectedCRS</code> est 
l’interface définie par GeoAPI sur la base du standard ISO 19111, et</li>
+        <li><code>org.apache.sis.referencing.crs.DefaultProjectedCRS</code> 
est l’implémentation fournie par Apache SIS.</li>
+      </ul>
+      Une instance peut être créée par:
+      <ul>
+        <li><code>ProjectedCRS crs = new DefaultProjectedCRS(…)</code>, 
ou</li>
+        <li><code>ProjectedCRS crs = 
CRSFactory.createProjectedCRS(…)</code>.</li>
+      </ul>
+      Les deux approches attendent les mêmes arguments (omis dans cet 
exemple).
+    </div>
+    <p>
+      Dans la configuration par défaut de Apache SIS,
+      utiliser <code>CRSFactory.createXXX(…)</code> ou <code>new 
DefaultXXX(…)</code> revient presque au même
+      excepté que les <code>Factory</code> peuvent retourner des instances 
existantes
+      plutôt que de créer systématiquement de nouvelles instances,
+      et que les exceptions en cas d’arguments invalides sont de types 
différents.
+      Dans des configurations plus avancées, l’usage des 
<code>Factory</code> permet de
+      <a href="#ServiceLoader">réduire la dépendance directe d’une 
application envers SIS</a>
+      et de permettre une inversion de contrôle.
+    </p><p>
+      Le préfix « <code>General</code> » est parfois utilisé à la place 
de « <code>Default</code> »
+      afin de signaler que des implémentations alternatives existent pour des 
cas spécifiques.
+      Par exemple l’interface <code>Envelope</code> est implémentée par au 
moins deux classes de Apache SIS:
+      <code>GeneralEnvelope</code> et <code>Envelope2D</code>.
+      La première implémentation peut représenter des enveloppes de 
n’importe quelle dimension
+      alors que la seconde implémentation est spécialisée pour les 
enveloppes à deux dimensions.
+    </p><p>
+      Les classes de Apache SIS qui sont préfixées par « 
<code>Abstract</code> » ne doivent pas – en principe – être 
instanciées.
+      Il faut plutôt instancier une sous-classe non-abstraites.
+      Toutefois plusieurs classes de SIS ne sont abstraites que 
conceptuellement,
+      sans que la définition de la classe ne contienne le mot-clé 
<code>abstract</code> du Java.
+      Ces classes peuvent être instanciées par l’instruction <code>new 
AbstractXXX(…)</code>
+      – mais pas par les <code>Factory</code> – malgré qu’elles 
soient conceptuellement abstraites.
+      Mais ces instanciations ne devraient être faites qu’en dernier 
recours,
+      lorsqu’il n’est vraiment pas possible de déterminer le sous-type 
exact.
     </p>
   </body>
 </html>


Reply via email to