Tous les projets

Outil data2025

Coastal Survey Automation

Un outil qui transforme des données brutes de relevé hydrographique en feuilles de contrôle de récolement, servant à vérifier que chaque épi du littoral est construit conforme au plan.

Développeur unique. Conception et réalisation de toute la chaîne : parsers des formats de relevé, moteur de système de référence linéaire, pipeline de traitement en six étapes, et générateur de feuille Excel/VBA.

reference line KP 0+164Off -11.5 m KP 0+243Off +5.2 m KP 0+393Off -9.0 m KP 0+438Off +10.2 m
La transformation au cœur de la chaîne : chaque point relevé est projeté perpendiculairement sur une ligne de référence. Le KP est la distance le long de cette ligne, l’Offset l’écart signé. Schéma, valeurs inventées.

the contractor construit une série d'épis sur le segment de la côte ouest-africaine pour ralentir l'érosion côtière. Chaque épi est posé couche par couche, de l'excavation et de l'assise jusqu'à la carapace en enrochements calibrés et au musoir, et chaque couche doit être relevée puis comparée à son design théorique. L'outil récupère les exports du logiciel de relevé (tracks, surfaces, semis de points, logs des engins), reconstruit les profils de design, calcule la position de chaque point le long de l'axe de l'épi, et produit à la fois les données théoriques et les données de récolement pour la feuille de contrôle. Une macro Excel assemble ensuite ces données dans la feuille d'inspection formatée que l'équipe survey livre. Il supprime une étape de recopie manuelle, lente, entre le logiciel de relevé et Excel, à refaire à chaque relevé.

Le problème

Pour chaque épi et chaque couche de construction, l'équipe survey devait comparer le profil de design théorique au relevé réel, section par section le long de l'ouvrage. Amener les points théoriques et les points de récolement dans la feuille de contrôle voulait dire les sortir du logiciel de relevé et les remettre en forme à la main dans Excel, couche après couche, épi après épi. C'était lent, à refaire à chaque nouveau relevé, et une seule coordonnée mal saisie change le verdict de conformité de l'ouvrage.

L’approche

La chaîne est un seul projet Python sans aucune librairie tierce : la géométrie, les transformations de coordonnées et les parsers de fichiers sont tous écrits de zéro. Elle lit et écrit directement les formats natifs du logiciel de relevé (tracks, surfaces triangulées, semis de points, jeux de lignes, logs des engins), et délègue à la commande de découpe de profils du logiciel là où c'est plus rapide et plus sûr que de réimplémenter l'interpolation de surface. Autour, toutes les règles propres au projet (classes d'enrochement, couches qui empruntent leurs extrémités à d'autres, tolérances d'appariement) sont dans des modules de configuration, et une petite macro Excel/VBA fait la dernière étape, en tirant les CSV générés dans la feuille formatée sur un seul clic.

Le résultat

  • L'étape de recopie manuelle entre le logiciel de relevé et Excel a disparu : un opérateur choisit un épi, lance le pipeline, et la feuille de contrôle se remplit depuis un bouton dans Excel.
  • Le profil théorique d'un épi est reconstruit de la même façon à chaque fois, donc deux géomètres qui contrôlent le même ouvrage travaillent sur des données de référence identiques.
  • Relancer un relevé ne coûte presque rien : la même commande régénère tout au lieu d'une nouvelle saisie manuelle.

Les chiffres d’usage concrets de ce projet ne sont pas publiés.

Fonctionnalités clés

  • Lit directement les formats de fichier du logiciel de relevé : tracks, surfaces triangulées, semis de points, jeux de lignes et logs des engins
  • Une commande par épi reconstruit toute la série des profils de design, couche par couche, musoir compris
  • Positionne chaque point de relevé le long de l'axe de l'épi (distance sur l'axe, écart à la ligne d'axe), comme la feuille de contrôle le lit
  • Apparie automatiquement les logs des engins et de relevé aux points de design, et affecte chaque point au bon épi et à la bonne couche
  • Comble les trous du relevé : là où le point d'axe manque, il interpole la profondeur depuis les points les plus proches de chaque côté
  • Fusionne les surfaces de tous les épis en une surface d'avancement par couche pour tout le projet
  • Macro Excel qui construit la feuille de contrôle formatée d'un épi sur un seul clic
  • Toutes les règles du projet (classes d'enrochement, relations entre couches, tolérances) sont en configuration, pas enfouies dans le code
Ingénierie — Architecture, décisions et compromis

Architecture

Un seul projet Python 3, environ 9 400 lignes, sans aucune dépendance tierce à l'exécution. La géométrie et les calculs de coordonnées sont écrits à la main sur des dataclasses immuables (Point2D/3D, Vector2D, ReferenceLine, KP/Offset). Le cœur est une classe CoordinateSystem qui convertit des Easting/Northing en un système de référence linéaire le long de la ligne d'axe de chaque épi (projection sur un vecteur d'axe normalisé et sa perpendiculaire) et inversement, en remplacement d'un ancien jeu de fonctions éparses conservées en wrappers dépréciés. Les entrées-sorties sont un lecteur et un écrivain par format de relevé (TRK, TRS, PTS, LIS, LOG, CSV, PLI) sous un package io/. Les six étapes de traitement vivent dans generators/ (sur une classe Generator commune qui résout l'arborescence du projet) et dans des modules use_case/ autonomes, chacun avec son cli, sa config et son main. run.py est un registre de use cases : ajouter une étape fait environ cinq lignes et le menu interactif et l'aide en sont générés. Tout ce qui est propre au projet (les neuf couches de classes d'enrochement, la config d'emprunt d'extrémités entre couches avec KP exclus par relation, les règles de suppression de points d'axe, toutes les tolérances d'appariement) est dans des modules config/. Les chemins basculent selon l'OS (lecteur réseau Z: sous Windows, chemin POSIX sous Linux). Une couche de logging maison écrit un journal d'exécution horodaté par use case. La dernière étape est un classeur Excel piloté par environ 1 300 lignes de VBA qui importe les CSV générés, construit une feuille par couche avec IDs de points, séparateurs de sections et un bloc de contrôle, et insère une image de vue en plan.

Défis d’ingénierie

  • Système de référence linéaire par épi : chaque ouvrage a sa propre ligne d'axe (lue depuis un fichier de jeu de lignes, avec un repli en dur), et chaque point a besoin de sa distance le long de l'axe et de son écart signé. C'est fait avec un vecteur d'axe normalisé et sa perpendiculaire, avec un contrôle aller-retour (E/N vers KP/offset puis retour) pour attraper une ligne de référence fausse avant qu'elle ne corrompe toute une feuille.
  • Points d'axe manquants : les profils découpés ne portent pas toujours un point exactement sur l'axe aux sections attendues par la feuille. Là où un point manque et où il y a du relevé des deux côtés, l'outil en crée un, avec une profondeur interpolée par la distance entre les points gauche et droite les plus proches ; là où un côté manque, il laisse le trou plutôt que de deviner.
  • Affecter les points de log à un épi et à une couche : les logs des engins sont un flux plat de coordonnées. Chaque point est transformé dans le système linéaire, testé contre les points de design dans des tolérances de KP, d'offset et de profondeur, et routé vers l'épi et la couche auxquels il appartient.
  • Ordonner les points géographiquement pour la feuille : les points de l'axe principal sont triés par KP puis offset, et les semis des musoirs sont ajoutés dans un ordre gauche-centre-droite configuré, pour que la feuille se lise le long de l'ouvrage comme un inspecteur le parcourt.

Décisions techniques

  • Pas de librairie tierce : la géométrie est simple et la cible de déploiement est un poste survey verrouillé sur un lecteur réseau. Écrire à la main les calculs vectoriels et les parsers a gardé l'outil sous forme d'un seul dossier copiable, sans rien à installer.
  • Réutiliser la commande de découpe de profils du logiciel de relevé (gentrk) plutôt que de réimplémenter l'interpolation de surface : c'est le comportement de référence auquel l'équipe fait déjà confiance, et l'appeler en sous-processus était plus rapide et moins risqué que de le reconstruire.
  • Toutes les règles métier en configuration, pas dans le code : classes d'enrochement, emprunt d'extrémités entre couches, KP exclus et tolérances changent d'un projet et d'une campagne de relevé à l'autre. Les garder dans des modules config/ fait d'un changement de règle une simple édition de donnée.
  • Excel/VBA pour le dernier maillon : le livrable est une feuille formatée dans laquelle l'équipe survey travaille déjà. Générer les données en CSV et laisser une macro assembler le classeur a gardé la sortie dans leur outil au lieu d'en imposer un nouveau.
  • Registre de use cases dans run.py : le pipeline a grandi étape par étape (logs, fusion, profils, semis de points, CSV, PLI). Un registre a fait de chaque étape un module autonome et du menu quelque chose d'auto-généré.

Stack

  • Python 3
  • dataclasses
  • VBA (Excel macros)
  • DredgeView survey formats (TRK / TRS / PTS / LIS / LOG / PLI)
  • gentrk CLI
  • CSV
  • Git

Développeur unique. Conception et réalisation de toute la chaîne : parsers des formats de relevé, moteur de système de référence linéaire, pipeline de traitement en six étapes, et générateur de feuille Excel/VBA. — Une multinationale néerlandaise de dragage et de travaux maritimes — outil interne pour un projet de protection du littoral sur la côte ouest-africaine. (2025)

Projet suivantOptiRH