blob: 8d22b336f1325f3dca0006d9e8c2277efb46a7dc [file] [log] [blame]
<?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" xml:lang="fr">
<head>
<title>GeoAPI</title>
<meta charset="UTF-8"/>
<link rel="stylesheet" type="text/css" href="../../../content/book/book.css"/>
</head>
<body>
<!--
Content below this point is copied in "../../content/book/fr/developer-guide.html"
by the 'org.apache.sis.internal.book.Assembler' class in 'sis-build-helper' module.
-->
<section>
<header>
<h2 id="GeoAPI">Des modèles conceptuels vers des interfaces Java: GeoAPI</h2>
</header>
<p>
Le projet <a href="http://www.geoapi.org">GeoAPI</a> offre un ensemble d’interfaces Java pour les applications géo-spatiales.
Dans une séries de paquets <code>org.opengis.*</code>, GeoAPI définit des structures représentant des méta-données,
des systèmes de référence des coordonnées, ainsi que des opérations effectuant des projections cartographiques.
Dans une partie qui n’est pas encore standardisée — dénommée <i>pending</i> — GeoAPI définit des structures
représentant des images géo-référencées, des géométries, des filtres pouvant s’appliquer à des requêtes, et d’autres fonctionnalités.
Ces interfaces suivent de très près les spécifications de l’<abbr>OGC</abbr>, tout en les interprétant et en les adaptant
de manière à répondre aux attentes des développeurs Java — par exemple en se conformant aux conventions de nommage.
Ces interfaces bénéficient à la fois aux applications clientes et aux bibliothèques:
</p>
<ul>
<li><p>
Les développeurs des applications clientes bénéficient d’une plus grande base de connaissances disponible sur internet
(due aux nombreuses publications en lien avec les standards de l’<abbr>OGC</abbr>), ainsi que d’une interopérabilité accrue.
L’interopérabilité est facilitée par une meilleure séparation entre les applications qui <em>appellent</em> les fonctions de GeoAPI,
et les bibliothèques qui <em>implémentent</em> GeoAPI. Il s’agit d’une séparation similaire à celle qu’offrent les interfaces
<a href="http://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/"><abbr>JDBC</abbr></a> (<i>Java Database Connectivity</i>) du Java standard.
En utilisant l’<abbr>API</abbr> des interfaces, les développeurs peuvent faire abstraction de l’implémentation sous-jacente.
Par exemple ils peuvent effectuer des projections cartographiques à l’aide des bibliothèques
<a href="http://www.geoapi.org/geoapi-proj4/index.html">Proj.4</a> ou Apache <abbr>SIS</abbr>,
sans changer leurs programmes lorsqu’ils changent de bibliothèque.
</p></li>
<li><p>
Les développeurs des bibliothèques héritent de l’expertise des auteurs des spécifications, via les modèles que représentent les interfaces.
GeoAPI fournit aussi un cadre dans lequel les développeurs peuvent implémenter en priorité les fonctionnalité qui leurs sont le plus nécessaires,
tout en ayant des points où raccrocher les développements futurs.
Par exemple les clients peuvent appeler une fonction de GeoAPI même si elle n’est pas encore supportée par la bibliothèque,
quitte à obtenir une valeur nulle en attendant qu’une nouvelle version de la bibliothèque retourne une valeur intéressante.
</p></li>
</ul>
<details>
<summary>Pour en savoir plus sur les origines du projet GeoAPI</summary>
<article id="GeoAPI-history">
<header>
<h2>Historique du projet GeoAPI</h2>
</header>
<p>
En 2001, le consortium <i>Open GIS</i> (l’ancien nom du consortium <i>Open Geospatial</i>) publia la spécification d’implémentation
<a href="https://www.ogc.org/standards/ct"><abbr>OGC</abbr> 01-009: <cite>Coordinate Transformation Services</cite></a>.
Cette spécification, élaborée par <i>Computer Aided Development Corporation</i> (Cadcorp),
était accompagnée d’interfaces <abbr>COM</abbr>, <abbr>CORBA</abbr> et Java.
À cette époque, la vague des services web n’avait pas encore éclipsé les interfaces de programmation classiques.
Les interfaces de l’<abbr>OGC</abbr> anticipaient tout de même un monde connecté en réseau,
mais misaient plutôt — dans le cas du Java — sur la technologie <abbr>RMI</abbr> (<i>Remote Method Invocation</i>).
Bien que le projet GeoAPI n’existait pas encore, nous désignons rétrospectivement ces interfaces historiques sous le nom de
« <a href="http://www.geoapi.org/0.1/index.html">GeoAPI 0.1</a> ».
Ces interfaces utilisaient déjà le nom de paquet <code>org.opengis</code>, qui sera adopté par GeoAPI.
</p><p>
En 2002, des développeurs de projets libres ont lancé un
<a href="http://web.archive.org/web/20030509104308/http://digitalearth.org/story/2002/10/10/55046/206">appel à la création d’un <abbr>API</abbr> géo-spatial</a>.
La proposition initiale suscita l’intérêt d’au moins cinq projets libres.
Le projet fut créé sur <a href="http://sourceforge.net/projects/geoapi/">SourceForge</a>,
qui héberge depuis lors le code source dans un <a href="http://www.geoapi.org/source-repository.html">dépôt Subversion</a>.
Le projet pris le nom de « GeoAPI » à ce moment là, et utilisa les interfaces de la spécification <abbr>OGC</abbr> 01-009 comme point de départ.
</p><p>
Quelques mois plus tard, l’<abbr>OGC</abbr> lança le projet
<a href="https://www.ogc.org/standards/go"><abbr>GO-1</abbr>: <i>Geographic Objects</i></a>,
qui poursuivait des buts similaires à ceux de GeoAPI.
Entre-temps, l’<abbr>OGC</abbr> avait abandonné certaines de leur spécifications en faveur des normes <abbr>ISO</abbr>.
GeoAPI et <abbr>GO-1</abbr> ont joint leurs efforts pour une refonte des interfaces de GeoAPI en les basant sur ces nouvelles normes <abbr>ISO</abbr>.
La première mouture, <a href="http://www.geoapi.org/1.0/index.html">GeoAPI 1.0</a>, a servit de point de départ
aux premières ébauches de la spécification <abbr>OGC</abbr> 03-064 du groupe de travail <abbr>GO</abbr>-1.
La version finale de cette spécification est devenue un standard <abbr>OGC</abbr> en 2005, et
<a href="http://www.geoapi.org/2.0/index.html">GeoAPI 2.0</a> a été publiée à cette occasion.
</p><p>
Le projet <abbr>GO</abbr>-1 était porté essentiellement par une compagnie nommée <i>Polexis</i>.
Son rachat par <i>Sys Technology</i> et le changement de priorité des nouveaux propriétaires
ont causé l’arrêt des travaux de <abbr>GO</abbr>-1, et par ricochet un ralentissement des développements de GeoAPI.
Afin de reprendre les développements, un nouveau groupe de travail « GeoAPI 3.0 » a été créé à l’<abbr>OGC</abbr>.
Ce groupe a réduit les ambitions par rapport à GeoAPI 2.0 en se concentrant sur les interfaces les plus stables,
et en plaçant les autres — notamment les géométries — dans un module nommé « <a href="http://www.geoapi.org/geoapi-pending/index.html">pending</a> »,
pour considérations futures. <a href="http://www.geoapi.org/3.0/index.html">GeoAPI 3.0</a> est devenu un
<a href="https://www.ogc.org/standards/geoapi">standard <abbr>OGC</abbr></a> en 2011.
Cette version a été la première à être déployée dans le <a href="http://search.maven.org/#search|ga|1|geoapi">dépôt central de Maven</a>.
</p>
</article>
</details>
<p id="GeoAPI-core">
GeoAPI est constitué de plusieurs modules.
Les modules <code>geoapi</code> et <code>geoapi-pending</code>
fournissent les interfaces dérivées des schémas <abbr>UML</abbr> des standards internationaux.
Le modèle conceptuel sera expliqué en détails dans les chapitres décrivant l’implémentation Apache <abbr>SIS</abbr>.
On peut toutefois avoir un aperçu de son contenu en consultant la page listant les
<a href="http://www.geoapi.org/3.0/javadoc/content.html">types et méthodes de GeoAPI et les standards d’où ils proviennent</a>.
Ces modules ainsi que la correspondance entre GeoAPI et les standards internationaux sont décrits plus en détails
<a href="#SpecificationToInterfaces">en annexe</a>.
</p>
<h3 id="GeoAPI-implementation">Implémentations fournies par Apache SIS</h3>
<p>
Apache SIS implémente la plupart des interfaces de GeoAPI avec une classe du même nom que l’interface,
mais préfixée de « <code>Abstract</code> », « <code>Default</code> » ou « <code>General</code> ».
Les classes de Apache SIS qui sont préfixées par « <code>Default</code> » peuvent être instanciées directement
par une instruction <code>new DefaultXXX(…)</code> ou par la méthode <code>createXXX(…)</code> correspondante d’une fabrique.
</p>
<div class="example"><b>Example:</b> pour représenter un système de référence de coordonnées projetées (Mercator, Lambert, <i>etc</i>):
<ul>
<li><code>org.opengis.referencing.crs.ProjectedCRS</code> est l’interface définie par GeoAPI sur la base du standard ISO 19111, et</li>
<li><code>org.apache.sis.referencing.crs.DefaultProjectedCRS</code> est l’implémentation fournie par Apache SIS.</li>
</ul>
Une instance peut être créée par:
<ul>
<li><code>ProjectedCRS crs = new DefaultProjectedCRS(…)</code>, ou</li>
<li><code>ProjectedCRS crs = CRSFactory.createProjectedCRS(…)</code>.</li>
</ul>
Les deux approches attendent les mêmes arguments (omis dans cet exemple).
</div>
<p>
Dans la configuration par défaut de Apache SIS,
utiliser <code>FooFactory.createXXX(…)</code> ou <code>new DefaultXXX(…)</code> revient presque au même
excepté que les <code>FooFactory</code> peuvent retourner des instances existantes
plutôt que de créer systématiquement de nouvelles instances,
et que les exceptions en cas d’arguments invalides sont de types différents.
Dans des configurations plus avancées, l’usage des <code>Factory</code> permet de
<a href="#ServiceLoader">réduire la dépendance directe d’une application envers SIS</a>
et de permettre une inversion de contrôle.
</p><p>
Le préfix « <code>General</code> » est parfois utilisé à la place de « <code>Default</code> »
afin de signaler que des implémentations alternatives existent pour des cas spécifiques.
Par exemple l’interface <code>Envelope</code> est implémentée par au moins deux classes de Apache SIS:
<code>GeneralEnvelope</code> et <code>Envelope2D</code>.
La première implémentation peut représenter des enveloppes de n’importe quelle dimension
alors que la seconde implémentation est spécialisée pour les enveloppes à deux dimensions.
</p><p>
Les classes de Apache SIS qui sont préfixées par « <code>Abstract</code> » ne doivent pas – en principe – être instanciées.
Il faut plutôt instancier une sous-classe non-abstraites.
Toutefois plusieurs classes de SIS ne sont abstraites que conceptuellement,
sans que la définition de la classe ne contienne le mot-clé <code>abstract</code> du Java.
Ces classes peuvent être instanciées par l’instruction <code>new AbstractXXX(…)</code>
– mais pas par les <code>Factory</code> – malgré qu’elles soient conceptuellement abstraites.
Mais ces instanciations ne devraient être faites qu’en dernier recours,
lorsqu’il n’est vraiment pas possible de déterminer le sous-type exact.
</p>
</section>
</body>
</html>