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

Répondre à