Le 11 mars 2012 14:28, didier2020 <didier2...@free.fr> a écrit :
> pour la france, j'ai comptabilisé plus de 20 000 ways fermé en double:
> http://didier2020.free.fr/doublon/
>
> le way fermé etant décrit par ses nodes : 1 2 3 4 1
> le premier et le dernier ayant  le meme node
> j'ai considéré comme identique les descriptions
> 1 2 3 4 1
> 2 3 4 1 2
> 3 4 1 2 3
> 4 1 2 3 4
> 1 4 3 2 1
> 4 3 2 1 4
> 3 2 1 4 3
> 2 1 4 3 2

Tu te compliques la vie en cherchant toutes les permutations
possibles. Il suffit juste de repérer par exemple le noeud le plus au
nord (sinon le plus à l'ouest), pour ensuite les trier à partir de
celui-ci dans le sens antihoraire). Ca donne un ordre unique, qui
permet de repérer les doublons facilement.

> j'ai effectué des corrections pour comprendre ces "doublons":
> +1+ batiment en double dans le meme changeset tags identiques

Evidememnt une erreur du contributeur de ce même changeset. Quel outil
permet ça ?

> +2+ batiment en double dans le meme changeset, 1 des 2 avec le tag
> wall=no

là les attributs sont différents, mais pas incompatibles: on fusionne
les attributs.

> +3+ des riverbank en double dans le meme changeset

C'est le même cas que le +1+

> +4+ relation mutlipolygone et un way en double sur l'inner
> http://www.openstreetmap.org/?lat=49.1638239&lon=2.4469579&zoom=18
> cela est aussi valable pour les riverbank, zone clc

Attention: aucun des attributs d'un way référencé en rôle "inner" ne
qualifie pas du tout la relation qui le référence. Le way peut être de
type différent pour désigner un objet différent, et la plupart de ses
atrributs migrés vers la/les relations qui référencent ce way en
"outer" (ou rôle anonyme). Il est normal que ce way soit partagé par
deux objets, l'un entourant l'autre)

> +5+ des descriptions différentes:
> description highway + son "contenu"
> junction=roundabout / landuse grass (l'intérieur du giratoire)
> highway=residential / amenity=parking (une route autour d'un parking)
> barrier=fence / landuse=... ou amenity=... (une zone entouré d'une
> délimitation)
>
> une partie de ces erreurs est déja détecté par osmose :
> batiments chevauchants (mais noyé dans la masse) ,multiple inner
> polygon.

> question:
> concerne les point +4+ et +5+ :
> est-ce une erreur et dans ce cas comment taguer "proprement"

Retenir que tout ce qui est défini pour un rôle "inner" ne concerne
pas l'objet (relation) qui en fait la référence. Un rôle inner n'est
jamais un doublon, sauf si la même relation référence deux fois ce way
pour un rôle inner, auquel cas il faudrait fusionner les zones inner
qui se touchent en réduisant le nombre de ways dans la relation.

Si on était logique d'ailleurs, la mention des rôles inner et outer
serait inutile et on pourrait se contenter du rôle anonyme, car il est
toujours possible de déterminer *automatiquement* si un chemin fait
partie du contour externe ou du contour interne d'un objet.

Ce qui veut dire en pratique que dans un premier temps il suffit de
prendre tous les ways d'une relation en même temps, qu'ils soient de
rôle anonyme, inner ou outer, détecter les ways en doublons dans cette
liste, puis détecter les intersections (sur un noeud interne des ways,
ou sur un nouveau noeud ajouté). En cas d'interection nécessitant un
nouveau noeud calculé, on l'insère dans chaque way.

Ensuite on tri les noeuds de chaque way en partant arbitrairement du
noeud le plus au nord (ou le plus à l'ouest en cas de latitude égale)
parmi  les deux noeuds d'extrémité (pour un way non fermé) ou parmi
tous les noeuds du way (s'il est fermé, c'est à dire ses deux
extrémités sont au même point). Attention pendant ce tri, il faut
préserver la direction si c'est un way pour une route ou une rivière
(mais pas si le way désigne une surface, car alors la direction n'est
plus pertinente, ce qui est mentionné par un tag spécifique
déterminant la signification des ways fermés). Si la direction n'est
pas pertinente, on inverse les sens de parcours à partir du point
déterminé.

On fait attention à cette étape aux noeuds superposés : il y a des cas
pour lesquels deux noeuds peuvent exister dans la base uniquement
parce qu'ils ont des attributs différents (à cause de leur altitude).
Sinon ces noeuds sont à fusionner (fusion des attributs vers le noeuds
avec l'ID le plus petit, c'est à dire le plus ancien).

Alors seulement on a des listes de ways comparables : on peut ensuite
déterminer les ways qui se superposent au moins en partie (auquel cas
il faudra scinder ces ways en plusieurs parties, sans omettre
d'ajouter les nouveaux ways créés à la totalité des relations qui
référencent le way non scindé). Il ne reste laors plus que des ways
soit entièrement égaux dans leur géométrie (noeuds et directions),
soit des ways dont les listes de noeuds sont en sens inverse (lignes
centrales des routes et cours d'eaux;  pour ces derniers il faut
relaver l'erreur ou utiliser un algo plus avancé car il n'est pas
toujours évident de déterminer quelle est la bonne direction à garder;
pour les routes il faut soit garder les deux sens, soit chercher
comment tagguer différemment chaque sens de parcours car les attributs
portent en fait normalement sur des sens "oneway" correspoendant en
fait à chaque côté de la route, mais comme les chemins sont
superposés, il faudrait transformer la route en ôtant les oneway après
avoir déterminé comment migrer les attributs distingant proprement
chaque côté d'une voie bidirectionnelle selon le sens retenu).

Passé ce point, s'il n'y a plus de superpositions (à cause des cas
particuliers des routes), on peut continuer à chercher alors les ways
en doublon dans une relation (c'est facile car ils ont exactement la
même liste de point, grâce au tri) : on pourra les éliminer par paire
(s'il y en a 2, on n'en garde aucun; s'il y en a trois, on n'en garde
qu'un), en fusionnant les attributs du way qu'on garde (on garde
toujours celui qui a l'ID le plus petit, c'est à dire le plus ancien,
pour préserver un maximum d'historique, et aussi préserver les liens
HTML des pages de suivi de projets).

Alors seulement on peut déterminer parmi les ways dans la relation qui
restent lesquels sont internes et externes : on trace arbitrairement
une ligne suivant un même parallèle passant par un point de réference
:
-  Si le way est fermé, il sufffit arbitrairement de le considérer
comme s'il avait deux ways sucessifs mais séparés (on peut se
contenter de prendre le premier way connectant le premier à l'avant
dernier noeud, l'autre reconnectant l'avant-dernier au dernier
identique au premier).
- Si alors un way (il est toujours non fermé à ce point) n'a que deux
noeuds restant, on va utiliser comme point de référence le point
central de ce segment
- Sinon le way a au moins 3 noeuds, on prendra arbitrairement le
deuxième noeud comme point de référence.
- en traçant la ligne horizontale passant par le point de référence,
on compte le nombre de ways que coupe cette horizontale ; cas
particulier : il peut arriver que cette horizontale passe par un
segment horizontal d'un way : il faut alors déterminer si les segments
non horizontaux immédiatement connexes de ce chemin sont de part et
d'autre de l'hrizontale, auquel cas on compte ce chemin; sinon ces
segements connexes sont d'un seul côté, et on ne compte pas ce chemin.
- c'et le nombre de chemins coupés par l'horizontale, situés à l"ouest
et à l'est du point de référence (comptés selon la méthode précedente)
qui servent alors à déterminer ni le way qu'on analyse est interne ou
externe; seule la parité compte : si le nombre à l'ouest est impair
comme celui à l'est, notre way est interne, sinon sur le nombre à
l'ouest est pair comme celui à l'est, notre way est externe, sinon
notre way ne fait pas partie d'une relation fermée par un contour
externe.

_______________________________________________
Talk-fr mailing list
Talk-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-fr

Répondre à