Extraire automatiquement des images de plans de voies à partir de la cartographie Hastus
Origine du besoin
On a:
-
d'une part, un environnement Hastus dans lequel l'ensemble du Réseau Ferré National français est cartographié dans le module Geo, et ou chaque voie à quai d'une gare commerciale est modélisée par un lieu
-
d'autre part, un outil SNCF maison où des informations importantes sur les voies à quai ont été saisies manuellement
On souhaite établir une équivalence entre les référentiels de voies à quai de ces deux systèmes afin de pouvoir importer dans Hastus les informations saisies dans le système maison.
Un autre article décrira éventuellement comment des services Bimo ont été utilisés pour initialiser ce travail, mais cela restera néanmoins toujours une initialisation : dans certains cas, on n'arrive pas à faire le rapprochement entre les voies automatiquement, et il faut demander à un humain d'intervenir.
Afin de faciliter cette intervention, on souhaite mettre à disposition des humains en question une IHM qui affichera, pour une gare donnée:
- la liste des voies disponibles dans le système SNCF maison
- la liste des voies disponibles dans Hastus
- les équivalences trouvées automatiquement par les algos
- une image du plan de voie de la gare dans Hastus, et de la position des voies Hastus sur ce plan de voie
En effet, il existe souvent plusieurs "alias" pour une même voie, et le nom de voie utilisé dans Hastus n'est pas toujours celui avec lequel les utilisateurs sont le plus familier. En leur montrant à quelle voie correspond un nom sur le plan de voie, on facilite grandement le travail. On aurait pu aussi se contenter de dire aux utilisateurs d'ouvrir la carte Hastus, et de trouver dans la carte la gare concernée à chaque fois. Mais cela aurait ajouté des manipulations et du temps à une tâche déjà pas très amusante ... et mon rôle sur ce projet est précisément de m'amuser à automatiser et accélérer des manipulations pas très amusantes pour des humains.
Exploration des solutions
Processus global
Pour ne pas réinventer la roue, on considère que l'IHM qui sera présentée aux utilisateurs sera un fichier Excel par région, contenant un onglet pour chaque gare de la région. Sur cet onglet, on voudrait afficher le plan de voie, les listes de voies, et prévoir un endroit où les utilisateurs pourront confirmer/corriger la correspondance. Ces fichiers pourront ensuite être relus automatiquement pour en extraire les correspondances validées.
On souhaite donc produire des images de plan de voie à partir de la carte Hastus, dans un format qui pourra être incorporé dans un fichier Excel.
Les fonctionnalités standard Hastus permettent d'extraire la carte en format Shapefile et on connaît un très bon outil open source pour manipuler des fichiers Shapefile: mapshaper
Note sur la sécurité des données
Pour ceux qui s'inquiéteraient de l'utilisation d'outils internet grand public pour la manipulation de données potentiellement sensibles, sachez que mapshaper traite toutes les données côté client - jamais nos données ne quittent notre poste. Et si cela ne suffisait pas, j'incorpore dans certaines distributions Bimo un "fork" de mapshaper qui pourrait vous rassurer encore plus: après avoir téléchargé Bimo, vous pouvez couper toute connexion internet, lancer Bimo et avoir une instance mapshaper qui tourne.
Une vérification rapide montre que mapshaper permet d'exporter une carte au format svg
et qu'Excel permet d'incorporer des images dans ce format.
On va donc utiliser mapshaper pour produire des svg
de toutes les gares, puis on pourra incorporer ces svg dans les fichiers Excel.
Commandes mapshaper
Mapshaper peut être utilisé via l'IHM web, mais fourni aussi un CLI node, déjà incorporé dans le backend Bimo. Mais en plus, l'IHM web permet d'utiliser une console pour tester des commandes.
L'aide est disponible directement dans la console, ou sur le repo Github du projet.
On y trouve la commande clip, qui va permettre de produire un nouveau calque à partir d'un calque existant, en conservant uniquement une zone délimitée par des coordonnées ou par une géométrie présente sur un autre calque.
En testant un peu, on conclut que la commande ci-dessous semble donner satisfaction. Notez bien l'utilisation du "+" qui indique de créer un nouveau calque, et donc de préserver le calque cible tel qu'il était. L'argument "name" donne le nom du nouveau calque.
clip target=calque_initial bbox=xmin,ymin,xmax,ymax + name=clip_de_gare_1
Ça marche très bien pour extraire la géométrie des voies à partir du mapshaper extrait d'Hastus. Par contre les lieux-voies n'apparaissent pas ... En effet, dans Hastus, les lieux sont des objets à part, qui sont associés à des segments de la carte, mais n'en font pas partie.
On devra donc obtenir un autre fichier contenant les données sur les lieux, et l'importer en tant que calque supplémentaire dans Mapshaper (ceci pourrait faire l'objet d'un autre article si ça intéresse quelqu'un !).
À ce stade, on arrive à produire une image dans laquelle on a les voies, ainsi que des points correspondant aux lieux. Mais il manque toujours les libellés.
On va donc utiliser la commande style
de mapshaper pour les faire apparaître.
style target=calque_des_lieux" label-text='plcIdentifier' dx=5 dy=5 ...
Ça commence à ressembler pas mal à ce qu'on souhaite ! On va donc se lancer dans l'automatisation.