Tronçons en doublon / Bloquer ou limiter
J'ai travaillé hier sur un Geotrek-admin où les administrateurs ont intégré un premier lot de tronçons à partir de la BD topo de l'IGN, mais la plupart sont en doublons, même plutôt en quintuplons, car ils ont été dupliqués dans QGIS puis importés comme ça dans la couche des tronçons de Geotrek-admin. Cela est ensuite transparent dans Geotrek-admin mais pose de nombreux soucis. Par exemple on créé une rando qui va utiliser un des tronçons, puis un POI qui utilise un autre des tronçons dupliqué, donc ce POI n'est pas associé à la rando...
On a essayé de fusionner ces tronçons depuis l'interface de Geotrek-admin mais celui-ci bloque il indique que les tronçons s'intersectent.
On a ensuite testé de fusionner ces tronçons directement depuis QGIS. La fusion se fait bien, mais cela créé un nouveau tronçon avec la fusion, donc le POI associé à un des tronçons fusionnés est supprimé car il perd le tronçon auquel il était rattaché.
En fait il n'est pas vraiment supprimé de la base de données mais est passé à deleted=true dans la table core_topology, n'a plus de géométrie et plus de correspondance dans la table cor_pathaggregation.
Concernant les randos, si une rando n'était associée qu'à un tronçon fusionné, celui-ci devient aussi orphelin et n'est plus accessible. Comme pour le POI, il n'est pas vraiment supprimé de la BDD, mais passé à deleted=true dans la table core_topology, n'a plus de géométrie et plus de correspondance dans la table cor_pathaggregation.
Par contre si la rando était associé à plusieurs tronçons, alors elle reste accessible dans Geotrek-admin, mais perd sa géométrie sur la zone des tronçons fusionnés.
Donc si on a des tronçons en double, avec des données associées à ces tronçons, c'est compliqué de faire le nettoyage des tronçons après coup, en les fusionnant, sans perdre des données, ou du moins leur géométrie.
Il serait donc intéressant de mettre en place des contraintes au niveau de la table des tronçons pour empêcher l'insertion de tronçons qui ont la même géométrie.
Par ailleurs, un autre cas, n'est pas des tronçons en doublon exact, mais le cas où on a un tronçon existant et où on en retrace ou réimporte un autre au même endroit, mais avec un tracé un peu différent. Cela va logiquement découper le tronçon existant en plein de mini-tronçons qu'il va être ensuite compliqué de nettoyer.
Pour ce cas aussi j'avais fait des tests de nettoyage des tronçons et des conséquences sur les objets liés : https://geotrek.ecrins-parcnational.fr/ressources/technique/2022-05-nettoyage-troncons-doublon.pdf
Une fois qu'on a fait le ménage dans les tronçons, les randos et POI (voir autre) qui étaient associés aux tronçons supprimés ou fusionnés ne sont donc plus accessibles depuis Geotrek-admin, mais sont toujours présents dans la BDD.
Seulement, ils n'ont plus de correspondance dans la table cor_pathaggregation, leur champs core_topology.deleted est à true et leur champs core_topology.geom est vide.
Il suffit de leur remettre une correspondance avec un tronçon dans la table cor_pathaggregation pour que cela recalcule leur champs core_topology.geom automatiquement avec le trigger dédié à cela, puis repasser leur champs core_topology.deleted à false pour qu'ils soient de nouveau accessibles dans Geotrek-admin.
Leur tracé ou localisation ne sera pas le bon, car on leur a remis une association à un tronçon n'importe quoi dans cor_pathaggregation, mais on récupère ainsi tout le contenu de l'objet et il ne reste plus qu'à le relocaliser correctement avec Geotrek-admin, sans devoir tout resaisir ces objets à partir de zéro.
On peut faire ça à la main, objet par objet, ou globalement en SQL. Ma méthode est pas forcément idéale, et il y a peut-être mieux, mais ça fonctionne...
-- Retrouver les objets concernés, pour info et vérification
SELECT * FROM core_topology WHERE deleted=true AND geom ISNULL
-- Recréer une association de ces objets avec un tronçon parmi ceux existants (458 dans mon cas,
-- à remplacer par n'importe lequel de vos tronçons existants) pour leur régénérer une géométrie
-- (ponctuelle dans ce cas sur le point de départ du tronçon 458)
INSERT INTO core_pathaggregation (topo_object_id, path_id, start_position, end_position)
SELECT id, 458, 0, 0 FROM core_topology ct
WHERE ct.deleted=true
AND ct.geom isnull
AND ct.kind='POI' -- Optionnel, par exemple ici si on veut limiter aux objets (topologies) de type POI
-- Passer à non supprimé les objets (topologies) pour lesquels on vient de recréer une géométrie
-- (458 étant à remplacer par le tronçon que vous avez utilisé dans la requête précédente)
UPDATE core_topology ct
SET deleted=false
FROM core_pathaggregation cp
WHERE ct.id = cp.topo_object_id
AND cp.path_id=458
AND cp.start_position=0
AND cp.end_position=0
AND ct.deleted=true
Il ne restera alors plus qu'à modifier chacun de ces objets depuis Geotrek-admin pour les relocaliser correctement sur les tronçons nettoyés. Les itinéraires (et autres objets linéaires) concernés seront facilement identifiables dans Geotrek-admin, car ils seront représentés sur la carte sous forme de points, tous au même endroit (au point de départ du tronçon 458 dans mon cas).
Je tâtonne un peu et ne suis pas expert sur le sujet, donc même si j'ai testé sur une BDD de test, je vous conseille de faire une sauvegarde de la base de données, avant ces opérations délicates.
@camillemonchicourt Merci pour ton aide précieuse. Grace à tes recherches j'ai pu récupérer les données concernées. 👍
OK super si les requêtes ont permis de récupérer les objets qui avaient perdus leur géométrie et passé à la "corbeille" (deleted=true). Ça t'a donc remonté toutes les randos et POI en n'ayant plus qu'à les relocaliser ?
Oui, tous les POI et itinéraires orphelins sont réapparus dans Geotrek-admin et sur la carte au départ du tronçon que j'ai utilisé pour les "restaurer", selon tes indications.