sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1814366 [3/4] - in /sis/site/trunk/book: en/ en/annex/ en/annexes/ en/annexes/design/ en/annexes/geoapi/ en/annexes/tests/ en/introduction/ fr/ fr/annex/ fr/annexes/ fr/annexes/design/ fr/annexes/geoapi/ fr/annexes/tests/ fr/introduction/
Date Sun, 05 Nov 2017 18:04:33 GMT
Copied: sis/site/trunk/book/fr/annexes/design/AffineTransform.html (from r1814233, sis/site/trunk/book/fr/annex/DesignNotes.html)
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/fr/annexes/design/AffineTransform.html?p2=sis/site/trunk/book/fr/annexes/design/AffineTransform.html&p1=sis/site/trunk/book/fr/annex/DesignNotes.html&r1=1814233&r2=1814366&rev=1814366&view=diff
==============================================================================
--- sis/site/trunk/book/fr/annex/DesignNotes.html [UTF-8] (original)
+++ sis/site/trunk/book/fr/annexes/design/AffineTransform.html [UTF-8] Sun Nov  5 18:04:32 2017
@@ -24,7 +24,7 @@
   <head>
     <title>DesignNotes</title>
     <meta charset="UTF-8"/>
-    <link rel="stylesheet" type="text/css" href="../../../content/book/book.css"/>
+    <link rel="stylesheet" type="text/css" href="../../../../content/book/book.css"/>
   </head>
   <body>
     <!--
@@ -33,12 +33,8 @@
     -->
     <section>
       <header>
-        <h2 id="DesignNotes">Notes de design</h2>
+        <h2 id="AffineTransform">Utilisation des transformations affines</h2>
       </header>
-      <p>Les chapitres suivants expliquent les raisons derrières certains choix d’implémentation de Apache <abbr>SIS</abbr>.</p>
-
-
-      <h3 id="AffineTransform">Utilisation des transformations affines</h3>
       <p>
         Parmi les sortes d’opérations qu’un <abbr>SIG</abbr> doit effectuer sur les coordonnées spatiales,
         les <cite>transformations affines</cite> sont à la fois relativement simples et très fréquentes.
@@ -83,11 +79,11 @@
           où <var>N</var><sub><var>x</var></sub> est la largeur
           et <var>N</var><sub><var>y</var></sub> la hauteur de l’image en nombre de pixels.
         </p><p>
-          <xi:include href="../../math/PixelToGeographicTerms.html"/>
+          <xi:include href="../../../math/PixelToGeographicTerms.html"/>
         </p><p>
           Les équations ci-dessus peuvent être représentées sous forme de matrices comme ci-dessous:
         </p><p>
-        <xi:include href="../../math/PixelToGeographic.html"/>
+        <xi:include href="../../../math/PixelToGeographic.html"/>
         </p><p>
           Dans ce cas particulier, les facteurs d’échelles <var>S</var> correspondent à la taille des pixels en degrés
           et les termes de translations <var>T</var> correspondent aux coordonnées géographiques d’un coin de l’image
@@ -112,13 +108,13 @@
           <th>Conversion initiale</th><th></th>
           <th>Opérations combinées</th>
         </tr><tr>
-          <td style="vertical-align: middle"><xi:include href="../../math/AxisSwapping2D.html"/></td>
+          <td style="vertical-align: middle"><xi:include href="../../../math/AxisSwapping2D.html"/></td>
           <td style="vertical-align: middle; padding-left: 15px; padding-right: 15px">×</td>
-          <td style="vertical-align: middle"><xi:include href="../../math/InverseAxisY.html"/></td>
+          <td style="vertical-align: middle"><xi:include href="../../../math/InverseAxisY.html"/></td>
           <td style="vertical-align: middle; padding-left: 15px; padding-right: 15px">×</td>
-          <td style="vertical-align: middle"><xi:include href="../../math/PixelToGeographicSameAxisDirections.html"/></td>
+          <td style="vertical-align: middle"><xi:include href="../../../math/PixelToGeographicSameAxisDirections.html"/></td>
           <td style="vertical-align: middle; padding-left: 15px; padding-right: 15px">=</td>
-          <td style="vertical-align: middle"><xi:include href="../../math/PixelToGeographicReverseOrderAndY.html"/></td>
+          <td style="vertical-align: middle"><xi:include href="../../../math/PixelToGeographicReverseOrderAndY.html"/></td>
         </tr></table>
         <p>
           Un principe clé est qu’il n’y a pas besoin d’écrire un code dédié à ce type d’opérations sur les axes.
@@ -130,7 +126,7 @@
         </p>
       </div>
 
-      <h4 id="AffineTransformAPI">Intégration avec les bibliothèques graphiques</h4>
+      <h3 id="AffineTransformAPI">Intégration avec les bibliothèques graphiques</h3>
       <p>
         A peu près toutes les bibliothèques graphiques supportent une forme de transformation de coordonnées,
         souvent les <cite>transformations affines</cite> ou une légère généralisation.
@@ -172,127 +168,6 @@ if (mt instanceof AffineTransform) {
         Le forçage de type ci-haut n’est pas garantit de réussir, même si l’instance de
         <code>MathTransform</code> répond aux conditions qui devrait permettre un usage de Java2D.
       </p>
-
-
-      <h3 id="MatrixLibrary">Particularités d’une bibliothèque de calculs matriciels pour un <abbr>SIG</abbr></h3>
-      <p>
-        Les <abbr>SIG</abbr> font un usage intensif de matrices afin d’afficher leurs cartes ou transformer des coordonnées.
-        On pourrait croire que le marché est suffisamment bien pourvu en excellentes bibliothèques de calculs matriciels, libres ou commerciales.
-        Pourtant, les <abbr>SIG</abbr> ont des besoins spécifiques qui divergent un peu des objectifs de plusieurs bibliothèques existantes.
-        Des manipulations de matrices comme celles décrites dans <a href="#AffineTransform">le chapitre sur les transformations affines</a>
-        interviennent dans quasiment toutes les opérations appliquées par Apache <abbr>SIS</abbr> sur des coordonnées.
-        Mais l’analyse de ces opérations révèle quelques patterns:
-      </p>
-      <ul>
-        <li><p>Ces matrices sont presque toujours de petites tailles, dépassant rarement 5 lignes par 5 colonnes.</p></li>
-        <li><p>Les opérations matricielles « lourdes » (multiplications ou inversions de matrices) ne surviennent pas dans des endroits où la performance est importante.
-            Dans la quasi-totalité des cas, elles ne sont effectuées qu’une fois pour toute, à la lecture d’un fichier,
-            ou lors des étapes de préparation avant de convertir des coordonnées.
-            Elles ne surviennent quasiment jamais dans la boucle convertissant chacune des coordonnées.</p></li>
-        <li><p>Dans une succession de multiplications et d’inversions de matrices, les erreurs d’arrondissement s’accumulent et grandissent rapidement
-            au point de se confondre avec certaines opérations légitimes, notamment les changements de référentiel.
-            Ces dernières s’expriment souvent par un changement de la taille, position et orientation de l’ellipsoïde
-            choisi comme approximation de la forme de la Terre.
-            Or ces changements de taille s’expriment en parties par million et les rotations en arc-secondes.
-            Retranscrites dans une matrice, ces valeurs sont donc assez petites.</p></li>
-        <li><p>Il arrive fréquemment que des matrices s’annulent en tout ou en partie lorsqu’elles sont combinées,
-            c’est-à-dire que leurs multiplications ramènent des facteurs d’échelles à 1 et des translations à 0.
-            Toutefois les erreurs d’arrondissements font que les valeurs obtenues sont rarement exactes,
-            mais plutôt des valeurs s’en rapprochant telles que 0,9999…97 à la place de 1.
-            L’approche habituelle pour contourner ce problème est d’effectuer les comparaisons de nombres à virgule flottante en tolérant un léger écart.
-            Mais il est difficile de choisir un seuil de tolérance qui gommera la plupart des erreurs d’arrondissement
-            sans considérer à tord un changement de référentiel comme un artefact (voir point précédent).</p></li>
-      </ul>
-      <p>
-        Ces points font que, pour un <abbr>SIG</abbr> comme Apache <abbr>SIS</abbr>, la précision d’une bibliothèque de calculs matriciels
-        est plus importante que la performance. Paradoxalement, un bon moyen de gagner en performance est justement d’investir davantage de temps de CPU
-        pour effectuer des opérations matricielles plus précises dans la phase de <em>préparation</em> (non d’<em>exécution</em>) de la transformation de coordonnées,
-        car on augmente ainsi les chances de détecter correctement quelles opérations s’annulent.
-        L’effort investit dans cette détection permet de sauver du temps là où ça compte: quand viendra le moment de boucler sur des millions de coordonnées à transformer.
-      </p><p>
-        Mais les bibliothèques dédiées aux calculs matriciels sont souvent conçues pour opérer de manière très performante
-        sur des matrices de grandes tailles, ayant par exemple des milliers de lignes et colonnes.
-        Elles sont ainsi conçues pour être capable de résoudre efficacement des systèmes d’équations linéaires comportant des centaines d’inconnues.
-        Les problèmes qu’elles résolvent sont certes difficiles, mais assez différents de ceux qui intéressent Apache <abbr>SIS</abbr>.
-        Pour cette raison, et aussi à cause d’un autre besoin spécifique détaillé dans les paragraphes suivants,
-        Apache <abbr>SIS</abbr> utilise ses propres fonctions de calculs matriciels.
-        Ces fonctions tentent de résoudre le problème de précision en utilisant l’arithmétique « double-double »
-        (une technique permettant de simuler une précision d’environ 120 bits)
-        au prix de la performance pendant une étape (la <em>préparation</em> de la transformation) où elle n’est pas jugée critique.
-      </p>
-
-      <h4 id="NonSquareMatrix">Que faire des matrices qui ne sont pas carrées (et pourquoi)</h4>
-      <p>
-        Apache <abbr>SIS</abbr> a très souvent besoin d’inverser des matrices,
-        afin d’obtenir une conversion de coordonnées dans la direction inverse de la conversion originale.
-        Mais on n’inverse habituellement que des matrices carrées.
-        Or, <abbr>SIS</abbr> a besoin d’effectuer des inversions de matrices non-carrées.
-        Selon que l’on ait plus de lignes ou plus de colonnes:
-      </p>
-      <ul>
-        <li>Pour <abbr>SIS</abbr>, une matrice non-carrée est une conversion qui ajoute ou supprime une dimension aux coordonnées.</li>
-        <li>Pour les bibliothèques d’algèbre linéaire, une matrice non-carrée est un système d’équations sous-déterminé ou surdéterminé.</li>
-      </ul>
-      <p>
-        Pour mieux comprendre les difficultés que causerait une transposition trop directe des bibliothèques d’algèbre linéaire aux <abbr>SIG</abbr>,
-        imaginons une conversion (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>) → (<var>φ₂</var>, <var>λ₂</var>)
-        qui projetterait les points d’un espace 3D vers une surface 2D.
-        Les termes <var>φ</var> sont des latitudes, <var>λ</var> des longitudes et
-        (<var>φ₂</var>, <var>λ₂</var>) n’égale pas forcement (<var>φ₁</var>, <var>λ₁</var>) si la hauteur <var>h</var> n’est pas perpendiculaire à la surface.
-      </p><p>
-        <xi:include href="../../math/Geographic3Dto2D.html"/>
-      </p><p>
-        Pour des bibliothèques d’algèbre linéaire, la matrice ci-dessus représente un système d’équations sous-déterminé, et donc insoluble.
-        C’est-à-dire qu’on ne peut pas inverser cette conversion pour obtenir (<var>φ₂</var>, <var>λ₂</var>) → (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>)
-        puisqu’on ne sait pas quelle valeur donner à <var>h</var>,
-        ce qui implique qu’on ne peut pas trouver (<var>φ₁</var>, <var>λ₁</var>) non-plus car ces valeurs dépendent peut-être de <var>h</var>.
-        Toutefois dans le cas des <abbr>SIG</abbr>, l’axe des hauteurs ellipsoïdales <var>h</var> est perpendiculaire à la surface de l’ellipsoïde
-        sur laquelle les latitudes et longitudes <em>géodésiques</em> (<var>φ</var>, <var>λ</var>) sont représentées
-        (notez que cette affirmation ne s’applique pas aux latitudes et longitudes <em>géocentriques</em>).
-        Cette perpendicularité rend <var>φ₁</var> et <var>λ₁</var> indépendants de <var>h</var>.
-        Dans ce genre de cas, on peut encore sauver les meubles.
-      </p><p>
-        Apache <abbr>SIS</abbr> procède en vérifiant si les valeurs de <var>h</var> sont indépendantes des valeurs de <var>φ</var> et <var>λ</var>.
-        Nous reconnaissons ce cas en vérifiant quels coefficients de la matrice ont la valeur zéro.
-        Si <abbr>SIS</abbr> arrive à identifier des dimensions indépendantes,
-        il peut les exclure temporairement de manière à inverser sans ambiguïté la conversion dans les dimensions restantes.
-        S’il ne trouve pas de dimension indépendante, alors une exception est levée.
-        Mais si une inversion a été possible, alors il reste à décider du sort des dimensions que <abbr>SIS</abbr> avait temporairement exclues.
-        Par défaut, <abbr>SIS</abbr> assignera la valeur <code>NaN</code> (<cite>Not-a-Number</cite>) à ces dimensions.
-        Toutefois dans le cas particulier des hauteurs ellipsoïdales <var>h</var> dans une opération (<var>φ₂</var>, <var>λ₂</var>) → (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>),
-        la valeur zéro peut aussi être appropriée dans l’hypothèse où les coordonnées sont habituellement proches de la surface de l’ellipsoïde.
-        Mais dans tous les cas, le choix du coefficient à mettre à 0 ou <code>NaN</code> est basé sur la présomption que la matrice représente une transformation affine.
-        Ce n’est pas une opération qui peut être effectuée sur des matrices arbitraires.
-      </p><p>
-        Le traitement particulier décrit ci-haut permet à Apache <abbr>SIS</abbr> de résoudre
-        certains systèmes d’équations sous-déterminés que l’on rencontre couramment dans les <abbr>SIG</abbr>.
-        Dans notre exemple utilisant <code>NaN</code> comme valeur par défaut, la coordonnée <var>h</var> reste inconnue
-        – nous ne faisons pas surgir de l’information du néant – mais au moins les coordonnées (<var>φ</var>, <var>λ</var>) ont pu être récupérées.
-        Le problème inverse, celui des systèmes surdéterminés, est plus subtil.
-        Une approche classique des bibliothèques d’algèbre linéaire est de résoudre les systèmes surdéterminés par la méthode des moindres carrées.
-        Transposée à notre exemple, cette approche proposerait une conversion (<var>φ₂</var>, <var>λ₂</var>, <var>h</var>) → (<var>φ₁</var>, <var>λ₁</var>)
-        qui semble le meilleur compromis pour diverses valeurs de <var>φ₂</var>, <var>λ₂</var> et <var>h</var>,
-        tout en n’étant (sauf cas particuliers) une solution exacte pour personne.
-        De plus, les éventuelles combinaisons linéaires entre ces trois variables sont délicates compte tenu de l’hétérogénéité des unités de mesures,
-        avec par exemple les <var>h</var> en mètres et (<var>φ</var>, <var>λ</var>) en degrés.
-        Apache <abbr>SIS</abbr> procède plutôt comme pour les systèmes sous-déterminés: en exigeant que certaines dimensions soient indépendantes des autres,
-        faute de quoi la matrice sera considérée non-inversible.
-        En conséquence dans le cas des systèmes surdéterminés <abbr>SIS</abbr> refusera d’effectuer certaines opérations que les bibliothèques d’algèbre linéaire auraient faite,
-        mais en cas de succès les conversions obtenues seront garanties exactes (aux erreurs d’arrondissement prêts).
-      </p>
-
-      <h4 id="MatrixLibrarySummary">La bibliothèque matricielle de Apache <abbr>SIS</abbr></h4>
-      <p>
-        En résumé, les besoins qui ont amené Apache <abbr>SIS</abbr> à fournir ses propres fonctions de calculs matriciels sont:
-      </p>
-      <ul>
-        <li>Structure légère pour les petites matrices, particulièrement celles de taille 3×3.</li>
-        <li>Précision accrue avec l’arithmétique « double-double », quitte à sacrifier un peu de performance dans des endroits où elle n’est pas critique.</li>
-        <li>Traitement particulier de l’inversion des matrices non-carrées pour des conversions de coordonnées.</li>
-      </ul>
-      <p>
-        Cette bibliothèque est fournie dans le paquet <code>org.apache.sis.matrix</code> du module <code>sis-referencing</code>.
-      </p>
     </section>
   </body>
 </html>

Copied: sis/site/trunk/book/fr/annexes/design/MatrixLibrary.html (from r1814233, sis/site/trunk/book/fr/annex/DesignNotes.html)
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/fr/annexes/design/MatrixLibrary.html?p2=sis/site/trunk/book/fr/annexes/design/MatrixLibrary.html&p1=sis/site/trunk/book/fr/annex/DesignNotes.html&r1=1814233&r2=1814366&rev=1814366&view=diff
==============================================================================
--- sis/site/trunk/book/fr/annex/DesignNotes.html [UTF-8] (original)
+++ sis/site/trunk/book/fr/annexes/design/MatrixLibrary.html [UTF-8] Sun Nov  5 18:04:32 2017
@@ -24,7 +24,7 @@
   <head>
     <title>DesignNotes</title>
     <meta charset="UTF-8"/>
-    <link rel="stylesheet" type="text/css" href="../../../content/book/book.css"/>
+    <link rel="stylesheet" type="text/css" href="../../../../content/book/book.css"/>
   </head>
   <body>
     <!--
@@ -33,148 +33,8 @@
     -->
     <section>
       <header>
-        <h2 id="DesignNotes">Notes de design</h2>
+        <h2 id="MatrixLibrary">Particularités d’une bibliothèque de calculs matriciels pour un <abbr>SIG</abbr></h2>
       </header>
-      <p>Les chapitres suivants expliquent les raisons derrières certains choix d’implémentation de Apache <abbr>SIS</abbr>.</p>
-
-
-      <h3 id="AffineTransform">Utilisation des transformations affines</h3>
-      <p>
-        Parmi les sortes d’opérations qu’un <abbr>SIG</abbr> doit effectuer sur les coordonnées spatiales,
-        les <cite>transformations affines</cite> sont à la fois relativement simples et très fréquentes.
-        Les transformations affines peuvent représenter n’importe quelle combinaison d’échelles, de cisaillements,
-        de retournements, de rotations ou de translations, qui sont toutes des <cite>opérations linéaires</cite>.
-        Les transformations affines ne peuvent pas effectuer des opérations <cite>non-linéaires</cite>
-        telles que les projections cartographiques, mais couvrent néanmoins de nombreux autres cas:
-      </p>
-      <ul>
-        <li>Changer l’ordre des axes,        par exemple de (<var>latitude</var>, <var>longitude</var>) vers (<var>longitude</var>, <var>latitude</var>).</li>
-        <li>Changer la direction des axes,   par exemple l’axe des <var>y</var> qui pointe habituellement vers le bas dans les images.</li>
-        <li>Changer le méridien d’origine,   par exemple du méridien de <cite>Paris</cite> vers celui de <cite>Greenwich</cite>.</li>
-        <li>Changer le nombre de dimensions, par exemple passer des coordonnées 3D vers 2D en supprimant la hauteur.</li>
-        <li>Convertir des unités de mesures, par exemple convertir des pieds en mètres.</li>
-        <li>Convertir des coordonnées pixels en coordonnées géographiques,
-            par exemple la conversion exprimée dans les fichiers <code>.tfw</code> qui accompagnent certaines images <abbr>TIFF</abbr>.</li>
-        <li>Prendre en charge une petite partie des projections cartographiques,
-            par exemple les paramètres <cite>False Easting</cite>, <cite>False Northing</cite> et <cite>Scale factor</cite>.</li>
-      </ul>
-      <p>
-        Les transformations affines peuvent se combiner efficacement.
-        Peu importe le nombre de transformations affines que l’on enchaîne, le résultat sera exprimable par une seule transformation affine.
-        Cette propriété est plus facilement visible lorsque les transformations affines sont exprimées sous forme de matrices:
-        pour combiner les opérations, il suffit de multiplier les matrices.
-        Le cas des conversions des coordonnées pixels en coordonnées géographiques ci-dessous donne un exemple.
-      </p>
-
-      <div class="example">
-        <p><b>Exemple:</b>
-          supposons que nous disposons d’une image dont les coordonnées des pixels sont représentées par (<var>x</var>,<var>y</var>).
-          Supposons aussi que les contraintes suivantes sont respectées:
-        </p>
-        <ul>
-          <li>Il n’y a ni cisaillement, ni rotation, ni retournement de l’image.</li>
-          <li>Tous les pixels ont la même largeur en degrés de longitude.</li>
-          <li>Tous les pixels ont la même hauteur en degrés de latitude.</li>
-          <li>Les coordonnées des pixels commencent à (0,0) inclusivement.</li>
-        </ul>
-        <p>Alors la conversion des coordonnées pixels (<var>x</var>,<var>y</var>)
-          vers les coordonnées géographiques (<var>λ</var>,<var>φ</var>)
-          peut être représentée par les équations suivantes,
-          où <var>N</var><sub><var>x</var></sub> est la largeur
-          et <var>N</var><sub><var>y</var></sub> la hauteur de l’image en nombre de pixels.
-        </p><p>
-          <xi:include href="../../math/PixelToGeographicTerms.html"/>
-        </p><p>
-          Les équations ci-dessus peuvent être représentées sous forme de matrices comme ci-dessous:
-        </p><p>
-        <xi:include href="../../math/PixelToGeographic.html"/>
-        </p><p>
-          Dans ce cas particulier, les facteurs d’échelles <var>S</var> correspondent à la taille des pixels en degrés
-          et les termes de translations <var>T</var> correspondent aux coordonnées géographiques d’un coin de l’image
-          (pas nécessairement le coin inférieur gauche si certains axes ont été retournés).
-          Cette interprétation directe n’est possible que lorsque les contraintes énumérées plus haut sont respectées.
-          Les coefficients des matrices deviennent plus complexes si l’image a un cisaillement ou une rotation,
-          ou si les coordonnées des pixels ne commencent pas à (0,0).
-          Toutefois il n’est pas nécessaire d’utiliser des équations plus complexes pour gérer des cas plus génériques.
-          L’exemple ci-dessous prend comme point de départ la matrice d’une « conversion initiale »
-          dans laquelle les coefficients <var>S</var> et <var>T</var> sont les valeurs relativement simples données ci-dessus.
-          Ensuite la direction de l’axe des <var>y</var> est inversée de manière à correspondre
-          à la convention habituelle des systèmes de coordonnées des images (changement 1),
-          et les axes sont intervertis de manière à avoir la latitude avant la longitude (changement 2).
-          Notez que les concaténations de transformations affines écrites sous forme de multiplications matricielles
-          se lisent de droite à gauche:
-          <var>A</var>×<var>B</var>×<var>C</var> est équivalent à d’abord appliquer l’opération <var>C</var>,
-          suivit de l’opération <var>B</var> et finalement l’opération <var>A</var>.
-        </p>
-        <table class="hidden"><tr>
-          <th>Changement 2</th><th></th>
-          <th>Changement 1</th><th></th>
-          <th>Conversion initiale</th><th></th>
-          <th>Opérations combinées</th>
-        </tr><tr>
-          <td style="vertical-align: middle"><xi:include href="../../math/AxisSwapping2D.html"/></td>
-          <td style="vertical-align: middle; padding-left: 15px; padding-right: 15px">×</td>
-          <td style="vertical-align: middle"><xi:include href="../../math/InverseAxisY.html"/></td>
-          <td style="vertical-align: middle; padding-left: 15px; padding-right: 15px">×</td>
-          <td style="vertical-align: middle"><xi:include href="../../math/PixelToGeographicSameAxisDirections.html"/></td>
-          <td style="vertical-align: middle; padding-left: 15px; padding-right: 15px">=</td>
-          <td style="vertical-align: middle"><xi:include href="../../math/PixelToGeographicReverseOrderAndY.html"/></td>
-        </tr></table>
-        <p>
-          Un principe clé est qu’il n’y a pas besoin d’écrire un code dédié à ce type d’opérations sur les axes.
-          Ces opérations, et bien d’autres, sont prises en compte naturellement par l’algèbre matricielle.
-          On y gagne en généricité du code et en performance.
-          Apache <abbr>SIS</abbr> suit ce principe en utilisant les tranformations affine pour toutes les opérations
-          où elles peuvent s’appliquer.
-          Il n’y a par exemple aucun code dédié au changement de l’ordre des ordonnées dans une coordonnée.
-        </p>
-      </div>
-
-      <h4 id="AffineTransformAPI">Intégration avec les bibliothèques graphiques</h4>
-      <p>
-        A peu près toutes les bibliothèques graphiques supportent une forme de transformation de coordonnées,
-        souvent les <cite>transformations affines</cite> ou une légère généralisation.
-        Chaque bibliothèque défini son propre <abbr>API</abbr>.
-        Quelques exemples sont:
-      </p>
-      <table>
-        <caption>Implémentations des transformations affines dans des bibliothèques graphiques</caption>
-        <tr><th>Bibliothèque</th>                             <th>Implementation de la transformation</th>               <th>Dimensions</th></tr>
-        <tr><td>Java2D</td>                                   <td><code>java.awt.geom.AffineTransform</code></td>        <td>2</td></tr>
-        <tr><td>Java3D</td>                                   <td><code>javax.media.j3d.Transform3D</code></td>          <td>3</td></tr>
-        <tr><td>JavaFX</td>                                   <td><code>javafx.scene.transform.Affine</code></td>        <td>2 ou 3</td></tr>
-        <tr><td>Java Advanced Imaging (<abbr>JAI</abbr>)</td> <td><code>javax.media.jai.PerspectiveTransform</code></td> <td>2</td></tr>
-        <tr><td>Android</td>                                  <td><code>android.graphics.Matrix</code></td>              <td>2</td></tr>
-      </table>
-      <p>
-        Toutefois dans plusieurs cas, les transformations affines sont les seuls types d’opérations supportées par la bibliothèque graphique.
-        Apache <abbr>SIS</abbr> a besoin de gérer un plus grand nombre de type d’opérations,
-        parmi lesquelles les transformations affines ne sont que des cas particuliers.
-        Les projections cartographiques et les changements de référentiels notamment,
-        ne peuvent pas être représentés par des transformations affines.
-        <abbr>SIS</abbr> a aussi besoin de transformer des points ayant un nombre arbitraire de dimensions,
-        alors que les <abbr>API</abbr> cités ci-haut restreignent leur usage à un nombre fixe de dimensions.
-        Pour ces raisons, <abbr>SIS</abbr> ne peut pas utiliser directement ces <abbr>API</abbr>.
-        <abbr>SIS</abbr> utilise plutôt une interface plus abstraite, <code>org.opengis.referencing.transform.MathTransform</code>.
-        Mais dans le cas particulier où la transformation est réellement affine, <abbr>SIS</abbr> peut essayer d’utiliser
-        une implémentation existante, surtout Java2D.
-        Par exemple le code suivant peut être utilisé dans les situations où un objet Java2D est désiré:
-      </p>
-
-<pre><code>MathTransform mt = ...;    // N’importe quelle instance créée par Apache SIS.
-if (mt instanceof AffineTransform) {
-    AffineTransform at = (AffineTransform) mt;
-    // Utiliser l’API de Java2D API à partir d’ici.
-}</code></pre>
-
-      <p>
-        Toutefois <abbr>SIS</abbr> n’utilisera Java2D que sur une base opportuniste.
-        Le forçage de type ci-haut n’est pas garantit de réussir, même si l’instance de
-        <code>MathTransform</code> répond aux conditions qui devrait permettre un usage de Java2D.
-      </p>
-
-
-      <h3 id="MatrixLibrary">Particularités d’une bibliothèque de calculs matriciels pour un <abbr>SIG</abbr></h3>
       <p>
         Les <abbr>SIG</abbr> font un usage intensif de matrices afin d’afficher leurs cartes ou transformer des coordonnées.
         On pourrait croire que le marché est suffisamment bien pourvu en excellentes bibliothèques de calculs matriciels, libres ou commerciales.
@@ -221,7 +81,7 @@ if (mt instanceof AffineTransform) {
         au prix de la performance pendant une étape (la <em>préparation</em> de la transformation) où elle n’est pas jugée critique.
       </p>
 
-      <h4 id="NonSquareMatrix">Que faire des matrices qui ne sont pas carrées (et pourquoi)</h4>
+      <h3 id="NonSquareMatrix">Que faire des matrices qui ne sont pas carrées (et pourquoi)</h3>
       <p>
         Apache <abbr>SIS</abbr> a très souvent besoin d’inverser des matrices,
         afin d’obtenir une conversion de coordonnées dans la direction inverse de la conversion originale.
@@ -240,7 +100,7 @@ if (mt instanceof AffineTransform) {
         Les termes <var>φ</var> sont des latitudes, <var>λ</var> des longitudes et
         (<var>φ₂</var>, <var>λ₂</var>) n’égale pas forcement (<var>φ₁</var>, <var>λ₁</var>) si la hauteur <var>h</var> n’est pas perpendiculaire à la surface.
       </p><p>
-        <xi:include href="../../math/Geographic3Dto2D.html"/>
+        <xi:include href="../../../math/Geographic3Dto2D.html"/>
       </p><p>
         Pour des bibliothèques d’algèbre linéaire, la matrice ci-dessus représente un système d’équations sous-déterminé, et donc insoluble.
         C’est-à-dire qu’on ne peut pas inverser cette conversion pour obtenir (<var>φ₂</var>, <var>λ₂</var>) → (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>)
@@ -281,7 +141,7 @@ if (mt instanceof AffineTransform) {
         mais en cas de succès les conversions obtenues seront garanties exactes (aux erreurs d’arrondissement prêts).
       </p>
 
-      <h4 id="MatrixLibrarySummary">La bibliothèque matricielle de Apache <abbr>SIS</abbr></h4>
+      <h3 id="MatrixLibrarySummary">La bibliothèque matricielle de Apache <abbr>SIS</abbr></h3>
       <p>
         En résumé, les besoins qui ont amené Apache <abbr>SIS</abbr> à fournir ses propres fonctions de calculs matriciels sont:
       </p>

Copied: sis/site/trunk/book/fr/annexes/design/index.html (from r1814233, sis/site/trunk/book/fr/annex/Annexes.html)
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/fr/annexes/design/index.html?p2=sis/site/trunk/book/fr/annexes/design/index.html&p1=sis/site/trunk/book/fr/annex/Annexes.html&r1=1814233&r2=1814366&rev=1814366&view=diff
==============================================================================
--- sis/site/trunk/book/fr/annex/Annexes.html [UTF-8] (original)
+++ sis/site/trunk/book/fr/annexes/design/index.html [UTF-8] Sun Nov  5 18:04:32 2017
@@ -24,21 +24,21 @@
   <head>
     <title>Annexes</title>
     <meta charset="UTF-8"/>
-    <link rel="stylesheet" type="text/css" href="../../content/book/book.css"/>
+    <link rel="stylesheet" type="text/css" href="../../../../../content/book/book.css"/>
   </head>
   <body>
     <!--
-      Content below this point is copied in "../../content/book/fr/developer-guide.html"
+      Content below this point is copied in "(…)/content/book/fr/developer-guide.html"
       by the 'org.apache.sis.internal.book.Assembler' class in 'sis-build-helper' module.
     -->
     <section>
       <header>
-        <h1 id="Annexes">Annexes</h1>
+        <h1 id="DesignNotes">Notes de design</h1>
       </header>
+      <p>Les chapitres suivants expliquent les raisons derrières certains choix d’implémentation de Apache <abbr>SIS</abbr>.</p>
 
-      <xi:include href="ReduceDependency.html"/>
-      <xi:include href="Tests.html"/>
-      <xi:include href="DesignNotes.html"/>
+      <xi:include href="AffineTransform.html"/>
+      <xi:include href="MatrixLibrary.html"/>
     </section>
   </body>
 </html>

Copied: sis/site/trunk/book/fr/annexes/geoapi/DefinitionProcess.html (from r1814233, sis/site/trunk/book/fr/introduction/GeoAPI.html)
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/fr/annexes/geoapi/DefinitionProcess.html?p2=sis/site/trunk/book/fr/annexes/geoapi/DefinitionProcess.html&p1=sis/site/trunk/book/fr/introduction/GeoAPI.html&r1=1814233&r2=1814366&rev=1814366&view=diff
==============================================================================
--- sis/site/trunk/book/fr/introduction/GeoAPI.html [UTF-8] (original)
+++ sis/site/trunk/book/fr/annexes/geoapi/DefinitionProcess.html [UTF-8] Sun Nov  5 18:04:32 2017
@@ -24,99 +24,122 @@
   <head>
     <title>GeoAPI</title>
     <meta charset="UTF-8"/>
-    <link rel="stylesheet" type="text/css" href="../../../content/book/book.css"/>
+    <link rel="stylesheet" type="text/css" href="../../../../content/book/book.css"/>
   </head>
   <body>
     <!--
-      Content below this point is copied in "../../content/book/fr/developer-guide.html"
+      Content below this point is copied in "(…)/content/book/fr/developer-guide.html"
       by the 'org.apache.sis.internal.book.Assembler' class in 'sis-build-helper' module.
     -->
     <section>
       <header>
-        <h2 id="GeoAPI">Des modèles conceptuels vers des interfaces Java: GeoAPI</h2>
+        <h2 id="SpecificationToInterfaces">Des spécifications de l’<abbr>OGC</abbr> aux interfaces Java</h2>
       </header>
       <p>
-        Le projet <a href="http://www.geoapi.org">GeoAPI</a> offre un ensemble d’interfaces Java pour les applications géo-spatiales.
-        Dans une séries de paquets <code>org.opengis.*</code>, GeoAPI définit des structures représentant des méta-données,
-        des systèmes de référence des coordonnées, ainsi que des opérations effectuant des projections cartographiques.
-        Dans une partie qui n’est pas encore standardisée — dénommée <i>pending</i> — GeoAPI définit des structures
-        représentant des images géo-référencées, des géométries, des filtres pouvant s’appliquer à des requêtes, et d’autres fonctionnalités.
-        Ces interfaces suivent de très près les spécifications de l’<abbr>OGC</abbr>, tout en les interprétant et en les adaptant
-        de manière à répondre aux attentes des développeurs Java — par exemple en se conformant aux conventions de nommage.
-        Ces interfaces bénéficient à la fois aux applications clientes et aux bibliothèques:
+        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.
+        Il aurait été possible de générer automatiquement des interfaces Java à partir des standards de l’<abbr>OGC</abbr> à l’aide d’outils existants.
+        Par exemple 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>.
+        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>
-          Les développeurs des applications clientes bénéficient d’une plus grande base de connaissances disponible sur internet
-          (due aux nombreuses publications en lien avec les standards de l’<abbr>OGC</abbr>), ainsi que d’une interopérabilité accrue.
-          L’interopérabilité est facilitée par une meilleure séparation entre les applications qui <em>appellent</em> les fonctions de GeoAPI,
-          et les bibliothèques qui <em>implémentent</em> GeoAPI. Il s’agit d’une séparation similaire à celle qu’offrent les interfaces
-          <a href="http://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/"><abbr>JDBC</abbr></a> (<i>Java Database Connectivity</i>) du Java standard.
-          En utilisant l’<abbr>API</abbr> des interfaces, les développeurs peuvent faire abstraction de l’implémentation sous-jacente.
-          Par exemple ils peuvent effectuer des projections cartographiques à l’aide des bibliothèques
-          <a href="http://www.geoapi.org/geoapi-proj4/index.html">Proj.4</a> ou Apache <abbr>SIS</abbr>,
-          sans changer leurs programmes lorsqu’ils changent de bibliothèque.
-        </p></li>
-        <li><p>
-          Les développeurs des bibliothèques héritent de l’expertise des auteurs des spécifications, via les modèles que représentent les interfaces.
-          GeoAPI fournit aussi un cadre dans lequel les développeurs peuvent implémenter en priorité les fonctionnalité qui leurs sont le plus nécessaires,
-          tout en ayant des points où raccrocher les développements futurs.
-          Par exemple les clients peuvent appeler une fonction de GeoAPI même si elle n’est pas encore supportée par la bibliothèque,
-          quitte à obtenir une valeur nulle en attendant qu’une nouvelle version de la bibliothèque retourne une valeur intéressante.
-        </p></li>
-      </ul>
-
-      <details>
-        <summary>Pour en savoir plus sur les origines du projet GeoAPI</summary>
-        <article id="GeoAPI-history">
-          <header>
-            <h2>Historique du projet GeoAPI</h2>
-          </header>
+        <li>
           <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>.
+            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>
-        </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.
+          <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>
+      <p>
         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.
@@ -125,194 +148,6 @@
         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>
-            <h2>Des spécifications de l’<abbr>OGC</abbr> aux interfaces Java</h2>
-          </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">
-          <h2>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>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 explicites entre GeoAPI et les spécifications abstraites</h3>
@@ -333,17 +168,17 @@
 
 <pre><code>package <code class="GeoAPI">org.opengis.referencing.crs</code>;
 
-  /**
-   * 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>")
-  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>")
-      CartesianCS <code class="GeoAPI">getCoordinateSystem()</code>;
-  }</code></pre>
+/**
+ * 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>")
+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>")
+    CartesianCS <code class="GeoAPI">getCoordinateSystem()</code>;
+}</code></pre>
 
       <p>
         Les méthodes d’introspections du Java permettent d’accéder à ces informations pendant l’exécution d’une application.
@@ -549,54 +384,6 @@ System.out.println("Le nom standard du t
 MediumName usbKey = MediumName.<code class="GeoAPI">valueOf</code>("<code class="GeoAPI">USB_KEY</code>"); // Aucune constante n’existe pour cette valeur.
 assert MediumName.<code class="GeoAPI">valueOf</code>("<code class="GeoAPI">CD_ROM</code>")  == cdRom  : "valueOf doit retourner les constantes existantes.";
 assert MediumName.<code class="GeoAPI">valueOf</code>("<code class="GeoAPI">USB_KEY</code>") == usbKey : "valueOf doit cacher les valeurs précédemment demandées.";</code></pre>
-
-
-
-      <h3 id="GeoAPI-implementation">Implémentations fournies par Apache SIS</h3>
-      <p>
-        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>
     </section>
   </body>
 </html>



Mime
View raw message