sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From build...@apache.org
Subject svn commit: r1013165 - in /websites/staging/sis/trunk/content: ./ faq_fr.html fr/faq.html
Date Tue, 30 May 2017 16:48:18 GMT
Author: buildbot
Date: Tue May 30 16:48:18 2017
New Revision: 1013165

Log:
Staging update by buildbot for sis

Added:
    websites/staging/sis/trunk/content/faq_fr.html
Removed:
    websites/staging/sis/trunk/content/fr/faq.html
Modified:
    websites/staging/sis/trunk/content/   (props changed)

Propchange: websites/staging/sis/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue May 30 16:48:18 2017
@@ -1 +1 @@
-1796852
+1796893

Added: websites/staging/sis/trunk/content/faq_fr.html
==============================================================================
--- websites/staging/sis/trunk/content/faq_fr.html (added)
+++ websites/staging/sis/trunk/content/faq_fr.html Tue May 30 16:48:18 2017
@@ -0,0 +1,463 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+    <link rel="stylesheet" type="text/css" media="screen" href="css/bootstrap.min.css">
+    <link rel="stylesheet" type="text/css" media="screen" href="http://www.apache.org/css/code.css">
+    <link rel="stylesheet" type="text/css" media="screen" href="css/sis.css">
+
+    
+
+    
+    
+  </head>
+
+  <body>
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="/index.html"> Apache SIS&trade; </a>
+          <div class="nav-collapse">
+            <ul class="nav">
+              <li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown">About<b class="caret"></b></a>
+                <ul class="dropdown-menu">
+                  <li><a href="mail-lists.html">Mailing Lists</a></li>
+                  <li><a href="license.html">Project License</a></li>
+                  <li><a href="team-list.html">Project Team</a></li>
+                </ul>
+              </li>
+              <li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown">Project Documentation<b class="caret"></b></a>
+                <ul class="dropdown-menu">
+                  <li><a href="book/en/developer-guide.html">Developer guide</a></li>
+                  <li><a href="apidocs/index.html">Online Javadoc</a></li>
+                  <li><a href="downloads.html">Downloads</a></li>
+                  <li><a href="source.html">Source Code</a></li>
+                  <li><a href="code-patterns.html">Code patterns</a></li>
+                  <li><a href="faq.html">FAQ</a></li>
+                  <li><a href="https://issues.apache.org/jira/browse/SIS">Issue Tracker</a></li>
+                </ul>
+              </li>
+              <li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown">ASF <b class="caret"></b></a>
+                <ul class="dropdown-menu">
+                  <li><a href="http://www.apache.org">The Foundation</a></li>
+                  <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+                  <li><a href="http://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
+                  <li><a href="http://www.apache.org/security/">Security</a></li>
+                </ul>
+              </li>
+            </ul>
+          </div> <!-- /.nav-collapse -->
+        </div><!-- /.container -->
+      </div><!-- /.navbar-inner -->
+    </div>
+
+    <div class="container-fluid">
+      <div class="row-fluid">
+        <div class="span2">
+          <img src="img/logo.png"/>
+          <div class="well sidebar-nav">
+            <ul class="nav nav-list">
+              <li class="active"><a href="index.html">Home</a></li>
+              <li><a href="mail-lists.html">Mailing Lists</a></li>
+              <li><a href="license.html">Project License</a></li>
+              <li><a href="team-list.html">Project Team</a></li>
+              <li class="nav-header">Project Documentation</li>
+              <li><a href="book/en/developer-guide.html">Developer guide</a></li>
+              <li><a href="apidocs/index.html">Online Javadoc</a></li>
+              <li><a href="downloads.html">Downloads</a></li>
+              <li><a href="source.html">Source Code</a></li>
+              <li><a href="code-patterns.html">Code patterns</a></li>
+              <li><a href="faq.html">FAQ</a></li>
+              <li><a href="https://issues.apache.org/jira/browse/SIS">Issue Tracker</a></li>
+              <li class="nav-header">ASF</li>
+              <li><a href="http://www.apache.org">The Foundation</a></li>
+              <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+              <li><a href="http://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a></li>
+              <li><a href="http://www.apache.org/security/">Security</a></li>
+            </ul>
+          </div><!--/.well -->
+        </div><!--/span-->
+        <div class="span10">
+          <section id="content" class="row">
+            <article class="span12">
+              <p class="page-title"></p>
+              <style type="text/css">
+/* The following code is added by mdx_elementid.py
+   It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+  visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
+<div class="toc">
+<ul>
+<li><a href="#referencing">Géoréférencement</a><ul>
+<li><a href="#referencing-intro">Pour bien commencer</a><ul>
+<li><a href="#transform-point">Comment transformer une coordonnée ?</a></li>
+<li><a href="#operation-methods">Quelles projections sont supportées ?</a></li>
+<li><a href="#axisOrder">Qu’est ce que le problème d’ordre des axes et comment est il abordé ?</a></li>
+</ul>
+</li>
+<li><a href="#crs">Systèmes de Référence des Coordonnées</a><ul>
+<li><a href="#UTM">Comment créer une projection de type Universal Transverse universelle de Mercator (UTM) ?</a></li>
+<li><a href="#google">Comment instancier une projection Google ?</a></li>
+<li><a href="#projectionKind">Comment puis-je identifier le type de projection d’un CRS ?</a></li>
+<li><a href="#lookupEPSG">Comment obtenir le code EPSG d’un CRS existant ?</a></li>
+<li><a href="#lookupURN">Comment obtenir l’URN "urn:ogc:def:crs:…" d’un CRS existant ?</a></li>
+<li><a href="#lookupReliability">Puis-je m’appuyer sur IdentifiedObjects.lookupEPSG(…) comme inverse de CRS.forCode(…) ?</a></li>
+<li><a href="#equalsIgnoreMetadata">Comment déterminer si deux CRS sont "fonctionnellement" égaux ?</a></li>
+<li><a href="#crsHashCode">Est-ce que les CRS sont utilisables comme clé dans un HashMap ?</a></li>
+</ul>
+</li>
+<li><a href="#transforms">Transformation de coordonnées</a><ul>
+<li><a href="#axisOrderInTransforms">Mes coordonnées transformées sont totalement fausses !</a></li>
+<li><a href="#projectionName">Les ordres des axes sont corrects mais les coordonnées transformées sont encore fausses.</a></li>
+<li><a href="#parameterUnits">J’ai juste utilisé le WKT d’une autorité connue et mes coordonnées transformées sont toujours fausses !</a></li>
+<li><a href="#BursaWolf">J’ai vérifié tous ce qui est ci-dessus et j’ai toujours une erreur d’environ un kilomètre.</a></li>
+<li><a href="#slightDifferences">J’obtiens des résultats légèrement différents d’un environnement d’exécution à l’autre.</a></li>
+<li><a href="#toWGS84">Puis-je présumer qu’il est toujours possible de transformer un CRS arbitraire vers WGS84 ?</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a href="#metadata">Métadonnées</a><ul>
+<li><a href="#metadata-implementation">Implementations sur mesures</a><ul>
+<li><a href="#metadata-proxy">Mes metadonnées sont stockées dans une forme de base de données. Implémenter toute les interfaces de GeoAPI est infaisable.</a></li>
+<li><a href="#metadata-unknownClass">Je n’arrive pas à écrire mon implémentation de metadonnée</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a href="#abreviations-utilisees-dans-ce-faq">Abréviations utilisées dans ce FAQ</a></li>
+</ul>
+</div>
+<h1 id="referencing">Géoréférencement<a class="headerlink" href="#referencing" title="Permanent link">&para;</a></h1>
+<h2 id="referencing-intro">Pour bien commencer<a class="headerlink" href="#referencing-intro" title="Permanent link">&para;</a></h2>
+<h3 id="transform-point">Comment transformer une coordonnée ?<a class="headerlink" href="#transform-point" title="Permanent link">&para;</a></h3>
+<p>Le code java suivant projète une coordonnée de <em>World Geodetic System 1984</em> (WGS84) vers <em>WGS 84 / UTM zone 33N</em>.</p>
+<p>Afin de rendre cet exemple un peu plus simple, le code utilise des constantes prédéfinies dans la classe <code>CommonCRS</code>
+mais les applications plus avancées utilisent habituellement des codes EPSG à la place.</p>
+<p>Note : les coordonnées ci-dessous sont en latitude puis longitude.</p>
+<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">org.opengis.geometry.DirectPosition</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.opengis.referencing.crs.CoordinateReferenceSystem</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.opengis.referencing.operation.CoordinateOperation</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.opengis.referencing.operation.TransformException</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.opengis.util.FactoryException</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.sis.referencing.CRS</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.sis.referencing.CommonCRS</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.sis.geometry.DirectPosition2D</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyApp</span> <span class="o">{</span>
+    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">FactoryException</span><span class="o">,</span> <span class="n">TransformException</span> <span class="o">{</span>
+        <span class="n">CoordinateReferenceSystem</span> <span class="n">sourceCRS</span> <span class="o">=</span> <span class="n">CommonCRS</span><span class="o">.</span><span class="na">WGS84</span><span class="o">.</span><span class="na">geographic</span><span class="o">();</span>
+        <span class="n">CoordinateReferenceSystem</span> <span class="n">targetCRS</span> <span class="o">=</span> <span class="n">CommonCRS</span><span class="o">.</span><span class="na">WGS84</span><span class="o">.</span><span class="na">UTM</span><span class="o">(</span><span class="mi">40</span><span class="o">,</span> <span class="mi">14</span><span class="o">);</span>  <span class="c1">// Get whatever zone is valid for 14°E.</span>
+        <span class="n">CoordinateOperation</span> <span class="n">operation</span> <span class="o">=</span> <span class="n">CRS</span><span class="o">.</span><span class="na">findOperation</span><span class="o">(</span><span class="n">sourceCRS</span><span class="o">,</span> <span class="n">targetCRS</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
+
+        <span class="c1">// Les lignes ci-dessus sont coûteuses et ne devraient être appelées qu’une fois pour un ensemble de points.</span>
+        <span class="c1">// Dans cet exemple, l’opération que l’on obtient est valide pour la zone géographique allant</span>
+        <span class="c1">// de 12°E à 18°E (UTM zone 33) et de 0°N à 84°N.</span>
+
+        <span class="n">DirectPosition</span> <span class="n">ptSrc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DirectPosition2D</span><span class="o">(</span><span class="mi">40</span><span class="o">,</span> <span class="mi">14</span><span class="o">);</span>           <span class="c1">// 40°N 14°E</span>
+        <span class="n">DirectPosition</span> <span class="n">ptDst</span> <span class="o">=</span> <span class="n">operation</span><span class="o">.</span><span class="na">getMathTransform</span><span class="o">().</span><span class="na">transform</span><span class="o">(</span><span class="n">ptSrc</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
+
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Source: &quot;</span> <span class="o">+</span> <span class="n">ptSrc</span><span class="o">);</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Target: &quot;</span> <span class="o">+</span> <span class="n">ptDst</span><span class="o">);</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<h3 id="operation-methods">Quelles projections sont supportées ?<a class="headerlink" href="#operation-methods" title="Permanent link">&para;</a></h3>
+<p>Les formules supportées par Apache SIS (incluant les projections cartographiques, mais pas uniquement)
+sont listées sur la page <a href="tables/CoordinateOperationMethods.html">Coordinate Operation Methods</a>.
+La quantité de formules de projection est relativement faible,
+mais la quantité de <em>Systèmes de Coordonées projetés</em> que l’on peut construire avec est considérable.
+Par exemple, avec seulement trois familles de formules (<em>Mercator Cylindrique</em>, <em>Mercator Transverse</em> et <em>Lambert Conforme Conique</em>),
+utilisées avec différents paramètres, on peut couvrir des milliers de projections listées dans la base EPSG.</p>
+<p>Afin d’utiliser une formule de projection, il est nécessaire de connaître les paramètres de la projection.
+Par soucis de facilité d’utilisation, des milliers de projections avec des paramètres pré-définis ont un identifiant unique.
+Une source bien connue de ces définitions est la base de données EPSG, mais il existe d’autres autorités.
+Les systèmes de coordonnées prédéfinis dans Apache SIS sont listés à la page
+<a href="tables/CoordinateReferenceSystems.html">Coordinate Reference Systems</a>.</p>
+<h3 id="axisOrder">Qu’est ce que le problème d’ordre des axes et comment est il abordé ?<a class="headerlink" href="#axisOrder" title="Permanent link">&para;</a></h3>
+<p>L’ordre des axes est spécifié par l’autorité (typiquement un organisme public) qui défini les Systèmes de Référence des Coordonnées (CRS).
+L’ordre dépend du type de CRS et du pays qui définit le CRS.
+Dans le cas d’un CRS géographique, l’ordre des axes (<em>latitude</em>, <em>longitude</em>) est largement répandu chez les géographes et les pilotes depuis des siècles.
+Toutefois certains développeurs de logiciels ont tendance à toujours utiliser l’ordre (<em>x</em>, <em>y</em>) pour tous les CRS.
+Ces pratiques différentes ont conduit à des définitions contradictoires d’ordre des axes pour presque tous les CRS de type <code>GeographicCRS</code>,
+pour certains <code>ProjectedCRS</code> de l’hémisphère sud (Afrique de sud, Australie, <em>etc.</em>) et pour certaines projections polaires entre autre.</p>
+<p>Pour chaque CRS identifié par un code EPSG, l’ordre officiel des axes peut être vérifié avec
+le registre EPSG à l’adresse <a href="http://www.epsg-registry.org">http://www.epsg-registry.org</a>
+(à ne pas confondre avec d’autres sites ayant "epsg" dans leur nom
+mais qui sont sans aucune relation avec l’organisme en charge des définitions EPSG) :
+Cliquez sur le lien <em>"Retrieve by code"</em> et entrez le code numérique.
+Cliquez ensuite sur le lien <em>"View"</em> de la partie droite
+et cliquez sur le symbole <em>"+"</em> à gauche de <em>"Axes"</em>.</p>
+<p>Les standards OGC récents stipulent que l’ordre des axes est celui défini par l’autorité.
+Les standards OGC plus anciens utilisaient l’ordre des axes (<em>x</em>, <em>y</em>), ignorant la définition de l’autorité.
+Parmi les standards OGC obsolètes qui utilisent un ordre des axes non-conforme,
+l’un des plus influent est la version 1 de la spécification <em>Well Known Text</em> (WKT).
+Selon ce format très utilisé, les définitions WKT sans éléments <code>AXIS[…]</code>
+doivent par défaut être dans l’ordre (<em>longitude</em>, <em>latitude</em>) ou (<em>x</em>, <em>y</em>).
+Dans la version 2 du format WKT, les éléments <code>AXIS[…]</code> ne sont plus optionnels
+et doivent contenir explicitement le sous-élément <code>ORDER[…]</code> pour appuyer l’ordre des axes à appliquer.</p>
+<p>Beaucoup de logiciels utilisent toujours l’ancien ordre des axes (<em>x</em>, <em>y</em>), parfois parce qu’il est plus simple à implémenter.
+Mais Apache SIS suit l’ordre des axes <em>tel que défini par l’autorité</em> (à l’exception de la lecture de fichier WKT 1).
+Il permet toutefois de changer l’ordre des axes après la création d’un CRS.
+Ce changement se fait avec le code suivant :</p>
+<div class="codehilite"><pre><span class="n">CoordinateReferenceSystem</span> <span class="n">crs</span> <span class="o">=</span> <span class="err">…</span><span class="o">;</span>             <span class="c1">// CRS obtenu de n’importe quelle façon.</span>
+<span class="n">crs</span> <span class="o">=</span> <span class="n">AbstractCRS</span><span class="o">.</span><span class="na">castOrCopy</span><span class="o">(</span><span class="n">crs</span><span class="o">).</span><span class="na">forConvention</span><span class="o">(</span><span class="n">AxesConvention</span><span class="o">.</span><span class="na">RIGHT_HANDED</span><span class="o">)</span>
+</pre></div>
+
+
+<h2 id="crs">Systèmes de Référence des Coordonnées<a class="headerlink" href="#crs" title="Permanent link">&para;</a></h2>
+<h3 id="UTM">Comment créer une projection de type Universal Transverse universelle de Mercator (UTM) ?<a class="headerlink" href="#UTM" title="Permanent link">&para;</a></h3>
+<p>Si la zone UTM n’est pas connue, une façon simple est d’utiliser la méthode <code>universal(…)</code> sur l’une des constantes de <code>CommonCRS</code>.
+Cette méthode prend en argument une coordonnées géographique en (<em>latitude</em>, <em>longitude</em>) et en calcule la zone UTM correspondante.
+Voir <a href="#transform-point">le code java ci-dessus</a>.</p>
+<p>Si la zone UTM est connue, une solution est d’utiliser la fabrique des autorités "EPSG" ou "AUTO".
+Le code EPSG de certaines projections UTM peut être déterminé comme suit,
+où <em>zone</em> est un nombre de 1 à 60 inclusif (sauf spécifié autrement) :</p>
+<ul>
+<li>WGS 84 (northern hemisphère nord): 32600 + <em>zone</em></li>
+<li>WGS 84 (hemisphère sud): 32700 + <em>zone</em></li>
+<li>WGS 72 (hemisphère nord): 32200 + <em>zone</em></li>
+<li>WGS 72 (hemisphère sud): 32300 + <em>zone</em></li>
+<li>NAD 83 (hemisphère nord): 26900 + <em>zone</em> (zone de 1 à 23)</li>
+<li>NAD 27 (hemisphère nord): 26700 + <em>zone</em> (zone de 1 à 22)</li>
+</ul>
+<p>Notez que la liste ci-dessus est incomplète. Voir la base EPSG pour d’avantages de définitions UTM
+(WGS 72BE, SIRGAS 2000, SIRGAS 1995, SAD 69, ETRS 89, <em>etc.</em>, la plupart définissent quelques zones).
+Une fois que le code EPSG de la projection UTM est déterminé, le CRS peut être obtenu comme dans l’exemple ci-dessous:</p>
+<div class="codehilite"><pre><span class="kt">int</span> <span class="n">code</span> <span class="o">=</span> <span class="mi">32600</span> <span class="o">+</span> <span class="n">zone</span><span class="o">;</span>    <span class="c1">// Pour l’hémisphère nord WGS84</span>
+<span class="n">CoordinateReferenceSystem</span> <span class="n">crs</span> <span class="o">=</span> <span class="n">CRS</span><span class="o">.</span><span class="na">forCode</span><span class="o">(</span><span class="s">&quot;EPSG:&quot;</span> <span class="o">+</span> <span class="n">code</span><span class="o">);</span>
+</pre></div>
+
+
+<h3 id="google">Comment instancier une projection Google ?<a class="headerlink" href="#google" title="Permanent link">&para;</a></h3>
+<p>La projection Google est une projection de Mercator qui prétend utiliser un référentiel WGS84
+mais qui ignore la nature ellipsoïdale de ce référentiel et utilise un forme sphérique des formules à la place.
+Depuis la version 6.15 de la base EPSG, la façon privilégiée d’obtenir cette projection est d’utiliser la méthode <code>CRS.forCode("EPSG:3857")</code>.
+Il faut noter que l’usage de cette projection <strong>n’est pas</strong> recommandé, sauf pour des raisons de compatibilité.</p>
+<p>La définition de EPSG:3857 utilise une formule de projection nommée <em>"Popular Visualisation Pseudo Mercator"</em>.
+La base EPSG propose aussi d’autres projections qui utilisent des formules sphériques.
+Ces méthodes ont le mot "(Spherical)" dans leur nom, par exemple <em>"Mercator (Spherical)"</em>
+(qui diffère de <em>"Popular Visualisation Pseudo Mercator"</em> par l’utilisation d’une sphère de rayon plus approprié).
+Ces formules de projections peuvent être utilisées dans les définitions Well Known Text (WKT).</p>
+<p>Il est possible d’utiliser une formule sphérique avec une projection qui n’a pas de contrepartie sphérique
+en déclarant explicitement les paramètres <code>"semi_major"</code> et <code>"semi_minor"</code> dans la définition WKT.
+Ces paramètres sont généralement déduit du référentiel, mais Apache SIS autorise les déclarations à surcharger ces valeurs.</p>
+<h3 id="projectionKind">Comment puis-je identifier le type de projection d’un CRS ?<a class="headerlink" href="#projectionKind" title="Permanent link">&para;</a></h3>
+<p>Le terme "type de projection" (Mercator, Lambert Conformal, <em>etc.</em>) est appelé <em>Operation Method</em> dans la terminologie ISO 19111.
+Une approche possible est de vérifier la valeur de <code>OperationMethod.getName()</code> et de comparer avec les noms OGC et EPSG
+listés à la page <a href="tables/CoordinateOperationMethods.html">Coordinate Operation Methods</a>.</p>
+<h3 id="lookupEPSG">Comment obtenir le code EPSG d’un CRS existant ?<a class="headerlink" href="#lookupEPSG" title="Permanent link">&para;</a></h3>
+<p>La propriété <em>identifiant</em> d’un CRS peut être obtenue par la méthode <code>getIdentifiers()</code>
+qui retourne une collection de zéro ou un élément.
+Si le CRS a été créé à partir d’un <em>Well Known Text</em> (WKT)
+et que le WKT se termine avec un élément <code>AUTHORITY["EPSG", "xxxx"]</code> (WKT version 1) ou <code>ID["EPSG", xxxx]</code> (WKT version 2,
+alors l’identifiant (un code numérique EPSG dans cet exemple) sera le <em>xxxx</em> de cet élément.
+Si le CRS a été créé à partir de la base EPSG (par exemple avec l’appelle à <code>CRS.forCode("EPSG:xxxx")</code>),
+alors l’identifiant est le code <em>xxxx</em> donné à la méthode.
+Si le CRS a été créé d’une autre façon, alors la collection retournée par la méthode <code>getIdentifiers()</code>
+pourra être vide dans le cas où le programme qui a créé le CRS a aussi pris la responsabilité de fournir les identifiants.</p>
+<p>Si la collection d’identifiants est vide, la méthode la plus efficace de le corriger est de s’assurer que le WKT
+contient un élément <code>AUTHORITY</code> ou <code>ID</code> (en supposant que le CRS vient d’un WKT).
+Si ce n’est pas possible, alors la classe <code>org.​apache.​sis.​referencing.​IdentifiedObjects</code> contient des méthodes utilitaires qui peuvent aider
+Dans l’exemple suivant, l’appel à <code>lookupEPSG(…)</code> va parcourir la base EPSG pour un CRS équivalent (en ignorant les métadonnées).
+<em>Attention, cette recherche est sensible à l’ordre des axes.</em>
+La plupart des CRS géographiques de la base EPSG sont déclarés avec l’ordre des axes (<em>latitude</em>, <em>longitude</em>).
+En conséquence, si le CRS possède un ordre des axes (<em>longitude</em>, <em>latitude</em>), la recherche a toutes les chances de ne pas trouver de résultats.</p>
+<div class="codehilite"><pre><span class="n">CoordinateReferenceSystem</span> <span class="n">myCRS</span> <span class="o">=</span> <span class="err">…</span><span class="o">;</span>
+<span class="n">Integer</span> <span class="n">identifier</span> <span class="o">=</span> <span class="n">IdentifiedObjects</span><span class="o">.</span><span class="na">lookupEPSG</span><span class="o">(</span><span class="n">myCRS</span><span class="o">);</span>
+<span class="k">if</span> <span class="o">(</span><span class="n">identifier</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;The EPSG code has been found: &quot;</span> <span class="o">+</span> <span class="n">identifier</span><span class="o">);</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<h3 id="lookupURN">Comment obtenir l’URN "urn:ogc:def:crs:…" d’un CRS existant ?<a class="headerlink" href="#lookupURN" title="Permanent link">&para;</a></h3>
+<p>L’OGC définit les URN pour les identifiants de CRS, par exemple <code>"urn:​ogc:​def:​crs:​epsg:​7.1:​4326"</code>
+avec <code>"7.1"</code> comme version de la base EPSG utilisée.
+Les URN peuvent ou non être présentes dans la collection d’identifiants retournée par <code>crs.getIdentifiers()</code>.
+Dans beaucoup de cas (principalement quand le CRS provient d’un Well Known Text), seul des identifiants simples comme <code>"EPSG:​4326"</code> sont présents.
+Une façon simple de construire une URN complète est d’utiliser le code ci-dessous.
+Cet exemple peut avoir à parcourir la base EPSG afin de trouver les informations qui n’apparaissent pas explicitement dans <code>myCRS</code>.</p>
+<div class="codehilite"><pre><span class="n">CoordinateReferenceSystem</span> <span class="n">myCRS</span> <span class="o">=</span> <span class="err">…</span><span class="o">;</span>
+<span class="n">String</span> <span class="n">urn</span> <span class="o">=</span> <span class="n">IdentifiedObjects</span><span class="o">.</span><span class="na">lookupURN</span><span class="o">(</span><span class="n">myCRS</span><span class="o">);</span>
+</pre></div>
+
+
+<h3 id="lookupReliability">Puis-je m’appuyer sur IdentifiedObjects.lookupEPSG(…) comme inverse de CRS.forCode(…) ?<a class="headerlink" href="#lookupReliability" title="Permanent link">&para;</a></h3>
+<p>Pour les CRS créés avec la base EPSG, en général oui.
+À noter toutefois que <code>IdentifiedObjects.getIdentifier(…)</code> est moins riche et insensible aux détails de la définition du CRS
+car il n’interroge pas la base de données EPSG. Il marche uniquement si le CRS déclare explicitement son code
+ce qui est le cas des CRS créés à partir de la base EPSG ou lus à partir d’un <em>Well Known Text</em> (WKT) avec un élément <code>AUTHORITY</code> ou <code>ID</code>.
+La méthode <code>lookupEPSG(…)</code> à l’inverse est plus robuste contre les erreurs de déclaration de code car elle compare toujours le CRS avec celui de la base.
+Elle peut échouer s’il y a une légère différence (par exemple d’arrondie dans les paramètres)
+entre le CRS fourni et le CRS trouvé dans la base de données.</p>
+<h3 id="equalsIgnoreMetadata">Comment déterminer si deux CRS sont "fonctionnellement" égaux ?<a class="headerlink" href="#equalsIgnoreMetadata" title="Permanent link">&para;</a></h3>
+<p>Deux CRS peuvent ne pas être considérés égaux s’ils sont associés à des métadonnées différentes
+(nom, identifiant, domaine d’usage, domaine de validité, remarque), même s’ils représentent mathématiquement le même CRS.</p>
+<p>Afin de tester si deux CRS sont fonctionnellement équivalents, utilisez la méthode <code>Utilities.equalsIgnoreMetadata(myFirstCRS, mySecondCRS)</code>.</p>
+<h3 id="crsHashCode">Est-ce que les CRS sont utilisables comme clé dans un HashMap ?<a class="headerlink" href="#crsHashCode" title="Permanent link">&para;</a></h3>
+<p>Oui, toutes les classes définies dans les paquets <code>org.apache.sis.referencing.crs</code>, <code>cs</code> et <code>datum</code>
+définissent leurs propres méthodes <code>equals(Object)</code> et <code>hashCode()</code>.
+La bibliothèque Apache SIS utilise elle-même les objets CRS dans des <code>Map</code> à des fins de cache.</p>
+<h2 id="transforms">Transformation de coordonnées<a class="headerlink" href="#transforms" title="Permanent link">&para;</a></h2>
+<h3 id="axisOrderInTransforms">Mes coordonnées transformées sont totalement fausses !<a class="headerlink" href="#axisOrderInTransforms" title="Permanent link">&para;</a></h3>
+<p>Ce cas se produit principalement à cause des ordonnées données dans le mauvais ordre.
+Les développeurs ont tendance à présumer que l’ordre des  axes est (<em>x</em>, <em>y</em>) ou (<em>longitude</em>, <em>latitude</em>)
+mais les géographes et pilotes utilisent l’ordre (<em>latitude</em>, <em>longitude</em>) depuis des siècles
+et la base de données EPSG définit les systèmes de coordonnées de cette façon.</p>
+<p>Si une transformation de coordonnées semble produire des valeurs complètement fausses,
+la première chose à faire est d’afficher les CRS source et cible :</p>
+<div class="codehilite"><pre><span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">sourceCRS</span><span class="o">);</span>
+<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">targetCRS</span><span class="o">);</span>
+</pre></div>
+
+
+<p>Une attention particulière doit être portée à l’ordre des éléments <code>AXIS</code>.
+Dans l’exemple ci-dessous, le CRS stipule clairement l’ordre (<em>latitude</em>, <em>longitude</em>) :</p>
+<div class="codehilite"><pre>GeodeticCRS[&quot;WGS 84&quot;,
+  Datum[&quot;World Geodetic System 1984&quot;,
+    Ellipsoid[&quot;WGS 84&quot;, 6378137.0, 298.257223563]],
+  CS[ellipsoidal, 2],
+    Axis[&quot;Geodetic latitude (Lat)&quot;, north],
+    Axis[&quot;Geodetic longitude (Lon)&quot;, east],
+    Unit[&quot;degree&quot;, 0.017453292519943295]]
+</pre></div>
+
+
+<p>Si l’ordre (<em>longitude</em>, <em>latitude</em>) est voulu, Apache SIS est capable de le forcer comme décrit <a href="#axisOrder">ci-dessus</a>.</p>
+<h3 id="projectionName">Les ordres des axes sont corrects mais les coordonnées transformées sont encore fausses.<a class="headerlink" href="#projectionName" title="Permanent link">&para;</a></h3>
+<p>Vérifiez que se sont les bonnes projections qui sont utilisées. Certains noms sont déroutants.
+Par exemple <em>"Oblique Mercator"</em> et <em>"Hotine Oblique Mercator"</em> (dans l’autorité EPSG) sont deux projections différentes.
+Mais <em>"Oblique Mercator"</em> (sans le Hotine) de l’autorité EPSG est aussi appelée <em>"Hotine Oblique Mercator Azimuth Center"</em> par ESRI.
+tandis que <em>"Hotine Oblique Mercator"</em> (de l’autorité EPSG) est appelée <em>"Hotine Oblique Mercator Azimuth Natural Origin"</em> par ESRI.</p>
+<p>La projection <em>"Oblique Stereographic"</em> (de l’autorité EPSG) est appelée <em>"Double Stereographic"</em> par ESRI.
+ESRI définit aussi une projection <em>"Stereographic"</em> qui est en réalité une projection oblique comme la précédente mais avec des formules différentes.</p>
+<h3 id="parameterUnits">J’ai juste utilisé le WKT d’une autorité connue et mes coordonnées transformées sont toujours fausses !<a class="headerlink" href="#parameterUnits" title="Permanent link">&para;</a></h3>
+<p>La spécification <em>Well Known Text</em> (WKT) a été interprétée de différentes façons en fonction des implémentations logicielles.
+Un problème subtil vient des unités d’angles pour le méridien d’origine et les paramètres de projection.
+La spécification WKT 1 stipule clairement : <em>"Si l’élément <code>PRIMEM</code> apparaît dans <code>GEOGCS</code>,
+alors l’unité des longitudes doit correspondre à celle du système de coordonnées géographiques"</em> (traduction libre de OGC 01-009).
+Toutefois ESRI et GDAL entres autres utilisent inconditionnellement des degrés décimaux, ignorant cette partie de la spécification WKT.
+Ce problème peut être identifié en inspectant l’extrait de WKT suivant :</p>
+<div class="codehilite"><pre>PROJCS[&quot;Lambert II étendu&quot;,
+  GEOGCS[&quot;Nouvelle Triangulation Française&quot;, …,
+    PRIMEM[&quot;Paris&quot;, 2.337229167],
+    UNIT[&quot;grad&quot;, 0.01570796326794897]]
+  PROJECTION[&quot;Lambert_Conformal_Conic_1SP&quot;],
+  PARAMETER[&quot;latitude_of_origin&quot;, 46.8], …]
+</pre></div>
+
+
+<p>Le méridien d’origine de Paris est situé à approximativement 2,597 gradians de Greenwich, ce qui correspond à 2,337 degrés.
+À partir de ce fait, on peut voir que le WKT ci-dessus utilise des degrés malgré la déclaration de l’unité <code>UNIT["grad"]</code>.
+Cette erreur s’applique aussi aux valeurs des paramètres, qui déclarent 46,8° dans l’exemple ci-dessus alors que la valeur officielle est de 52 gradians.
+Par défaut, Apache SIS interprète ces valeurs angulaires en gradians quand il lit ce type de WKT, ce qui produit de grandes erreurs.
+Afin d’obtenir le résultat attendu, il est possible de :</p>
+<ul>
+<li>
+<p>Remplacer <code>UNIT["grad", 0.01570796326794897]</code> par <code>UNIT["degree", 0.017453292519943295]</code>,
+    ce qui va assurer que Apache SIS, GDAL et ESRI comprennent ce WKT de la même manière.</p>
+</li>
+<li>
+<p>Ou demander explicitement à Apache SIS de lire le WKT en utilisant les conventions ESRI ou GDAL,
+    avec l’énumération <code>Convention.​WKT1_COMMON_UNITS</code> pour la valeur de <code>WKTFormat</code> dans le paquet <code>org.​apache.​sis.​io.​wkt</code>.</p>
+</li>
+</ul>
+<p>Il est à noter que le standard GeoPackage requiert explicitement la conformité avec OGC 01-009
+et que le nouveau standard WKT 2 suit aussi l’interprétation de OGC 01-009.
+Le comportement par défaut de Apache SIS est cohérent avec ces deux standards.</p>
+<h3 id="BursaWolf">J’ai vérifié tous ce qui est ci-dessus et j’ai toujours une erreur d’environ un kilomètre.<a class="headerlink" href="#BursaWolf" title="Permanent link">&para;</a></h3>
+<p>Les systèmes de coordonnées (CRS) font une approximation de la forme de la terre avec une ellipsoïde.
+Différentes ellipsoïdes (en réalité différents <em>référentiels</em>) sont utilisées dans différents pays du monde et à différents moments de l’histoire.
+Quand on transforme des coordonnées entre deux CRS utilisant le même référentiel, aucun paramètre Bursa-Wolf n’est requis.
+Mais quand la transformation implique un changement de référentiel, le module de géoréférencement à besoin d’informations sur la manière d’effectuer ce changement.</p>
+<p>Il y a plusieurs façon de spécifier comment appliquer un changement de référentiel, et la plupart sont seulement approximatives.
+La méthode de Bursa-Wolf est l’une d’elle, mais pas la seule. Toutefois elle est une des plus fréquemment utilisées.
+Les paramètres Bursa-Wolf peuvent être spécifiés à l’intérieur de l’élément <code>TOWGS84</code> de la version 1 du format <em>Well Known Text</em> (WKT),
+ou dans l’élément <code>BOUNDCRS</code> avec la version 2 du format WKT.
+Si le CRS est lu à partir d’une chaine WKT, assurez-vous qu’elle contient l’élément approprié.</p>
+<h3 id="slightDifferences">J’obtiens des résultats légèrement différents d’un environnement d’exécution à l’autre.<a class="headerlink" href="#slightDifferences" title="Permanent link">&para;</a></h3>
+<p>Les résultats de transformations de coordonnées quand on lance l’application dans un conteneur web (type JBoss, <em>etc.</em>)
+peuvent avoir quelques mètres de différence avec la transformation exécutée dans un IDE (NetBeans, Eclipse, <em>etc.</em>).
+Les résultats dépendent de la présence de la fabrique EPSG dans le chemin de classes (classpath),
+<strong>peu importe comment le CRS a été créé</strong>, parce-que la fabrique EPSG spécifie explicitement l’opération à appliquer pour certaines paires de CRS.
+Dans ces cas, l’opération spécifiée par EPSG a priorité par rapport aux paramètres de Bursa-Wolf
+(l’element <code>TOWGS84</code> de la version 1 du format Well Known Text).</p>
+<p>Une connexion à la base EPSG peut avoir été établie dans un environnement (typiquement celui JEE)
+et pas dans l’autre (typiquement un IDE) car uniquement le premier à un pilote JDBC.
+La méthode recommandée pour uniformiser les résultats est d’ajouter dans le second environnement (l’IDE)
+le même pilote que celui présent dans le premier environnement (JEE).
+Cela devrait être un des suivant : JavaDB (aussi nommé Derby), HSQL ou PostgreSQL.
+Assurez vous également que les <a href="epsg.html">paramètres de connexion à la base EPSG</a> sont les mêmes.</p>
+<h3 id="toWGS84">Puis-je présumer qu’il est toujours possible de transformer un CRS arbitraire vers WGS84 ?<a class="headerlink" href="#toWGS84" title="Permanent link">&para;</a></h3>
+<p>Pour les CRS 2D horizontaux créés avec la base de données EPSG, l’appel à <code>CRS.findOperation(…)</code> devrait toujours marcher.
+Pour les CRS 3D ayant n’importe quel axe de hauteur autre que la hauteur ellipsoïdale, ou pour les CRS 2D de type <code>EngineeringCRS</code>, la méthode peu échouer.</p>
+<p>Il reste à noter que dans le cas ou la méthode <code>CRS.findOperation(…)</code> ne lève pas d’erreur, l’appel à <code>MathTransform.transform(…)</code> peut
+produire des valeurs <code>NaN</code> or <code>Infinity</code>si la coordonnée transformée est éloignée de la zone de validité.</p>
+<h1 id="metadata">Métadonnées<a class="headerlink" href="#metadata" title="Permanent link">&para;</a></h1>
+<h2 id="metadata-implementation">Implementations sur mesures<a class="headerlink" href="#metadata-implementation" title="Permanent link">&para;</a></h2>
+<h3 id="metadata-proxy">Mes metadonnées sont stockées dans une forme de base de données. Implémenter toute les interfaces de GeoAPI est infaisable.<a class="headerlink" href="#metadata-proxy" title="Permanent link">&para;</a></h3>
+<p>Les développeurs n’ont pas besoin d’implémenter directement les interfaces de metadonnées.
+Si le système de stockage sous-jacent peut accéder aux metadonnées à partir de leur classes et nom de propriétés
+(soit le nom java ou le nom ISO/OGC), alors il est possible d’implémenter un seul moteur pour tous les types de metadonnées
+et de laisser la Machine Virtuelle Java implémenter les interfaces GeoAPI à la volée, en utilisant la classe <code>java.lang.reflect.Proxy</code>.
+Pour plus de détails voir la javadoc de la classe <code>Proxy</code>, en gardant à l’esprit que le nom ISO/OGC d’une <code>java.lang.Class</code> ou
+<code>java.lang.reflect.Method</code> peut être obtenu comme suit :</p>
+<div class="codehilite"><pre><span class="n">UML</span> <span class="n">uml</span> <span class="o">=</span> <span class="n">method</span><span class="o">.</span><span class="na">getAnnotation</span><span class="o">(</span><span class="n">UML</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
+<span class="k">if</span> <span class="o">(</span><span class="n">uml</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">String</span> <span class="n">name</span> <span class="o">=</span> <span class="n">uml</span><span class="o">.</span><span class="na">identifier</span><span class="o">();</span>
+    <span class="c1">// Fetch the metadata here.</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>Cette approche est utilisée dans le paquet <code>org.apache.sis.metadata.sql</code> pour fournir une implémentation
+de toutes les interfaces de metadonnées de GeoAPI à partir d’une base de données SQL.</p>
+<h3 id="metadata-unknownClass">Je n’arrive pas à écrire mon implémentation de metadonnée<a class="headerlink" href="#metadata-unknownClass" title="Permanent link">&para;</a></h3>
+<p>Les classes données à un marshaller JAXB doivent contenir des annotations JAXB,
+sinon l’exception suivante sera lancée :</p>
+<div class="codehilite"><pre>javax.xml.bind.JAXBException: class MyCustomClass nor any of its super class is known to this context.
+</pre></div>
+
+
+<p>La solution de contournement la plus simple est de décorer l’implémentation dans une des implémentations
+fournies dans le paquet <code>org.apache.metadata.iso</code>.</p>
+<p>Toutes les implémentations du SDK fournissent des constructeurs de copies peu profondes pour rendre cela plus simple.
+Il est uniquement nécéssaire de décorer la classes racine, pas les attributs.
+Les valeurs des attributs seront décorées automatiquement au besoin par les adaptateurs JAXB.</p>
+<h1 id="abreviations-utilisees-dans-ce-faq">Abréviations utilisées dans ce FAQ<a class="headerlink" href="#abreviations-utilisees-dans-ce-faq" title="Permanent link">&para;</a></h1>
+<ul>
+<li>[CRS]:  Coordinate Reference System</li>
+<li>[ISO]:  International Organization for Standardization</li>
+<li>[JDBC]: Java DataBase Connectivity</li>
+<li>[OGC]:  Open Geospatial Consortium</li>
+<li>[UTC]:  Universal Time Coordinated</li>
+</ul>
+            </article>
+          </section>
+        </div><!--/span-->
+      </div><!--/row-fluid-->
+    </div><!--/container-fluid-->
+
+  <footer class="footer">
+    <div class="container">
+      <p>Copyright &copy; 2013-2017 The Apache Software Foundation, Licensed under the
+        <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.<br />
+          Apache SIS, Apache, the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+    </div>
+  </footer>
+
+  <script src="js/jquery-1.9.1.min.js"></script>
+  <script src="js/bootstrap.min.js"></script>
+
+</body>
+</html>



Mime
View raw message