sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1713328 - /sis/site/trunk/content/book/fr/developer-guide.html
Date Mon, 09 Nov 2015 00:28:31 GMT
Author: desruisseaux
Date: Mon Nov  9 00:28:31 2015
New Revision: 1713328

URL: http://svn.apache.org/viewvc?rev=1713328&view=rev
Log:
Include the referencing chapter (still work in progress).

Modified:
    sis/site/trunk/content/book/fr/developer-guide.html

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=1713328&r1=1713327&r2=1713328&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] Mon Nov  9 00:28:31 2015
@@ -55,6 +55,28 @@
 <li><a href="#Locale.ROOT">Convention Locale.ROOT</a></li>
 <li><a href="#UnicodePoint">Traitement des caractères</a><ul>
 <li><a href="#Whitespaces">Interprétation des espaces blancs</a></li></ul></li></ul></li></ul></li>
+<li><a href="#Referencing">Systèmes de références spatiales</a><ul>
+<li><a href="#CRS_Components">Composantes d’un système de références par coordonnées</a><ul>
+<li><a href="#Ellipsoid">Géoïde et ellipsoïde</a></li>
+<li><a href="#GeodeticDatum">Référentiel géodésique</a></li>
+<li><a href="#CoordinateSystem">Systèmes de coordonnées</a></li>
+<li><a href="#GeographicCRS">Systèmes géographiques</a><ul>
+<li><a href="#GeographicWKT">Format Well-Known Text</a></li></ul></li>
+<li><a href="#ProjectedCRS">Projections cartographiques</a><ul>
+<li><a href="#ProjectedWKT">Format Well-Known Text</a></li></ul></li>
+<li><a href="#CompoundCRS">Dimensions verticales et temporelles</a><ul>
+<li><a href="#CompoundWKT">Format Well-Known Text</a></li></ul></li></ul></li>
+<li><a href="#GetCRS">Obtention d’un système de référence spatial</a><ul>
+<li><a href="#CRSAuthorityFactory">Systèmes prédéfinis par des autorités</a></li>
+<li><a href="#CRSParsing">Lecture d’une définition au format GML ou WKT</a></li>
+<li><a href="#CRSFactory">Construction programmatique explicite</a></li>
+<li><a href="#CRS_UserCode">Ajout de définitions</a></li></ul></li>
+<li><a href="#CoordinateOperation">Opérations sur les coordonnées</a><ul>
+<li><a href="#MathTransform">Exécution de opérations</a></li>
+<li><a href="#TransformDerivative">Dérivées partielles des opérations</a><ul>
+<li><a href="#DerivativeAndEnvelope">Utilité des dérivées pour la projection d’enveloppes</a></li>
+<li><a href="#DerivativeAndRaster">Utilité des dérivées pour la projection d’images</a></li>
+<li><a href="#GetDerivative">Obtention de la dérivée en un point</a></li></ul></li></ul></li></ul></li>
 <li><a href="#Geometry">Géométries</a><ul>
 <li><a href="#Geometry-root">Classes de base</a><ul>
 <li><a href="#DirectPosition">Points et positions directes</a></li>
@@ -1725,7 +1747,7 @@ et dont la méthode <code class="SIS">ge
 <section>
 <header>
 <h1 id="Utilities"><span class="section-number">4.</span> Classes et méthodes utilitaires</h1>
-<nav><div class="chapter-links"><div class="previous-chapter">⬅ <a href="#XML-ISO">Chapitre précédent</a></div><div class="next-chapter"><a href="#Geometry">Chapitre suivant</a> ➡</div></div></nav>
+<nav><div class="chapter-links"><div class="previous-chapter">⬅ <a href="#XML-ISO">Chapitre précédent</a></div><div class="next-chapter"><a href="#Referencing">Chapitre suivant</a> ➡</div></div></nav>
 </header>
 <nav>Dans ce chapitre:<ul class="toc">
 <li><a href="#ComparisonMode">Modes de comparaisons des objets</a></li>
@@ -2001,8 +2023,550 @@ de la bibliothèque <abbr>SIS</abbr>.
 </section>
 <section>
 <header>
-<h1 id="Geometry"><span class="section-number">5.</span> Géométries</h1>
-<nav><div class="chapter-links"><div class="previous-chapter">⬅ <a href="#Utilities">Chapitre précédent</a></div><div class="next-chapter"><a href="#Coverage">Chapitre suivant</a> ➡</div></div></nav>
+<h1 id="Referencing"><span class="section-number">5.</span> Systèmes de références spatiales</h1>
+<nav><div class="chapter-links"><div class="previous-chapter">⬅ <a href="#Utilities">Chapitre précédent</a></div><div class="next-chapter"><a href="#Geometry">Chapitre suivant</a> ➡</div></div></nav>
+</header>
+<nav>Dans ce chapitre:<ul class="toc">
+<li><a href="#CRS_Components">Composantes d’un système de références par coordonnées</a><ul>
+<li><a href="#Ellipsoid">Géoïde et ellipsoïde</a></li>
+<li><a href="#GeodeticDatum">Référentiel géodésique</a></li>
+<li><a href="#CoordinateSystem">Systèmes de coordonnées</a></li>
+<li><a href="#GeographicCRS">Systèmes géographiques</a><ul>
+<li><a href="#GeographicWKT">Format Well-Known Text</a></li></ul></li>
+<li><a href="#ProjectedCRS">Projections cartographiques</a><ul>
+<li><a href="#ProjectedWKT">Format Well-Known Text</a></li></ul></li>
+<li><a href="#CompoundCRS">Dimensions verticales et temporelles</a><ul>
+<li><a href="#CompoundWKT">Format Well-Known Text</a></li></ul></li></ul></li>
+<li><a href="#GetCRS">Obtention d’un système de référence spatial</a><ul>
+<li><a href="#CRSAuthorityFactory">Systèmes prédéfinis par des autorités</a></li>
+<li><a href="#CRSParsing">Lecture d’une définition au format GML ou WKT</a></li>
+<li><a href="#CRSFactory">Construction programmatique explicite</a></li>
+<li><a href="#CRS_UserCode">Ajout de définitions</a></li></ul></li>
+<li><a href="#CoordinateOperation">Opérations sur les coordonnées</a><ul>
+<li><a href="#MathTransform">Exécution de opérations</a></li>
+<li><a href="#TransformDerivative">Dérivées partielles des opérations</a><ul>
+<li><a href="#DerivativeAndEnvelope">Utilité des dérivées pour la projection d’enveloppes</a></li>
+<li><a href="#DerivativeAndRaster">Utilité des dérivées pour la projection d’images</a></li>
+<li><a href="#GetDerivative">Obtention de la dérivée en un point</a></li></ul></li></ul></li></ul></nav>
+<p>
+Pour donner une position sur la Terre on peut utiliser des noms tels que celui d’une ville ou une adresse postale
+— on parle alors de références spatiales par <cite>identifiants</cite> —
+ou on peut donner des valeurs numériques valides dans un système de coordonnées donné
+— on parle alors de références spatiales par <cite>coordonnées</cite>.
+Chaque système implique des approximations telles que:
+</p>
+<ul>
+<li>Le choix de la forme géométrique (géoïde, ellipsoïde, <i>etc.</i>) utilisée comme approximation de la forme de la Terre.</li>
+<li>Le choix des propriétés géométriques (angles, distances, <i>etc.</i>) à préserver lors de la représentation d’une carte sur une surface plane.</li>
+<li>Les pertes de précision lorsque l’on doit transformer des positions exprimées selon un système vers des positions exprimées selon un autre système.</li>
+</ul>
+<p>
+En l’absence d’indication contraire, la précision recherchée pour les coordonnées sur la Terre est de 1 centimètre.
+Mais la maîtrise de cette précision nécessite certaines conditions:
+</p>
+<ul>
+<li>Rester dans la zone de validité du système, telle que donnée par <code class="GeoAPI">ReferenceSystem​.getDomainOfValidity()</code>.</li>
+<li>Savoir que les mesures de distances dans une projection cartographique donnée ne sont vraies qu’à certains endroits,
+appelés par exemple « parallèles standards ».</li>
+<li>Vérifier la précision des transformations de coordonnées, telle que donnée par
+<code class="GeoAPI">CoordinateOperation​.getCoordinateOperationAccuracy()</code>.</li>
+</ul>
+<p>
+Le module <code class="SIS">sis-referencing</code> de Apache <abbr title="Spatial Information System">SIS</abbr> fournit une série de classes implémentant
+les différentes spécialisations de l’interface <code class="GeoAPI">ReferenceSystem</code> ainsi que leurs composantes.
+Ces implémentations permettent de stocker une description des systèmes de références spatiales
+ainsi que leurs méta-données telles que la zone de validité.
+Toutefois ces objets n’effectuent aucune opération sur les coordonnées.
+Ces opérations sont le travail d’une autre famille de classes, dont la racine est l’interface <code class="GeoAPI">CoordinateOperation</code>.
+Ces classes seront discutées dans <a href="#CoordinateOperation">une autre section</a>,
+mais nous citons ici deux spécialisations en rapport avec le sujet de la précision des coordonnées:
+</p>
+<ul>
+<li>
+<p>Les <strong>conversions</strong> de coordonnées sont entièrement définies par une formule mathématique.
+Les conversions s’effectueraient avec une précision infinie s’il n’y avait pas les inévitables
+erreurs d’arrondissements inhérents aux calculs sur des nombres réels.</p>
+<div class="example"><p><b>Exemple:</b> les projections cartographiques.</p></div>
+</li>
+<li><p>Les <strong>transformations</strong> de coordonnées sont définies de manière empirique.
+Elles ont souvent des erreurs de quelques mètres qui ne sont pas dues à des limites de la précision des ordinateurs.
+Ces erreurs découlent du fait que la transformation utilisée n’est qu’une approximation d’une réalité plus complexe.</p>
+<div class="example"><p><b>Exemple:</b> les changements de référentiels tel que le passage de la
+<cite>Nouvelle Triangulation Française</cite> (<abbr>NTF</abbr>) vers le
+<cite>Réseau Géodésique Français 1993</cite> (<abbr>RGF93</abbr>),
+même lorsque la méthode de projection cartographique (Lambert conique conforme) ne change pas.</p>
+</div>
+</li>
+</ul>
+
+
+
+<h2 id="CRS_Components"><span class="section-number">5.1.</span> Composantes d’un système de références par coordonnées</h2>
+<p>
+Les systèmes de références spatiales par coordonnées fournissent les informations nécessaires pour faire
+correspondre des coordonnées numériques à des positions dans le monde réel. Dans Apache <abbr title="Spatial Information System">SIS</abbr>,
+ils sont pratiquement tous représentés par des classes dont le nom se termine en <abbr title="Coordinate Reference System">CRS</abbr>
+(l’abréviation de <i>Coordinate Reference System</i> en anglais). Ces objets contiennent:
+</p>
+<ul>
+<li>Un identifiant du référentiel (<i>datum</i> en anglais),
+qui indique entre autres quel ellipsoïde utiliser comme approximation de la forme de la terre.</li>
+<li>Une description de chaque axe (nom, direction, unité de mesure, limites).</li>
+<li>Parfois une liste de paramètres permettant de convertir les coordonnées d’un autre système.
+C’est le cas notamment des projections cartographiques.</li>
+</ul>
+<p>
+Ces systèmes sont décrits par la norme <abbr title="International Organization for Standardization">ISO</abbr> 19111 (<i>Referencing by coordinates</i>),
+qui remplace en grande partie une norme plus ancienne mais encore utilisée pour certains aspects,
+<abbr>OGC 01-009</abbr> (<i>Coordinate Transformation Services</i>).
+Ces normes sont complétées par deux autres standards définissant des formats d’échanges:
+<abbr>ISO</abbr> 19136 et 19162 pour respectivement
+le <cite>Geographic Markup Language</cite> (<abbr>GML</abbr>) — un format <abbr>XML</abbr> précis mais verbeux —
+et le <cite>Well-Known Text</cite> (<abbr>WKT</abbr>) — un format texte plus facile à lire par les humains.
+</p>
+
+<h3 id="Ellipsoid"><span class="section-number">5.1.1.</span> Géoïde et ellipsoïde</h3>
+<p>La surface topographique réelle étant difficile à représenter mathématiquement, elle n’est pas utilisée directement en cartographie.
+Une autre surface un peu plus facilement utilisable est le géoïde,
+une surface sur laquelle la force gravitationnelle a partout la même valeur (surface équipotentielle du champ de gravité terrestre).
+Cette surface est en tout point perpendiculaire à la direction indiquée par un fil à plomb (verticale du lieu).
+Le géoïde coïnciderait avec le niveau moyen des mers s’il n’y avait ni vent ni courants marins permanents comme le Gulf Stream.
+</p><p>
+Tout en étant nettement plus lisse que la surface topographique,
+le géoïde présente des creux et des bosses liés à l’inégale distribution des masses de la Terre.
+Pour une utilisation mathématiquement plus aisée, le géoïde est donc approximé par un ellipsoïde.
+Cette « figure de la Terre » est représentée dans GeoAPI par l’interface <code class="GeoAPI">Ellipsoid</code>,
+qui constitue un élément fondamental des systèmes de références de type <code class="GeoAPI">GeographicCRS</code> et <code class="GeoAPI">ProjectedCRS</code>.
+Plusieurs dizaines d’ellipsoïdes sont couramment employés, certains offrant une excellente approximation pour une région précise
+au détriment des régions pour lesquelles l’ellipsoïde n’a pas été conçu, et d’autres offrant un compromis pour l’ensemble de la planète.
+</p>
+<div class="example"><p><b>Exemple:</b>
+au début du XX<sup>e</sup> siècle aux États-Unis, l’état du Michigan utilisait pour ses cartes un ellipsoïde basé
+sur l’ellipsoïde « Clarke 1866 » mais auquel la longueur des axes a été allongée de 800 pieds.
+Cette modification visait à tenir compte du niveau moyen de l’état au dessus du niveau de la mer.</p>
+</div>
+
+<h3 id="GeodeticDatum"><span class="section-number">5.1.2.</span> Référentiel géodésique</h3>
+<p>
+Pour définir un système géodésique dans un pays, l’état met en place un ellipsoïde de référence
+qui épouse au mieux sur l’ensemble du pays la forme locale du géoïde.
+L’écart entre cet ellipsoïde de référence et les creux et les bosses du géoïde reste généralement inférieur à 100 mètres.
+Les paramètres qui permettent de lier un <code class="GeoAPI">Ellipsoid</code> à la surface de la Terre (par exemple la position de son centre)
+sont encapsulés dans un objet de type <code class="GeoAPI">GeodeticDatum</code>, que l’on traduit en français par « référentiel géodésique ».
+Plusieurs <code class="GeoAPI">GeodeticDatum</code> peuvent utiliser le même <code class="GeoAPI">Ellipsoid</code>, mais centré ou orienté différemment.
+</p><p>
+Avant l’avènement des satellites, les mesures géodésiques se déroulaient exclusivement à la surface de la terre.
+En conséquence, deux îles ou continents qui ne sont pas à portée visuelle l’un de l’autre n’étaient pas rattachés géodésiquement entre eux.
+Ainsi les référentiels <cite>North American Datum 1983</cite> (<abbr>NAD83</abbr>) et <cite>European Datum 1950</cite> (<abbr>ED50</abbr>) sont indépendants l’un de l’autre:
+leurs ellipsoïdes de référence ont des centres distincts et des dimensions différentes.
+Une même coordonnée géographique correspondra à des positions différentes dans le monde réel
+selon que la coordonnée se réfère à l’un ou l’autre de ces référentiels.
+</p><p>
+L’invention du <abbr title="Global Positioning System">GPS</abbr> a précipité la création d’un système géodésique mondial,
+nommé <abbr title="World Geodetic System 1984">WGS84</abbr>.
+L’ellipsoïde de référence est alors unique et centré au centre de gravité de la terre.
+Les <abbr>GPS</abbr> donnent à tout moment la position absolue du récepteur rapportée à ce système géodésique.
+Mais <abbr>WGS84</abbr> étant un système mondial, il peut diverger significativement des systèmes locaux.
+Par exemple l’écart entre <abbr>WGS84</abbr> et le système européen <abbr>ED50</abbr> est de l’ordre de 150 mètres,
+et l’écart moyen par rapport au système de l’île de la Réunion 1947 est de 1,5 kilomètres.
+Il ne faut donc pas rapporter aveuglement des positions <abbr>GPS</abbr> sur une carte.
+Des correspondances avec les systèmes régionaux peuvent être nécessaires
+et sont représentées dans GeoAPI sous forme d’objets de type <code class="GeoAPI">Transformation</code>
+(une classe d’opérations mentionnée dans l’<a href="#Referencing">introduction de ce chapitre</a>).
+</p><p>
+Les généralisation de l’usage du système <abbr>WGS84</abbr> tend à réduire le besoin d’utiliser
+les objets <code class="GeoAPI">Transformation</code> pour les données récentes, mais ne l’élimine pas complètement.
+La Terre bouge sous l’effet de la tectonique des plaques et de nouveaux systèmes sont définis chaque année pour en tenir compte.
+Même le système <abbr>WGS84</abbr>, sensé correspondre à une définition à un instant donné,
+a subit des révisions dues notamment à l’amélioration de la précision des instruments.
+Ainsi il existe aujourd’hui au moins six versions de <abbr>WGS84</abbr>, avec des écarts entre elles allant jusqu’à 7 centimetres.
+</p>
+<article>
+<header>
+<h1>Bibliothèques de type « early binding » versus « late binding »</h1>
+</header>
+<p>
+Le caractère universel du système <abbr title="World Geodetic System 1984">WGS84</abbr> rend tentante l’idée de l’utiliser comme système pivot,
+afin de simplifier l’implémentation d’une bibliothèque de transformation de coordonnées.
+La transformation d’une coordonnées d’un référentiel <var>A</var> vers un référentiel <var>B</var>
+pourrait se faire en transformant d’abord de <var>A</var> vers <abbr>WGS84</abbr>, puis de <abbr>WGS84</abbr> vers <var>B</var>.
+Il suffirait ainsi de stocker dans chaque objet <code class="GeoAPI">GeodeticDatum</code> les informations nécessaires à la transformation vers <abbr>WGS84</abbr>.
+Cette approche était encouragée dans la version 1 du format <abbr>WKT</abbr>, qui définissait un élément <code>TOWGS84</code> remplissant ce rôle.
+</p><p>
+Cette approche est désignée par <abbr>EPSG</abbr> sous le nom de « early binding »,
+car elle associe des informations sur la transformations de coordonnées très tôt dans la définition des objets géodésiques.
+Bien que <abbr>EPSG</abbr> reconnaisse que cette approche soit couramment employée, elle n’est pas recommandée pour plusieurs raisons:
+</p>
+<ul>
+<li>Il existe parfois plusieurs transformations allant d’un référentiel <var>A</var> vers <abbr>WGS84</abbr>,
+chacune étant plus précise pour une région géographique donnée.
+Par exemple il existe une cinquantaine de transformations de <abbr>NAD27</abbr> vers <abbr>NAD83</abbr>.</li>
+<li>Certaines opérations sont conçues spécifiquement pour transformer de <var>A</var> vers <var>B</var>
+et n’ont pas la même précision qu’aurait une autre transformation faisant un détour par <abbr>WGS84</abbr>.</li>
+<li>Il existe d’autres systèmes globaux qui pourraient servir de pivot, par exemple le <cite>Galileo reference frame</cite> (<abbr>GTRF</abbr>)
+mis en place par le concurrent européen du <abbr title="Global Positioning System">GPS</abbr>. Et <abbr>WGS84</abbr> lui-même subit parfois des révisions.</li>
+</ul>
+<p>
+<abbr>EPSG</abbr> recommande plutôt d’utiliser une approche dite « late binding »,
+selon laquelle les paramètres nécessaires aux transformations de coordonnées sont définis pour des paires de
+référentiels « <var>A</var> vers <var>B</var> » plutôt qu’associés à des référentiels pris isolément.
+Apache <abbr title="Spatial Information System">SIS</abbr> est une implémentation de type « late binding »,
+bien qu’une réminiscence de l’approche « early binding » existe toujours
+sous la forme de la propriété <code>DefaultGeodeticDatum​.getBursaWolfParameters()</code>.
+</p>
+</article>
+
+<h3 id="CoordinateSystem"><span class="section-number">5.1.3.</span> Systèmes de coordonnées</h3>
+<p>TODO</p>
+
+<h3 id="GeographicCRS"><span class="section-number">5.1.4.</span> Systèmes géographiques</h3>
+<p>TODO</p>
+
+<h4 id="GeographicWKT"><span class="section-number">5.1.4.1.</span> Format <i>Well-Known Text</i></h4>
+<p>TODO</p>
+
+<h3 id="ProjectedCRS"><span class="section-number">5.1.5.</span> Projections cartographiques</h3>
+<p>
+L’utilité des projections cartographiques est discutée dans de nombreux livres et sites web.
+Il s’agit de représenter une surface courbe (la Terre) sur une surface plane (une carte ou un écran d’ordinateur)
+en contrôlant les déformations: on peut préserver les angles ou les surfaces, mais pas les deux à la fois.
+Les propriétés géométriques à conserver dépendent de l’objet d’étude et du travail à effectuer.
+Par exemple les pays plutôt allongés dans le sens Est-Ouest utilisent souvent une projection de Lambert,
+alors que les pays plutôt allongés dans le sens Nord-Sud préfèrent une projection de Mercator Transverse.
+</p><p>
+TODO
+</p>
+
+<h4 id="ProjectedWKT"><span class="section-number">5.1.5.1.</span> Format <i>Well-Known Text</i></h4>
+<p>TODO</p>
+
+<h3 id="CompoundCRS"><span class="section-number">5.1.6.</span> Dimensions verticales et temporelles</h3>
+<p>TODO</p>
+
+<h4 id="CompoundWKT"><span class="section-number">5.1.6.1.</span> Format <i>Well-Known Text</i></h4>
+<p>TODO</p>
+
+
+
+<h2 id="GetCRS"><span class="section-number">5.2.</span> Obtention d’un système de référence spatial</h2>
+<p>TODO</p>
+
+<h3 id="CRSAuthorityFactory"><span class="section-number">5.2.1.</span> Systèmes prédéfinis par des autorités</h3>
+<p>TODO</p>
+
+<h3 id="CRSParsing"><span class="section-number">5.2.2.</span> Lecture d’une définition au format GML ou WKT</h3>
+<p>TODO</p>
+
+<h3 id="CRSFactory"><span class="section-number">5.2.3.</span> Construction programmatique explicite</h3>
+<p>TODO</p>
+
+<h3 id="CRS_UserCode"><span class="section-number">5.2.4.</span> Ajout de définitions</h3>
+<p>TODO</p>
+
+
+
+<h2 id="CoordinateOperation"><span class="section-number">5.3.</span> Opérations sur les coordonnées</h2>
+<p>TODO</p>
+
+<h3 id="MathTransform"><span class="section-number">5.3.1.</span> Exécution de opérations</h3>
+<p>TODO</p>
+
+<h3 id="TransformDerivative"><span class="section-number">5.3.2.</span> Dérivées partielles des opérations</h3>
+<p>
+La section précédente indiquait comment calculer les coordonnées d’un point géographique dans une projection au choix.
+Mais il existe une autre opération moins connue, qui consiste à calculer non pas la <em>coordonnées projetée</em> d’un point,
+mais plutôt la <em>dérivée de la fonction de projection cartographique</em> en ce point.
+Cette opération était définie dans une ancienne spécification du consortium Open Geospatial,
+<a href="http://www.opengeospatial.org/standards/ct">OGC 01-009</a>, aujourd’hui un peu oubliée mais pourtant encore utile.
+</p>
+
+<p>
+Appelons <var>P</var> une projection cartographique qui convertit une longitude et latitude (λ,φ) en degrés
+vers une coordonnée projetée (<var>x</var>,<var>y</var>) en mètres.
+Dans l’expression ci-dessous, nous représentons le résultat de la projection cartographique
+sous forme d’une matrice colonne (la raison sera plus claire bientôt):
+</p>
+
+<math alttext="MathML capable browser required" display="block">
+<mi>P</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo>
+<mo>=</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr><mtd><mi>x</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo></mtd></mtr>
+<mtr><mtd><mi>y</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo></mtd></mtr>
+</mtable>
+</mfenced>
+</math>
+
+<p>La dérivée de la projection cartographique en ce même point peut se représenter par la matrice Jacobienne définie tel que:</p>
+
+<math alttext="MathML capable browser required" display="block">
+<msup><mi>P</mi><mo>′</mo></msup><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo>
+<mo>=</mo>
+<msub><mi>JAC</mi><mrow><mi>P</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo></mrow></msub>
+<mo>=</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr>
+<mtd><mfrac><mrow><mo>∂</mo><mi>x</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo></mrow><mrow><mo>∂</mo><mi>λ</mi></mrow></mfrac></mtd>
+<mtd><mfrac><mrow><mo>∂</mo><mi>x</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo></mrow><mrow><mo>∂</mo><mi>φ</mi></mrow></mfrac></mtd>
+</mtr>
+<mtr>
+<mtd><mfrac><mrow><mo>∂</mo><mi>y</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo></mrow><mrow><mo>∂</mo><mi>λ</mi></mrow></mfrac></mtd>
+<mtd><mfrac><mrow><mo>∂</mo><mi>y</mi><mo>(</mo><mi>λ</mi><mo>,</mo><mi>φ</mi><mo>)</mo></mrow><mrow><mo>∂</mo><mi>φ</mi></mrow></mfrac></mtd>
+</mtr>
+</mtable>
+</mfenced>
+</math>
+
+<p>
+Le premier élément de la matrice (∂<var>x</var>/∂λ) nous indique à quel déplacement vers l’<em>Est</em>
+(<var>x</var> en mètres) correspond un déplacement de un degré de <em>longitude</em> (λ).
+De même, le dernier élément de la matrice (∂<var>y</var>/∂φ) nous indique à quel déplacement vers le <em>Nord</em>
+(<var>y</var> en mètres) correspond un déplacement de un degré de <em>latitude</em> (φ).
+Les autres éléments (∂<var>x</var>/∂φ et ∂<var>y</var>/∂λ) sont des termes croisés (par exemple à quel déplacement
+en mètres vers le <strong>Nord</strong> correspond un déplacement de un degré de <strong>longitude</strong>).
+Ces valeurs ne sont généralement valides qu’à la position géographique (λ,φ) donnée.
+Si on se déplace un peu, ces valeurs changent légèrement.
+</p>
+
+<p>
+On peut se représenter visuellement cette matrice comme ci-dessous.
+Cette figure représente la dérivée en deux points, <var>P</var><sub>1</sub> et <var>P</var><sub>2</sub>,
+pour mieux illustrer le fait que le résultat varie en chaque point.
+Dans cette figure, les vecteurs <var>U</var> et <var>V</var> désignent respectivement
+la première et deuxième colonne des matrices de dérivées.
+</p>
+
+<center><table class="hidden"><tr>
+<td><img alt="Exemple de dérivées d’une projection cartographique" src="../images/Derivatives.png" style="border: solid 1px"/></td>
+<td style="padding-left: 30px; vertical-align: middle">
+<p>où les vecteurs sont reliés à la matrice par:</p>
+<math alttext="MathML capable browser required" display="block">
+<mtable><mtr>
+<mtd>
+<mover><mi>U</mi><mo>→</mo></mover><mo>=</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr>
+<mtd><mfrac><mrow><mo>∂</mo><mi>x</mi></mrow><mrow><mo>∂</mo><mi>λ</mi></mrow></mfrac></mtd>
+</mtr>
+<mtr>
+<mtd><mfrac><mrow><mo>∂</mo><mi>y</mi></mrow><mrow><mo>∂</mo><mi>λ</mi></mrow></mfrac></mtd>
+</mtr>
+</mtable>
+</mfenced>
+</mtd>
+<mtd><mtext>et</mtext></mtd>
+<mtd>
+<mover><mi>V</mi><mo>→</mo></mover><mo>=</mo>
+<mfenced close="]" open="[">
+<mtable>
+<mtr>
+<mtd><mfrac><mrow><mo>∂</mo><mi>x</mi></mrow><mrow><mo>∂</mo><mi>φ</mi></mrow></mfrac></mtd>
+</mtr>
+<mtr>
+<mtd><mfrac><mrow><mo>∂</mo><mi>y</mi></mrow><mrow><mo>∂</mo><mi>φ</mi></mrow></mfrac></mtd>
+</mtr>
+</mtable>
+</mfenced>
+</mtd>
+</mtr></mtable>
+</math>
+</td>
+</tr></table></center>
+
+<p>
+Cette figure nous montre déjà une utilisation possible des dérivées:
+elles donnent la direction des parallèles et des méridiens à une position donnée dans une projection cartographique.
+Par extension, on peut aussi s’en servir pour déterminer si des axes sont interchangés,
+ou si la direction d’un axe est renversée. Mais l’intérêt des dérivées ne s’arrête pas là.
+</p>
+
+<h4 id="DerivativeAndEnvelope"><span class="section-number">5.3.2.1.</span> Utilité des dérivées pour la projection d’enveloppes</h4>
+<p>
+Les systèmes d’information géographiques ont très fréquemment besoin de projeter une enveloppe.
+Mais l’approche naïve, qui consisterait à projeter chacun des 4 coins du rectangle, ne suffit pas.
+La figure ci-dessous montre une enveloppe avant le projection, et la forme géométrique que l’on obtiendrait
+si on projetait finement l’enveloppe (pas seulement les 4 coins). Cette forme géométrique est plus complexe
+qu’un simple rectangle à cause des courbures induites par la projection cartographique.
+Construire une enveloppe rectangulaire qui engloberait les 4 coins de cette forme géométrique ne suffit pas,
+car la surface en bas de la forme est plus basse que les 2 coins du bas.
+Cette surface serait donc en dehors du rectangle.
+</p>
+<center><table class="hidden">
+<tr>
+<th>Enveloppe avant la projection</th>
+<th>Forme géométrique après la projection</th>
+</tr>
+<tr>
+<td><img alt="Envelope in a geographic CRS" src="../images/GeographicArea.png" style="border: solid 1px; margin-right: 15px"/></td>
+<td><img alt="Shape in a projected CRS" src="../images/ConicArea.png" style="border: solid 1px; margin-left:  15px"/></td>
+</tr>
+</table></center>
+<p>
+Une façon simple d’atténuer le problème est d’échantillonner un plus grand nombre de points sur chacun des
+bords de la forme géométrique. On trouve ainsi des bibliothèques de <abbr>SIG</abbr> qui vont par exemple
+échantillonner 40 points sur chaque bord, et construire un rectangle qui englobe tout ces points.
+Mais même avec 40 points, les échantillons les plus proches peuvent encore être légèrement à côté du point le plus bas de la figure.
+Une petite portion de la forme géométrique peut donc toujours se trouver en dehors du rectangle.
+Il est tentant de considérer cette légère erreur comme négligeable, mais quelques pixels manquants
+entraînent divers artefacts comme une apparence de quadrillage lors de l’affichage d’images tuilées,
+ou une “pointe de tarte” manquante lors de la projection d’images sur un pôle.
+Augmenter artificiellement d’un certain pourcentage la taille de l’enveloppe projetée peut éliminer ces artefacts dans certains cas.
+Mais un pourcentage trop élevé fera traiter plus de données que nécessaire
+(en particulier lorsque cela entraîne le chargement de nouvelles tuiles d’images),
+alors qu’un pourcentage trop faible laissera quelques artefacts.
+</p><p>
+Les dérivées des projections cartographiques permettent de résoudre ce problème d’une manière plus efficace que la force brute.
+La figure ci-dessous reprend la forme projetée en exagérant des déformations.
+L’approche consiste à calculer la projection cartographiques des 4 coins comme dans l’approche naïve,
+mais en récupérant aussi les dérivées de la projection de ces 4 coins.
+Entre deux coins et avec leurs dérivées, on peut faire passer une et une seule courbe cubique
+(de la forme <i>f(<var>x</var>)</i> = <var>C</var>₀ + <var>C</var>₁<var>x</var> + <var>C</var>₂<var>x</var>² + <var>C</var>₃<var>x</var>³),
+dont on peut calculer les coefficients <var>C</var>.
+Cette approximation (représentée en rouge ci-dessous) ne correspond pas tout-à-fait à la courbe désirée (en bleue) mais s’en rapproche.
+Ce qui nous intéresse n’est pas vraiment les valeurs de l’approximation, mais plutôt la position de son minimum,
+en particulier la longitude λ où se trouve ce minimum dans notre exemple (ligne pointillée verte).
+L’avantage est que la position du minimum d’une courbe cubique est facile à calculer lorsque l’on connaît les valeurs de <var>C</var>.
+En supposant que la longitude du minimum de la courbe cubique est proche de la longitude du minimum de la courbe réelle,
+il suffit de calculer la projection cartographique d’un point à cette longitude plutôt que d’échantillonner 40 points sur le bord de l’enveloppe.
+</p>
+<center><table class="hidden"><tr><td>
+<img alt="Approximation cubique d’un bord d’une enveloppe" src="../images/Approximation.png"/>
+</td><td style="padding-left: 60px">
+Légende:
+<ul>
+<li><b>En bleue:</b> la forme géométrique correspondant à la projection de l’enveloppe.
+C’est la forme dont on souhaite avoir le rectangle englobant.</li>
+<li><b>En rouge</b> (sous les hachures): L’approximation
+<var>y</var> = <var>C</var>₀ + <var>C</var>₁λ + <var>C</var>₂λ² + <var>C</var>₃λ³.</li>
+<li><b>En vert</b> (pointillés): La position λ<sub>m</sub> du minimum de l’approximation, trouvée en résolvant
+0 = <var>C</var>₁ + 2<var>C</var>₂λ<sub>m</sub> + 3<var>C</var>₃λ<sub>m</sub>².
+Il peut y avoir jusqu’à deux minimums pour une même courbe cubique.</li>
+</ul>
+</td></tr></table></center>
+<p>
+Dans la pratique Apache <abbr title="Spatial Information System">SIS</abbr> utilise 8 points, soit les 4 coins plus un point au centre de chaque bord du rectangle à projeter,
+afin de réduire le risque d’erreur qu’induirait une courbe trop tordue entre deux points.
+Selon nos tests, l’utilisation de ces seuls 8 points avec leurs dérivées comme décrit ci-haut
+donne un résultat plus précis que l’approche “force brute” utilisant un échantillonnage de 160 points sur les 4 bords du rectangle.
+La précision de <abbr>SIS</abbr> pourrait être encore améliorée en répétant le processus à partir du minimum trouvée
+(une ou deux itérations suffiraient peut-être).
+</p><p>
+Une économie de 150 points n’est pas énorme vu les performances des ordinateurs d’aujourd’hui.
+Mais toute la discussion précédente utilisait une forme géométrique à deux dimensions en guise d’exemple,
+alors que l’algorithme est applicable dans un espace à <var>n</var> dimensions.
+Et de fait, l’implémentation de Apache SIS fonctionne pour un nombre arbitraire de dimensions.
+Les économies apportées par cet algorithme par rapport à la force brute augmentent de manière exponentielle avec le nombre de dimensions.
+</p>
+
+
+<h4 id="DerivativeAndRaster"><span class="section-number">5.3.2.2.</span> Utilité des dérivées pour la projection d’images</h4>
+<p>
+La projection cartographique d’une image s’effectue en préparant une image initialement vide qui contiendra le résultat de l’opération,
+puis à remplir cette image en itérant sur tous les pixels. Pour chaque pixel de l’image <em>destination</em>, on obtient la coordonnées
+du pixel correspondant dans l’image source en utilisant <em>l’inverse</em> de la projection cartographique que l’on souhaite appliquer.
+La position obtenue ne sera pas nécessairement au centre du pixel de l’image source, ce qui implique qu’une interpolation de la valeur
+(ou de la couleur dans l’image ci-dessous) peut être nécessaire.
+</p>
+<center><table class="hidden">
+<tr>
+<th style="text-align: left">Image source</th>
+<th style="text-align: right">Image destination</th>
+</tr>
+<tr>
+<td colspan="2"><img alt="Intersection of derivatives" src="../images/RasterProjection.png"/></td>
+</tr>
+</table></center>
+<p>
+Toutefois, calculer la projection inverse pour chacun des pixels peut être relativement lent.
+Afin d’accélérer les calculs, on utilise parfois une <cite>grille d’interpolation</cite>
+dans laquelle on a pré-calculé les <em>coordonnées</em> de la projection inverse de seulement quelques points.
+Les coordonnées des autres points se calculent alors par des interpolations bilinéaires entre les points pré-calculés,
+calculs qui pourraient éventuellement tirer parti d’accélérations matérielles sous forme de <cite>transformations affines</cite>.
+Cette approche est implémentée par exemple dans la bibliothèque <cite>Java Advanced Imaging</cite> avec l’objet <code>WarpGrid</code>.
+Elle offre en outre l’avantage de permettre de réutiliser la grille autant de fois que l’on veut si on a plusieurs images de même
+taille à projeter aux mêmes coordonnées géographiques.
+</p><p>
+Mais une difficulté de cette approche est de déterminer combien de points il faut pré-calculer pour que l’erreur
+(la différence entre une position interpolée et la position réelle) ne dépasse pas un certain seuil (par exemple ¼ de pixel).
+On peut procéder en commençant par une grille de taille 3×3, puis en augmentant le nombre de points de manière itérative:
+</p>
+<center><table class="hidden"><tr>
+<td><img alt="Intersection of derivatives" src="../images/WarpGrid.png"/></td>
+<td style="padding-left: 60px">
+Légende:
+<ul>
+<li><b>Points bleus:</b>  première itération (9 points).</li>
+<li><b>Points verts:</b>   seconde itération (25 points, dont 16 nouveaux).</li>
+<li><b>Points rouges:</b> troisième itération (81 points, dont 56 nouveaux).</li>
+</ul>
+Si l’on continue…
+<ul>
+<li>Quatrième itération: 289 points, dont 208 nouveaux.</li>
+<li>Cinquième itération: 1089 points, dont 800 nouveaux.</li>
+<li>Sixième itération: 4225 points, dont 3136 nouveaux.</li>
+<li>…</li>
+</ul>
+</td></tr></table></center>
+<p>
+L’itération s’arrête lorsque, après avoir calculé de nouveaux points, on a vérifié que la différence entre les
+coordonnées projetées et les coordonnées interpolées de ces nouveaux points est inférieure au seuil qu’on s’est fixé.
+Malheureusement cette approche nous permet seulement de déterminer <strong>après</strong> avoir calculé de nouveaux points…
+que ce n’était pas la peine de les calculer. C’est un peu dommage vu que le nombre de nouveaux points requis par chaque itération
+est environ 3 fois la <em>somme</em> du nombre de nouveaux points de <em>toutes</em> les itérations précédentes.
+</p><p>
+Les dérivées des projections cartographiques nous permettent d’améliorer cette situation en estimant
+si c’est la peine d’effectuer une nouvelle itération <strong>avant</strong> de la faire.
+L’idée de base est de vérifier si les dérivées de deux points voisins sont presque pareilles,
+auquel cas on présumera que la transformation entre ces deux points est pratiquement linéaire.
+Pour quantifier « presque pareil », on procède en calculant l’intersection entre les tangentes aux deux points
+(une information fournie par les dérivées), et en calculant la distance entre cette intersection et la droite
+qui relie les deux points (la ligne pointillée dans la figure ci-dessous).
+</p>
+<center><img alt="Intersection of derivatives" src="../images/IntersectionOfDerivatives.png" style="border: solid 1px"/></center>
+<p>
+Dans l’approche sans dérivées, l’itération s’arrête lorsque la distance entre la ligne pointillée (positions interpolées)
+et la ligne rouge (positions projetées) est inférieure au seuil de tolérance, ce qui implique de calculer la position projetée.
+Dans l’approche avec dérivées, on remplace la position projetée par l’intersection des deux tangentes (carré bleu foncé).
+Si la courbe n’est pas trop tordue – ce qui ne devrait pas être le cas entre deux points suffisamment proches –
+la courbe réelle passera à quelque part entre la droite pointillée et l’intersection.
+On s’évite ainsi des projections cartographiques, en apparence une seule dans cette illustration,
+mais en fait beaucoup plus dans une grille de transformation d’image (3× la somme des itérations précédentes).
+</p>
+
+<h4 id="GetDerivative"><span class="section-number">5.3.2.3.</span> Obtention de la dérivée en un point</h4>
+<p>
+Cette discussion n’aurait pas un grand intérêt si le coût du calcul des dérivées des projections cartographiques
+était élevé par rapport aux coût de la projection des points. Mais lorsque l’on dérive analytiquement les équations
+des projections, on constate que les calculs des positions et de leurs dérivées ont souvent plusieurs termes en commun.
+En outre le calcul des dérivées est simplifié lorsque le code Java effectuant les projections ne se concentre que sur le « noyau » non-linéaire,
+après s’être déchargé des parties linéaires en les déléguant aux transformations affines comme le fait <abbr title="Spatial Information System">SIS</abbr>.
+Les implémentations des projections cartographiques dans Apache <abbr>SIS</abbr> tirent parti de ces propriétés en ne calculant les dérivées que si elles sont demandées,
+et en offrant une méthode qui permet de projeter un point et obtenir sa dérivée en une seule opération afin de permettre à <abbr>SIS</abbr> de réutiliser un maximum de termes communs.
+Exemple:</p>
+
+<pre>AbstractMathTransform projection = ...;         <code class="comment">// Une projection cartographique de Apache SIS.
+</code><b>double</b>[] sourcePoint = {longitude, latitude};   <code class="comment">// La coordonnée géographique que l’on veut projeter.
+</code><b>double</b>[] targetPoint = <b>new</b> <b>double</b>[2];           <code class="comment">// Là où on mémorisera le résultat de la projection.
+</code>Matrix   derivative  = projection.transform(sourcePoint, 0, targetPoint, 0, <b>true</b>);</pre>
+
+<p>
+Apache <abbr>SIS</abbr> est capable combiner les dérivées des projections cartographiques de la même façon que pour les
+projections de coordonnées: concaténation d’une chaîne de transformations, inversion, opérer sur un sous-ensemble des
+dimensions, <i>etc.</i>
+</p>
+
+<p>
+L’approche décrite dans la section sur les <a href="#DerivativeAndEnvelope">projection d’enveloppes</a>
+est implémentée par la méthode statique <code class="SIS">Envelopes​.transform(CoordinateOperation, Envelope)</code> de <abbr>SIS</abbr>.
+</p>
+</section>
+<section>
+<header>
+<h1 id="Geometry"><span class="section-number">6.</span> Géométries</h1>
+<nav><div class="chapter-links"><div class="previous-chapter">⬅ <a href="#Referencing">Chapitre précédent</a></div><div class="next-chapter"><a href="#Coverage">Chapitre suivant</a> ➡</div></div></nav>
 </header>
 <nav>Dans ce chapitre:<ul class="toc">
 <li><a href="#Geometry-root">Classes de base</a><ul>
@@ -2016,7 +2580,7 @@ et les classes de Apache <abbr title="Sp
 
 
 
-<h2 id="Geometry-root"><span class="section-number">5.1.</span> Classes de base</h2>
+<h2 id="Geometry-root"><span class="section-number">6.1.</span> Classes de base</h2>
 <p>
 Chaque objet géométrique est considéré comme un ensemble infini de points.
 En tant qu’ensemble, leurs opérations les plus fondamentales sont de même nature que les opérations standards des collections du Java.
@@ -2037,7 +2601,7 @@ Les interfaces de GeoAPI utilisent plut�
 
 
 
-<h3 id="DirectPosition"><span class="section-number">5.1.1.</span> Points et positions directes</h3>
+<h3 id="DirectPosition"><span class="section-number">6.1.1.</span> Points et positions directes</h3>
 <p>
 <abbr title="International Organization for Standardization">ISO</abbr> 19107 définit deux types de structures pour représenter un point:
 <code class="OGC">GM_Point</code> et <code class="OGC">DirectPosition</code>.
@@ -2059,7 +2623,7 @@ ou occasionnellement des <code class="Ge
 
 
 
-<h3 id="Envelope"><span class="section-number">5.1.2.</span> Enveloppes</h3>
+<h3 id="Envelope"><span class="section-number">6.1.2.</span> Enveloppes</h3>
 <p>
 Les enveloppes stockent les valeurs minimales et maximales des coordonnées d’une géométrie.
 Les enveloppes <em>ne sont pas</em> elles-mêmes des géométries; ce ne sont pas des ensembles
@@ -2092,7 +2656,7 @@ doivent être comprises au sens mathéma
 
 
 
-<h4 id="AntiMeridian"><span class="section-number">5.1.2.1.</span> Enveloppes traversant l’antiméridien</h4>
+<h4 id="AntiMeridian"><span class="section-number">6.1.2.1.</span> Enveloppes traversant l’antiméridien</h4>
 <p>
 Les minimums et maximums sont les valeurs les plus souvent assignées aux <code class="OGC">lowerCorner</code>
 et <code class="OGC">upperCorner</code>. Mais les choses se compliquent dans le cas d’une enveloppe traversant
@@ -2185,7 +2749,7 @@ est vrai, alors il est garanti que l’e
 </section>
 <section>
 <header>
-<h1 id="Coverage"><span class="section-number">6.</span> Couvertures de données (<i>Coverages</i>)</h1>
+<h1 id="Coverage"><span class="section-number">7.</span> Couvertures de données (<i>Coverages</i>)</h1>
 <nav><div class="chapter-links"><div class="previous-chapter">⬅ <a href="#Geometry">Chapitre précédent</a></div></div></nav>
 </header>
 <nav>Dans ce chapitre:<ul class="toc"/></nav>




Mime
View raw message