Dans un projet sur lequel je travaille actuellement, chez Rtone, nous devons récupérer des coordonnées d'un Système d'Information Géographique pour afficher les points sur Google Maps.

Le problème, c'est que le SIG et Google Maps n'utilisent pas le même système de coordonnées. Dans mon cas, je dois récupérer des points en coordonnées Lambert 93 et je dois les envoyer à l'API de Maps en coordonnées géographiques, c'est-à-dire longitude et latitude. Je dois donc transformer les coordonnées, vérifier leur exactitude et soumettre au client la nouvelle carte des points


Transformation des coordonnées

Le SIG utilise le système de coordonnées Lambert 93. Ce système est loin d'être exotique puisque c'est le système de référence en France depuis 2006. Ça ne devrait donc pas être trop difficile de trouver une librairie qui sache faire les conversions. Au passage, lorsqu'on voit les formules, on s'oriente forcément vers une librairie qui fasse le boulot pour nous.

A partir de là, pas facile de demander à Google de me trouver ce dont j'ai besoin, parce que mon vocabulaire dans le domaine est trop limité et qu'il y a un nombre considérable de systèmes de coordonnées dans le monde. Twitter est alors le meilleur endroit pour demander de l'aide. La première réponse vient de Fabien Nicollet :
J'ai eu d'autres réponse intéressantes de V. Heurteaux et de Christophe Franco, que je garde en réserve si la première solution ne convient pas.

Donc cap sur Proj4J. C'est le portage (partiel) en Java de la vraie référence du domaine, PROJ.4. Ça c'est pour la partie rassurante, parce qu'il y a plusieurs points plus inquiétants :

Pas d'artefact dans les repositories Maven classiques, pas de binaire à télécharger
Le commentaire de la page de téléchargement est encore plus inquiétant :
Status: Currently this library is still being created, and is not yet ready for download

TODO
Le code source est truffé de TODO.

//TODO: adjust src Prime Meridian if specified
...
//TODO: adjust target Prime Meridian if specified
...

Documentation
Les liens de documentation vont vers PROJ.4, rien pour la version Java. Heureusement qu'il y a des tests unitaires dont on peut s'inspirer.

Depuis 2009
Et pourtant le projet n'est pas tout jeune. Il a été initié en 2009 et est déjà la reprise de portages précédents. Avec tout ça et mon absence de connaissance dans le domaine, en particulier coté vocabulaire, le démarrage est fastidieux.

Avant de passer au code, quelques précisions sur le système de coordonnées utilisé. J'ai parlé de Lambert 93 ; ce système découpe la France en 9 bandes horizontales. Il faut donc savoir dans quelle bande on travaille et connaitre le nom du système correspondant. Pour mon cas, c'est RGF93 / CC46, connu dans la codification internationale sous le code EPSG:3946.

Trêve de blabla, passons au code :

On commence par instancier les systèmes de coordonnées, EPSG:3946 pour la source et géographique pour la cible.
CRSFactory factory = new CRSFactory();
CoordinateReferenceSystem lambert = factory.createFromName(crs);
CoordinateReferenceSystem map = lambert.createGeographic();
Puis on instancie et on utilise le transformateur :
CoordinateTransform coordinateTransform = new BasicCoordinateTransform(lambert, map);
ProjCoordinate sourcCoordinate = new ProjCoordinate(x, y);
ProjCoordinate targetCoordinate = new ProjCoordinate();
coordinateTransform.transform(sourcCoordinate, targetCoordinate);

C'est tout : huit lignes de code seulement. Le plus dur était de trouver la librairie et de comprendre comment l'utiliser. A ce sujet, un grand merci à ceux qui m'ont orienté vers les solutions pertinantes !

Vérification des coordonnées

Pour vérifier les coordonnées obtenues et construire un jeu de données de test, le client nous a orienté vers un outil en ligne. Les résultats concordent à six chiffres après la virgule.

Génération de la carte

Pour la dernière étape de validation, on veut présenter les points sur Google Maps. Plutôt que d'utiliser l'API, ça nous semblait plus pratique de générer un fichier KML contenant les points qui doivent être affichés sur la carte. En l'occurrence, on a généré un fichier compressé, KMZ. Pour ça aussi, il y a une librairie, JAK, ou Java API for KML. Mais ça c'est pour le prochain billet...