effectivement, les membres de relations ne devraient pas se lier l'un à l'autre, ce devrait être des parentés strictes dans une hiérarchie, donc sans boucle.
Il y a cependant quelques cas où de telles boucles existent entre relations (mais pour des rôles différents), notamment pour les "default" values applicables à une région. Pour de tels cas, JOSM a inclus il y a maintenant près de 3 ans un "fix" lui évitant de créer une boucle infinie lors de l'énumération récursive des membres enfants: il détecte tout cas de retour d'un descendant vers un des ancêtres déjà en cours d'énumération et dans ce cas n'ira pas parcourir ce lien "descendant" qui en fait revient à un ascendant. Il utilise pour cela une simple pile, en empilant l'objet dont on va énumérer les enfants, puis en parcourant chacun les enfants (sans rien faire s'ils sont déjà présents quelque part dans la pile), puis une fois parcourus tous les enfants en dépilant le premier objet parent. C'est un garde-fou simple à implémenter (la pile est en fait non ordonnée, c'est une simple collection indexée par référence d'objet, l'index pouvant être très efficace si c'est une simple "hashtable"; de plus il ne sera jamais très grand car limité en taille à la longueur maximale de parcours hiérarchique d'un ancêtre vers le dernier de ses descendants, qui ne va jamais au delà d'un poignée: les parcours d'arbres de relation sont en fait beaucoup plus "larges" que "hauts" avec souvent beaucoup de membres dans une relation mais peu de niveaux de relations, je n'ai pas vu un seul cas où la profondeur atteint ou dépasse 16): si jamais on tombe sur un cas où en enfant est présent à la fois dans la liste des membres d'une relation et déjà dans la pile, on n'a aucun moyen de retraiter cet objet une deuxième fois, tout au plus on peut détecter une éventuelle incohérence de tags et journaliser ce cas, mais on ne doit pas traiter cet enfant à nouveau sans créer une boucle infinie: il suffit donc juste de savoir, si un objet qui peut avoir des descendants est déjà en cours de traitement dans la pile, si oui ne rien faire d'autre, sinon on commence à traiter l'objet en l'incluant d'abord dans la pile, puis en le retirant une fois le traitement de cet enfant terminé. Le 13 décembre 2016 à 22:17, Éric Gillet <gill3t.3ric+...@gmail.com> a écrit : > Le 13 décembre 2016 à 21:27, <osm.sanspourr...@spamgourmet.com> a écrit : > >> J'ai peut-être la réponse à la longueur du traitement : >> >> https://www.openstreetmap.org/relation/6789691 a pour membre : >> >> - Relation Noctilien N21 : Châtelet → Chilly-Mazarin – Libération ( >> 2504515) <https://www.openstreetmap.org/relation/2504515> >> et fait partie de : >> - Relation Noctilien N21 : Châtelet → Chilly-Mazarin – Libération ( >> 2504515) <https://www.openstreetmap.org/relation/2504515> >> >> Faut-il vraiment le second lien (sans rôle) ? Quelle signification ? >> Retrouver la relation maîtresse ? >> > > Cela me semble être une erreur, il n'est pas nécessaire de "boucler" comme > ça les relations. Les outils, notamment Overpass, savent gérer les liens de > parenté entre les relations. > > _______________________________________________ > Talk-fr mailing list > Talk-fr@openstreetmap.org > https://lists.openstreetmap.org/listinfo/talk-fr > >
_______________________________________________ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr