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