sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1749179 - in /sis/site/trunk: book/en/annexes.html book/fr/annexes.html book/fr/referencing.html book/math/Geographic3Dto2D.html content/book/en/developer-guide.html content/book/fr/developer-guide.html
Date Sun, 19 Jun 2016 14:31:33 GMT
Author: desruisseaux
Date: Sun Jun 19 14:31:33 2016
New Revision: 1749179

URL: http://svn.apache.org/viewvc?rev=1749179&view=rev
Log:
Translate the chapter about matrix library and move into the annexes.

Added:
    sis/site/trunk/book/math/Geographic3Dto2D.html   (with props)
Modified:
    sis/site/trunk/book/en/annexes.html
    sis/site/trunk/book/fr/annexes.html
    sis/site/trunk/book/fr/referencing.html
    sis/site/trunk/content/book/en/developer-guide.html
    sis/site/trunk/content/book/fr/developer-guide.html

Modified: sis/site/trunk/book/en/annexes.html
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/en/annexes.html?rev=1749179&r1=1749178&r2=1749179&view=diff
==============================================================================
--- sis/site/trunk/book/en/annexes.html (original)
+++ sis/site/trunk/book/en/annexes.html Sun Jun 19 14:31:33 2016
@@ -20,7 +20,8 @@
   under the License.
 -->
 
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      xmlns:xi = "http://www.w3.org/2001/XInclude">
   <head>
     <title>Annexes</title>
     <link rel="stylesheet" type="text/css" href="../book.css"/>
@@ -365,5 +366,125 @@ public class MyTest extends Parameterize
         assertTrue(<code class="GeoAPI">transform</code> instanceof MathTransform2D);
     }
 }</pre>
+
+
+
+    <h2 id="DesignNote">Design notes</h2>
+    <p>Following chapters explain the rational behind some implementation choices done in Apache <abbr>SIS</abbr>.</p>
+
+    <h3 id="MatrixLibrary">Specificities of a matrix library for <abbr>GIS</abbr></h3>
+    <p>
+      <abbr>GIS</abbr> make an extensive usage of matrices for displaying maps or for transforming coordinates.
+      There is many excellent open source or commercial matrix libraries available.
+      However, <abbr>GIS</abbr> have some specific needs that differ a little bit from the goals of many existent libraries.
+      Matrix operations like those described in the <a href="#AffineTransform">affine transform chapter</a>
+      appear in almost all coordinate operations applied by Apache <abbr>SIS</abbr>.
+      But the analysis of those operations reveal some patterns:
+    </p>
+    <ul>
+      <li><p>Those matrices are almost always of small size, rarely more than 5 rows and 5 columns.</p></li>
+      <li><p>“Heavy” matrix operations (matrix inversions or multiplications) do not happen in performance-critical code.
+          In almost every cases, those heavy operations are executed only once, for example when a data file is read
+          or in preparation steps before to transform coordinates.
+          Those heavy operations rarely happen in the loop that apply the coordinate operation
+          after we finished to prepare it.</p></li>
+      <li><p>In a sequence of matrix multiplications or inversions, rounding errors accumulate and grow fast.
+          If the sequence of matrix operations is long enough,
+          rounding errors can become indistinguishable from real operations like datum shifts.
+          This ambiguity can happen because the matrix representation of some datum shifts has small values,
+          with scale factors of a few parts per million and rotation terms of a few arc-seconds.</p></li>
+      <li><p>It is quite common that two affine transforms cancel each other when they are concatenated, i.e.
+          that matrix multiplications result in some or all scale factors equal to 1 and some or all translation terms equal to 0.
+          However because of rounding errors the results are rarely exact, but are rather some values like 0,9999…97 instead of 1.
+          The usual workaround is to compare floating point numbers with some tolerance threshold.
+          Unfortunately it is difficult to choose a threshold that catch a wide range of rounding errors
+          without wrongly considering legitimate datum shifts as rounding errors (see previous point).</p></li>
+    </ul>
+    <p>
+      As a consequence of above points, accuracy of a matrix library is more important than performance for a <abbr>GIS</abbr> like Apache <abbr>SIS</abbr>.
+      Paradoxically, a good way to improve performance is to invest more CPU time for more accurate matrix operations
+      when <em>preparing</em> (not <em>executing</em>) the coordinate operation,
+      because it increases the chances to correctly detect which operations cancel each other.
+      This investment can save execution time at the place where it matters most:
+      in the code looping over millions of coordinates to transform.
+    </p><p>
+      However matrix libraries are often designed for high performances with large matrices, sometime containing thousands of rows and columns.
+      Those libraries can efficiently resolve systems of linear equations with hundreds of unknown variables.
+      Those libraries resolve difficult problems, but not of the same kind than the problems that Apache <abbr>SIS</abbr> needs to solve.
+      For that reason, and also for another reason described in next paragraphs, Apache <abbr>SIS</abbr> uses its own matrix implementation.
+      This implementation addresses the accuracy issue by using “double-double” arithmetic
+      (a technic for simulating the accuracy of approximatively 120 bits wide floating point numbers)
+      at the cost of performance in a phase (transform <em>preparation</em>) where performance is not considered critical.
+    </p>
+
+    <h4 id="NonSquareMatrix">What to do with non-square matrices (and why)</h4>
+    <p>
+      Apache <abbr>SIS</abbr> often needs to inverse matrices, in order to perform a coordinate operation in reverse direction.
+      Matrix inversions are typically performed on square matrices, but <abbr>SIS</abbr> also needs to inverse non-square matrices.
+      Depending on whether we have more lines than columns:
+    </p>
+    <ul>
+      <li>From Apache <abbr>SIS</abbr> library perspective, a non-square matrix is a coordinate operation that adds or removes a dimension.</li>
+      <li>From linear algebra libraries perspective, a non-square matrix is an under-determined or over-determined system of equations.</li>
+    </ul>
+    <p>
+      To illustrate the issues caused by direct use of libraries designed for linear algebra,
+      consider a (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>) → (<var>φ₂</var>, <var>λ₂</var>) conversion
+      from three-dimensional points to two-dimensional points on a surface.
+      The <var>φ</var> terms are latitudes, the <var>λ</var> terms are longitudes and
+      (<var>φ₂</var>, <var>λ₂</var>) may be different than (<var>φ₁</var>, <var>λ₁</var>) if <var>h</var> axis is not perpendicular to the surface.
+    </p><p>
+      <xi:include href="../math/Geographic3Dto2D.html"/>
+    </p><p>
+      For linear algebra libraries, the above non-square matrix represents an under-determined system of equations and may be considered unresolvable.
+      Indeed the above coordinate operation can not be inverted as a (<var>φ₂</var>, <var>λ₂</var>) → (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>)
+      operation because we do not know which value to assign to <var>h</var>.
+      Ignoring <var>h</var> implies that we can not assign values to (<var>φ₁</var>, <var>λ₁</var>) neither since those values may depend on <var>h</var>.
+      However in <abbr>GIS</abbr> case, the ellipsoidal <var>h</var> axis is perpendicular to the ellipsoid surface
+      on which the <em>geodetic</em> latitudes and longitudes (<var>φ</var>, <var>λ</var>) are represented
+      (note that this statement is not true for <em>geocentric</em> latitudes and longitudes).
+      This perpendicularity makes <var>φ₁</var> and <var>λ₁</var> independent of <var>h</var>.
+      In such cases, we can can still do some processing.
+    </p><p>
+      Apache <abbr>SIS</abbr> proceeds by checking if <var>h</var> values are independent of <var>φ</var> and <var>λ</var> values.
+      We identify such cases by checking which matrix coefficients are zero.
+      If <abbr>SIS</abbr> can identify independent dimensions, it can temporarily exclude those dimensions
+      and invert the matrix using only the remaining dimensions.
+      If <abbr>SIS</abbr> does not found a sufficient amount of independent dimensions, an exception is thrown.
+      But if a matrix inversion has been possible, then we need to decide which value to assign to the dimensions that <abbr>SIS</abbr> temporarily excluded.
+      By default, <abbr>SIS</abbr> assigns the <code>NaN</code> (<cite>Not-a-Number</cite>) value to those dimensions.
+      However in the particular case of ellipsoidal height <var>h</var> in a (<var>φ₂</var>, <var>λ₂</var>) → (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>) operation,
+      the zero value may also be appropriate on the assumption that the coordinates are usually close to the ellipsoid surface.
+      In any case, the coefficients that Apache <abbr>SIS</abbr> sets to zero or <code>NaN</code> is based on the assumption
+      that the matrix represents a coordinate operation; this is not something that can be done with arbitrary matrices.
+    </p><p>
+      The above-described approach allows Apache <abbr>SIS</abbr> to resolve some under-determined equation systems commonly found in <abbr>GIS</abbr>.
+      In our example using <code>NaN</code> as the default value, the <var>h</var> ordinate stay unknown – we do not create information from nothing –
+      but at least the (<var>φ</var>, <var>λ</var>) coordinates are preserved.
+      The opposite problem, those of over-determined equation systems, is more subtile.
+      An approach commonly applied by linear algebra libraries is to resolve over-determined systems by the least squares method.
+      Such method applied to our example would compute a (<var>φ₂</var>, <var>λ₂</var>, <var>h</var>) → (<var>φ₁</var>, <var>λ₁</var>) operation
+      that seems the best compromise for various <var>φ₂</var>, <var>λ₂</var> and <var>h</var> values,
+      while being (except special cases) an exact solution for no-one.
+      Furthermore linear combinations between those three variables may be an issue because of heterogenous units of measurement,
+      for instance with <var>h</var> in metres and (<var>φ</var>, <var>λ</var>) in degrees.
+      Apache <abbr>SIS</abbr> rather proceeds in the same way than for under-determined systems:
+      by requiring that some dimensions are independent from other dimensions, otherwise the matrix is considered non-invertible.
+      Consequently in over-determined systems case, <abbr>SIS</abbr> may refuse to perform some matrix inversions that linear algebra libraries can do,
+      but in case of success the resulting coordinate operation is guaranteed to be exact (ignoring rounding errors).
+    </p>
+
+    <h4 id="MatrixLibrarySummary">Apache <abbr>SIS</abbr> matrix library</h4>
+    <p>
+      In summary, Apache <abbr>SIS</abbr> provides its own matrix library for the following reasons:
+    </p>
+    <ul>
+      <li>Lightweight objects for small matrices, especially the 3×3 ones.</li>
+      <li>Improved accuracy with “double-double” arithmetic, accepting performance cost in codes where performance is not critical.</li>
+      <li>Special handling of non-square matrices on the assumption that those matrices represent coordinate operations.</li>
+    </ul>
+    <p>
+      This library is provided in the <code>org.apache.sis.matrix</code> package of the <code>sis-referencing</code> module.
+    </p>
   </body>
 </html>

Modified: sis/site/trunk/book/fr/annexes.html
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/fr/annexes.html?rev=1749179&r1=1749178&r2=1749179&view=diff
==============================================================================
--- sis/site/trunk/book/fr/annexes.html (original)
+++ sis/site/trunk/book/fr/annexes.html Sun Jun 19 14:31:33 2016
@@ -20,7 +20,8 @@
   under the License.
 -->
 
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"
+      xmlns:xi = "http://www.w3.org/2001/XInclude">
   <head>
     <title>Annexes</title>
     <link rel="stylesheet" type="text/css" href="../book.css"/>
@@ -372,5 +373,130 @@ public class MyTest extends Parameterize
         assertTrue(<code class="GeoAPI">transform</code> instanceof MathTransform2D);
     }
 }</pre>
+
+
+
+    <h2 id="DesignNote">Notes de design</h2>
+    <p>Les chapitres suivants expliquent les raisons derrières certains choix d'implémentation de Apache <abbr>SIS</abbr>.</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>
   </body>
 </html>

Modified: sis/site/trunk/book/fr/referencing.html
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/fr/referencing.html?rev=1749179&r1=1749178&r2=1749179&view=diff
==============================================================================
--- sis/site/trunk/book/fr/referencing.html (original)
+++ sis/site/trunk/book/fr/referencing.html Sun Jun 19 14:31:33 2016
@@ -373,121 +373,6 @@
       </p>
     </div>
 
-    <article>
-      <header>
-        <h1>Particularités d’une bibliothèque de calculs matriciels pour un <abbr>SIG</abbr></h1>
-      </header>
-      <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 l’exemple précédent 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. Les changements de la 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,
-            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.
-            Malheureusement, les erreurs d’arrondissement sont parfois telles qu’il est difficile de savoir
-            si certains coefficients de la matrices sont des artefacts ou proviennent d’un réel changement de référentiel.</p></li>
-      </ul>
-      <p>
-        Ces points font que, pour un <abbr>SIG</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, 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 dans une partie du code où elle n’est pas jugée critique.
-      </p>
-      <h2>Que faire des matrices qui ne sont pas carrées (et pourquoi)</h2>
-      <p>
-        Apache <abbr>SIS</abbr> a très souvent besoin d’inverser des matrices,
-        afin d’obtenir une conversion de coordonnées qui fasse le contraire de la conversion originale.
-        Mais on n’inverse habituellement que des matrices carrées.
-        Or, Apache <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 qui projetterait les points d’un espace 3D vers une surface 2D:
-      </p>
-      <table class="hidden">
-        <tr>
-          <td>(λ₁, φ₁, <var>h</var>) → (λ₂, φ₂)</td>
-          <td style="padding-left: 30px">où</td>
-          <td><ul style="margin-top: 0">
-            <li>λ est la longitude.</li>
-            <li>φ est la latitude.</li>
-            <li>(λ₂, φ₂) n’égale pas forcement (λ₁, φ₁) si la hauteur <var>h</var> n’est pas perpendiculaire à la surface.</li>
-          </ul></td>
-        </tr>
-      </table>
-      <p>
-        Pour des bibliothèques d’algèbre linéaire, la matrice représentant cette conversion serait 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>h</var>) puisqu’on ne sait pas quelle valeur donner à <var>h</var>,
-        ce qui implique qu’on ne peut pas trouver (λ₁, φ₁) non-plus car ces valeurs dépendent peut-être de <var>h</var>.
-        Toutefois, dans le cas des <abbr>SIG</abbr>, l’axe des <var>h</var> est très souvent perpendiculaire à la surface sur laquelle sont exprimées les coordonnées (<var>λ</var>,<var>φ</var>).
-        Cette perpendicularité rend λ₁ et φ₁ indépendants de <var>h</var>. Dans ce cas particulier, et ce cas seulement, on peut encore sauver les meubles.
-      </p><p>
-        Apache <abbr>SIS</abbr> procède en vérifiant si les coordonnées <var>h</var> sont indépendantes des coordonnées λ et φ.
-        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.
-      </p><p>
-        Si une inversion a été possible, alors il reste à décider du sort des dimensions que <abbr>SIS</abbr> avait temporairement exclues.
-        Dans notre exemple, <abbr>SIS</abbr> assignera la valeur <code>NaN</code> (<cite>Not-a-Number</cite>) aux valeurs de <var>h</var> dans la conversion (λ₂, φ₂) → (λ₁, φ₁, <var>h</var>).
-        Là encore, le choix du coefficient à mettre à <code>NaN</code> dans la matrice est basé sur la présomption qu’elle représente une conversion de coordonnées.
-      </p><p>
-        Le traitement particulier fait par <abbr>SIS</abbr> permet donc d’inverser des matrices que l’on rencontre couramment dans les <abbr>SIG</abbr>,
-        même si en principe le système est sous-déterminé.
-        Dans notre exemple 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.
-      </p><p>
-        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>h</var>) → (λ₁, φ₁)
-        qui semble le meilleur compromis pour diverses valeurs de λ₂, φ₂ 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,
-        où les <var>h</var> sont 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.
-        Dans le cas des systèmes surdéterminés <abbr>SIS</abbr> refusera donc d’effectuer certaines opérations que les bibliothèques d’algèbre linéaire auraient faite,
-        mais garantira que les conversions obtenues seront exactes (aux erreurs d’arrondissement prêts).
-      </p>
-      <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>
-    </article>
-
     <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,

Added: sis/site/trunk/book/math/Geographic3Dto2D.html
URL: http://svn.apache.org/viewvc/sis/site/trunk/book/math/Geographic3Dto2D.html?rev=1749179&view=auto
==============================================================================
--- sis/site/trunk/book/math/Geographic3Dto2D.html (added)
+++ sis/site/trunk/book/math/Geographic3Dto2D.html Sun Jun 19 14:31:33 2016
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Geographic 3D to 2D</title>
+    <link rel="stylesheet" type="text/css" href="../book.css"/>
+  </head>
+  <body>
+    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block" alttext="MathML capable browser required">
+      <mfenced open="[" close="]">
+        <mtable>
+          <mtr><mtd><msub><mi>φ</mi><mrow><mn>2</mn></mrow></msub></mtd></mtr>
+          <mtr><mtd><msub><mi>λ</mi><mrow><mn>2</mn></mrow></msub></mtd></mtr>
+          <mtr><mtd><mn>1</mn></mtd></mtr>
+        </mtable>
+      </mfenced>
+      <mo>=</mo>
+      <mfenced open="[" close="]">
+        <mtable>
+          <mtr>
+            <mtd><mn>1</mn></mtd>
+            <mtd><mn>0</mn></mtd>
+            <mtd><mn>0</mn></mtd>
+            <mtd><mn>0</mn></mtd>
+          </mtr>
+          <mtr>
+            <mtd><mn>0</mn></mtd>
+            <mtd><mn>1</mn></mtd>
+            <mtd><mn>0</mn></mtd>
+            <mtd><mn>0</mn></mtd>
+          </mtr>
+          <mtr>
+            <mtd><mn>0</mn></mtd>
+            <mtd><mn>0</mn></mtd>
+            <mtd><mn>0</mn></mtd>
+            <mtd><mn>1</mn></mtd>
+          </mtr>
+        </mtable>
+      </mfenced>
+      <mo>×</mo>
+      <mfenced open="[" close="]">
+        <mtable>
+          <mtr><mtd><msub><mi>φ</mi><mrow><mn>1</mn></mrow></msub></mtd></mtr>
+          <mtr><mtd><msub><mi>λ</mi><mrow><mn>1</mn></mrow></msub></mtd></mtr>
+          <mtr><mtd><mi>h</mi></mtd></mtr>
+          <mtr><mtd><mn>1</mn></mtd></mtr>
+        </mtable>
+      </mfenced>
+    </math>
+  </body>
+</html>

Propchange: sis/site/trunk/book/math/Geographic3Dto2D.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sis/site/trunk/book/math/Geographic3Dto2D.html
------------------------------------------------------------------------------
    svn:mime-type = text/html

Modified: sis/site/trunk/content/book/en/developer-guide.html
URL: http://svn.apache.org/viewvc/sis/site/trunk/content/book/en/developer-guide.html?rev=1749179&r1=1749178&r2=1749179&view=diff
==============================================================================
--- sis/site/trunk/content/book/en/developer-guide.html (original)
+++ sis/site/trunk/content/book/en/developer-guide.html Sun Jun 19 14:31:33 2016
@@ -83,7 +83,11 @@ Partially translated by <i>Christina Hou
 <li><a href="#GeoAPI-simple">Defining custom implementations</a></li></ul></li></ul></li>
 <li><a href="#Tests">Test suites</a><ul>
 <li><a href="#GeoAPI-validators">Instance validations</a></li>
-<li><a href="#GeoAPI-tests">Executing pre-defined tests</a></li></ul></li></ul></li>
+<li><a href="#GeoAPI-tests">Executing pre-defined tests</a></li></ul></li>
+<li><a href="#DesignNote">Design notes</a><ul>
+<li><a href="#MatrixLibrary">Specificities of a matrix library for GIS</a><ul>
+<li><a href="#NonSquareMatrix">What to do with non-square matrices (and why)</a></li>
+<li><a href="#MatrixLibrarySummary">Apache SIS matrix library</a></li></ul></li></ul></li></ul></li>
 </ul>
 </nav>
 
@@ -2741,7 +2745,11 @@ But when a <code class="OGC">nilReason</
 <li><a href="#GeoAPI-simple">Defining custom implementations</a></li></ul></li></ul></li>
 <li><a href="#Tests">Test suites</a><ul>
 <li><a href="#GeoAPI-validators">Instance validations</a></li>
-<li><a href="#GeoAPI-tests">Executing pre-defined tests</a></li></ul></li></ul></nav>
+<li><a href="#GeoAPI-tests">Executing pre-defined tests</a></li></ul></li>
+<li><a href="#DesignNote">Design notes</a><ul>
+<li><a href="#MatrixLibrary">Specificities of a matrix library for GIS</a><ul>
+<li><a href="#NonSquareMatrix">What to do with non-square matrices (and why)</a></li>
+<li><a href="#MatrixLibrarySummary">Apache SIS matrix library</a></li></ul></li></ul></li></ul></nav>
 <h2 id="ReduceDependency"><span class="section-number">7.1.</span> Reduce direct dependency to Apache SIS</h2>
 <p>
 Previous chapters used Apache SIS static methods for convenience.
@@ -3078,6 +3086,168 @@ However, this example adds a supplementa
         assertTrue(<code class="GeoAPI">transform</code> <b>instanceof</b> <code class="GeoAPI">MathTransform2D</code>);
     }
 }</pre>
+
+
+
+<h2 id="DesignNote"><span class="section-number">7.3.</span> Design notes</h2>
+<p>Following chapters explain the rational behind some implementation choices done in Apache <abbr title="Spatial Information System">SIS</abbr>.</p>
+
+<h3 id="MatrixLibrary"><span class="section-number">7.3.1.</span> Specificities of a matrix library for <abbr>GIS</abbr></h3>
+<p>
+<abbr>GIS</abbr> make an extensive usage of matrices for displaying maps or for transforming coordinates.
+There is many excellent open source or commercial matrix libraries available.
+However, <abbr>GIS</abbr> have some specific needs that differ a little bit from the goals of many existent libraries.
+Matrix operations like those described in the <a href="#AffineTransform">affine transform chapter</a>
+appear in almost all coordinate operations applied by Apache <abbr title="Spatial Information System">SIS</abbr>.
+But the analysis of those operations reveal some patterns:
+</p>
+<ul>
+<li><p>Those matrices are almost always of small size, rarely more than 5 rows and 5 columns.</p></li>
+<li><p>“Heavy” matrix operations (matrix inversions or multiplications) do not happen in performance-critical code.
+In almost every cases, those heavy operations are executed only once, for example when a data file is read
+or in preparation steps before to transform coordinates.
+Those heavy operations rarely happen in the loop that apply the coordinate operation
+after we finished to prepare it.</p></li>
+<li><p>In a sequence of matrix multiplications or inversions, rounding errors accumulate and grow fast.
+If the sequence of matrix operations is long enough,
+rounding errors can become indistinguishable from real operations like datum shifts.
+This ambiguity can happen because the matrix representation of some datum shifts has small values,
+with scale factors of a few parts per million and rotation terms of a few arc-seconds.</p></li>
+<li><p>It is quite common that two affine transforms cancel each other when they are concatenated, i.e.
+that matrix multiplications result in some or all scale factors equal to 1 and some or all translation terms equal to 0.
+However because of rounding errors the results are rarely exact, but are rather some values like 0,9999…97 instead of 1.
+The usual workaround is to compare floating point numbers with some tolerance threshold.
+Unfortunately it is difficult to choose a threshold that catch a wide range of rounding errors
+without wrongly considering legitimate datum shifts as rounding errors (see previous point).</p></li>
+</ul>
+<p>
+As a consequence of above points, accuracy of a matrix library is more important than performance for a <abbr>GIS</abbr> like Apache <abbr>SIS</abbr>.
+Paradoxically, a good way to improve performance is to invest more CPU time for more accurate matrix operations
+when <em>preparing</em> (not <em>executing</em>) the coordinate operation,
+because it increases the chances to correctly detect which operations cancel each other.
+This investment can save execution time at the place where it matters most:
+in the code looping over millions of coordinates to transform.
+</p><p>
+However matrix libraries are often designed for high performances with large matrices, sometime containing thousands of rows and columns.
+Those libraries can efficiently resolve systems of linear equations with hundreds of unknown variables.
+Those libraries resolve difficult problems, but not of the same kind than the problems that Apache <abbr>SIS</abbr> needs to solve.
+For that reason, and also for another reason described in next paragraphs, Apache <abbr>SIS</abbr> uses its own matrix implementation.
+This implementation addresses the accuracy issue by using “double-double” arithmetic
+(a technic for simulating the accuracy of approximatively 120 bits wide floating point numbers)
+at the cost of performance in a phase (transform <em>preparation</em>) where performance is not considered critical.
+</p>
+
+<h4 id="NonSquareMatrix"><span class="section-number">7.3.1.1.</span> What to do with non-square matrices (and why)</h4>
+<p>
+Apache <abbr title="Spatial Information System">SIS</abbr> often needs to inverse matrices, in order to perform a coordinate operation in reverse direction.
+Matrix inversions are typically performed on square matrices, but <abbr>SIS</abbr> also needs to inverse non-square matrices.
+Depending on whether we have more lines than columns:
+</p>
+<ul>
+<li>From Apache <abbr>SIS</abbr> library perspective, a non-square matrix is a coordinate operation that adds or removes a dimension.</li>
+<li>From linear algebra libraries perspective, a non-square matrix is an under-determined or over-determined system of equations.</li>
+</ul>
+<p>
+To illustrate the issues caused by direct use of libraries designed for linear algebra,
+consider a (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>) → (<var>φ₂</var>, <var>λ₂</var>) conversion
+from three-dimensional points to two-dimensional points on a surface.
+The <var>φ</var> terms are latitudes, the <var>λ</var> terms are longitudes and
+(<var>φ₂</var>, <var>λ₂</var>) may be different than (<var>φ₁</var>, <var>λ₁</var>) if <var>h</var> axis is not perpendicular to the surface.
+</p><p>
+
+
+<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="MathML capable browser required" display="block">
+<mfenced close="]" open="[">
+<mtable>
+<mtr><mtd><msub><mi>φ</mi><mrow><mn>2</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><msub><mi>λ</mi><mrow><mn>2</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><mn>1</mn></mtd></mtr>
+</mtable>
+</mfenced>
+<mo>=</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr>
+<mtd><mn>1</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+</mtr>
+<mtr>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>1</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+</mtr>
+<mtr>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>1</mn></mtd>
+</mtr>
+</mtable>
+</mfenced>
+<mo>×</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr><mtd><msub><mi>φ</mi><mrow><mn>1</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><msub><mi>λ</mi><mrow><mn>1</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><mi>h</mi></mtd></mtr>
+<mtr><mtd><mn>1</mn></mtd></mtr>
+</mtable>
+</mfenced>
+</math>
+</p><p>
+For linear algebra libraries, the above non-square matrix represents an under-determined system of equations and may be considered unresolvable.
+Indeed the above coordinate operation can not be inverted as a (<var>φ₂</var>, <var>λ₂</var>) → (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>)
+operation because we do not know which value to assign to <var>h</var>.
+Ignoring <var>h</var> implies that we can not assign values to (<var>φ₁</var>, <var>λ₁</var>) neither since those values may depend on <var>h</var>.
+However in <abbr>GIS</abbr> case, the ellipsoidal <var>h</var> axis is perpendicular to the ellipsoid surface
+on which the <em>geodetic</em> latitudes and longitudes (<var>φ</var>, <var>λ</var>) are represented
+(note that this statement is not true for <em>geocentric</em> latitudes and longitudes).
+This perpendicularity makes <var>φ₁</var> and <var>λ₁</var> independent of <var>h</var>.
+In such cases, we can can still do some processing.
+</p><p>
+Apache <abbr>SIS</abbr> proceeds by checking if <var>h</var> values are independent of <var>φ</var> and <var>λ</var> values.
+We identify such cases by checking which matrix coefficients are zero.
+If <abbr>SIS</abbr> can identify independent dimensions, it can temporarily exclude those dimensions
+and invert the matrix using only the remaining dimensions.
+If <abbr>SIS</abbr> does not found a sufficient amount of independent dimensions, an exception is thrown.
+But if a matrix inversion has been possible, then we need to decide which value to assign to the dimensions that <abbr>SIS</abbr> temporarily excluded.
+By default, <abbr>SIS</abbr> assigns the <code>NaN</code> (<cite>Not-a-Number</cite>) value to those dimensions.
+However in the particular case of ellipsoidal height <var>h</var> in a (<var>φ₂</var>, <var>λ₂</var>) → (<var>φ₁</var>, <var>λ₁</var>, <var>h</var>) operation,
+the zero value may also be appropriate on the assumption that the coordinates are usually close to the ellipsoid surface.
+In any case, the coefficients that Apache <abbr>SIS</abbr> sets to zero or <code>NaN</code> is based on the assumption
+that the matrix represents a coordinate operation; this is not something that can be done with arbitrary matrices.
+</p><p>
+The above-described approach allows Apache <abbr>SIS</abbr> to resolve some under-determined equation systems commonly found in <abbr>GIS</abbr>.
+In our example using <code>NaN</code> as the default value, the <var>h</var> ordinate stay unknown – we do not create information from nothing –
+but at least the (<var>φ</var>, <var>λ</var>) coordinates are preserved.
+The opposite problem, those of over-determined equation systems, is more subtile.
+An approach commonly applied by linear algebra libraries is to resolve over-determined systems by the least squares method.
+Such method applied to our example would compute a (<var>φ₂</var>, <var>λ₂</var>, <var>h</var>) → (<var>φ₁</var>, <var>λ₁</var>) operation
+that seems the best compromise for various <var>φ₂</var>, <var>λ₂</var> and <var>h</var> values,
+while being (except special cases) an exact solution for no-one.
+Furthermore linear combinations between those three variables may be an issue because of heterogenous units of measurement,
+for instance with <var>h</var> in metres and (<var>φ</var>, <var>λ</var>) in degrees.
+Apache <abbr>SIS</abbr> rather proceeds in the same way than for under-determined systems:
+by requiring that some dimensions are independent from other dimensions, otherwise the matrix is considered non-invertible.
+Consequently in over-determined systems case, <abbr>SIS</abbr> may refuse to perform some matrix inversions that linear algebra libraries can do,
+but in case of success the resulting coordinate operation is guaranteed to be exact (ignoring rounding errors).
+</p>
+
+<h4 id="MatrixLibrarySummary"><span class="section-number">7.3.1.2.</span> Apache <abbr title="Spatial Information System">SIS</abbr> matrix library</h4>
+<p>
+In summary, Apache <abbr>SIS</abbr> provides its own matrix library for the following reasons:
+</p>
+<ul>
+<li>Lightweight objects for small matrices, especially the 3×3 ones.</li>
+<li>Improved accuracy with “double-double” arithmetic, accepting performance cost in codes where performance is not critical.</li>
+<li>Special handling of non-square matrices on the assumption that those matrices represent coordinate operations.</li>
+</ul>
+<p>
+This library is provided in the <code class="SIS">org.apache.sis.matrix</code> package of the <code class="SIS">sis-referencing</code> module.
+</p>
 </section>
 </main>
 </body>

Modified: sis/site/trunk/content/book/fr/developer-guide.html
URL: http://svn.apache.org/viewvc/sis/site/trunk/content/book/fr/developer-guide.html?rev=1749179&r1=1749178&r2=1749179&view=diff
==============================================================================
--- sis/site/trunk/content/book/fr/developer-guide.html [UTF-8] (original)
+++ sis/site/trunk/content/book/fr/developer-guide.html [UTF-8] Sun Jun 19 14:31:33 2016
@@ -83,7 +83,11 @@
 <li><a href="#GeoAPI-simple">Fournir sa propre implémentation</a></li></ul></li></ul></li>
 <li><a href="#Tests">Les suites de tests</a><ul>
 <li><a href="#GeoAPI-validators">Validations des instances</a></li>
-<li><a href="#GeoAPI-tests">Exécution des tests pré-définis</a></li></ul></li></ul></li>
+<li><a href="#GeoAPI-tests">Exécution des tests pré-définis</a></li></ul></li>
+<li><a href="#DesignNote">Notes de design</a><ul>
+<li><a href="#MatrixLibrary">Particularités d’une bibliothèque de calculs matriciels pour un SIG</a><ul>
+<li><a href="#NonSquareMatrix">Que faire des matrices qui ne sont pas carrées (et pourquoi)</a></li>
+<li><a href="#MatrixLibrarySummary">La bibliothèque matricielle de Apache SIS</a></li></ul></li></ul></li></ul></li>
 </ul>
 </nav>
 
@@ -1982,121 +1986,6 @@ Il n’y a par exemple aucun code dédi�
 </p>
 </div>
 
-<article>
-<header>
-<h1>Particularités d’une bibliothèque de calculs matriciels pour un <abbr>SIG</abbr></h1>
-</header>
-<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 l’exemple précédent interviennent dans quasiment toutes les opérations
-appliquées par Apache <abbr title="Spatial Information System">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. Les changements de la 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,
-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.
-Malheureusement, les erreurs d’arrondissement sont parfois telles qu’il est difficile de savoir
-si certains coefficients de la matrices sont des artefacts ou proviennent d’un réel changement de référentiel.</p></li>
-</ul>
-<p>
-Ces points font que, pour un <abbr>SIG</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, 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 dans une partie du code où elle n’est pas jugée critique.
-</p>
-<h2>Que faire des matrices qui ne sont pas carrées (et pourquoi)</h2>
-<p>
-Apache <abbr title="Spatial Information System">SIS</abbr> a très souvent besoin d’inverser des matrices,
-afin d’obtenir une conversion de coordonnées qui fasse le contraire de la conversion originale.
-Mais on n’inverse habituellement que des matrices carrées.
-Or, Apache <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 qui projetterait les points d’un espace 3D vers une surface 2D:
-</p>
-<table class="hidden">
-<tr>
-<td>(λ₁, φ₁, <var>h</var>) → (λ₂, φ₂)</td>
-<td style="padding-left: 30px">où</td>
-<td><ul style="margin-top: 0">
-<li>λ est la longitude.</li>
-<li>φ est la latitude.</li>
-<li>(λ₂, φ₂) n’égale pas forcement (λ₁, φ₁) si la hauteur <var>h</var> n’est pas perpendiculaire à la surface.</li>
-</ul></td>
-</tr>
-</table>
-<p>
-Pour des bibliothèques d’algèbre linéaire, la matrice représentant cette conversion serait 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>h</var>) puisqu’on ne sait pas quelle valeur donner à <var>h</var>,
-ce qui implique qu’on ne peut pas trouver (λ₁, φ₁) non-plus car ces valeurs dépendent peut-être de <var>h</var>.
-Toutefois, dans le cas des <abbr>SIG</abbr>, l’axe des <var>h</var> est très souvent perpendiculaire à la surface sur laquelle sont exprimées les coordonnées (<var>λ</var>,<var>φ</var>).
-Cette perpendicularité rend λ₁ et φ₁ indépendants de <var>h</var>. Dans ce cas particulier, et ce cas seulement, on peut encore sauver les meubles.
-</p><p>
-Apache <abbr>SIS</abbr> procède en vérifiant si les coordonnées <var>h</var> sont indépendantes des coordonnées λ et φ.
-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.
-</p><p>
-Si une inversion a été possible, alors il reste à décider du sort des dimensions que <abbr>SIS</abbr> avait temporairement exclues.
-Dans notre exemple, <abbr>SIS</abbr> assignera la valeur <code>NaN</code> (<cite>Not-a-Number</cite>) aux valeurs de <var>h</var> dans la conversion (λ₂, φ₂) → (λ₁, φ₁, <var>h</var>).
-Là encore, le choix du coefficient à mettre à <code>NaN</code> dans la matrice est basé sur la présomption qu’elle représente une conversion de coordonnées.
-</p><p>
-Le traitement particulier fait par <abbr>SIS</abbr> permet donc d’inverser des matrices que l’on rencontre couramment dans les <abbr>SIG</abbr>,
-même si en principe le système est sous-déterminé.
-Dans notre exemple 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.
-</p><p>
-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>h</var>) → (λ₁, φ₁)
-qui semble le meilleur compromis pour diverses valeurs de λ₂, φ₂ 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,
-où les <var>h</var> sont 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.
-Dans le cas des systèmes surdéterminés <abbr>SIS</abbr> refusera donc d’effectuer certaines opérations que les bibliothèques d’algèbre linéaire auraient faite,
-mais garantira que les conversions obtenues seront exactes (aux erreurs d’arrondissement prêts).
-</p>
-<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>
-</article>
-
 <h4 id="AffineTransformAPI"><span class="section-number">3.3.1.2.</span> 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,
@@ -3065,7 +2954,11 @@ et dont la méthode <code class="SIS">ge
 <li><a href="#GeoAPI-simple">Fournir sa propre implémentation</a></li></ul></li></ul></li>
 <li><a href="#Tests">Les suites de tests</a><ul>
 <li><a href="#GeoAPI-validators">Validations des instances</a></li>
-<li><a href="#GeoAPI-tests">Exécution des tests pré-définis</a></li></ul></li></ul></nav>
+<li><a href="#GeoAPI-tests">Exécution des tests pré-définis</a></li></ul></li>
+<li><a href="#DesignNote">Notes de design</a><ul>
+<li><a href="#MatrixLibrary">Particularités d’une bibliothèque de calculs matriciels pour un SIG</a><ul>
+<li><a href="#NonSquareMatrix">Que faire des matrices qui ne sont pas carrées (et pourquoi)</a></li>
+<li><a href="#MatrixLibrarySummary">La bibliothèque matricielle de Apache SIS</a></li></ul></li></ul></li></ul></nav>
 <h2 id="ReduceDependency"><span class="section-number">7.1.</span> Réduire la dépendance directe envers Apache SIS</h2>
 <p>
 Les chapitres précédents utilisaient des méthodes statiques de Apache SIS par commodité.
@@ -3409,6 +3302,173 @@ qui sera exécutée après chacun des te
         assertTrue(<code class="GeoAPI">transform</code> <b>instanceof</b> <code class="GeoAPI">MathTransform2D</code>);
     }
 }</pre>
+
+
+
+<h2 id="DesignNote"><span class="section-number">7.3.</span> Notes de design</h2>
+<p>Les chapitres suivants expliquent les raisons derrières certains choix d'implémentation de Apache <abbr title="Spatial Information System">SIS</abbr>.</p>
+
+<h3 id="MatrixLibrary"><span class="section-number">7.3.1.</span> 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 title="Spatial Information System">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"><span class="section-number">7.3.1.1.</span> Que faire des matrices qui ne sont pas carrées (et pourquoi)</h4>
+<p>
+Apache <abbr title="Spatial Information System">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>
+
+
+<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="MathML capable browser required" display="block">
+<mfenced close="]" open="[">
+<mtable>
+<mtr><mtd><msub><mi>φ</mi><mrow><mn>2</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><msub><mi>λ</mi><mrow><mn>2</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><mn>1</mn></mtd></mtr>
+</mtable>
+</mfenced>
+<mo>=</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr>
+<mtd><mn>1</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+</mtr>
+<mtr>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>1</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+</mtr>
+<mtr>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>0</mn></mtd>
+<mtd><mn>1</mn></mtd>
+</mtr>
+</mtable>
+</mfenced>
+<mo>×</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr><mtd><msub><mi>φ</mi><mrow><mn>1</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><msub><mi>λ</mi><mrow><mn>1</mn></mrow></msub></mtd></mtr>
+<mtr><mtd><mi>h</mi></mtd></mtr>
+<mtr><mtd><mn>1</mn></mtd></mtr>
+</mtable>
+</mfenced>
+</math>
+</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"><span class="section-number">7.3.1.2.</span> La bibliothèque matricielle de Apache <abbr title="Spatial Information System">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 class="SIS">org.apache.sis.matrix</code> du module <code class="SIS">sis-referencing</code>.
+</p>
 </section>
 </main>
 </body>



Mime
View raw message