User:Didier2020/Correction Batiment chevauchants

From OpenStreetMap Wiki
Jump to: navigation, search

merci a osmose pour osmsax.py et a Bruno Cortial qui m'a inspiré

Les batiments chevauchants sont détectés par osmose:

Les 21 Septembre 2012, l'"explosion" des erreurs est du a la nouvelle analyse osmose: interstice

Language et modules utilisés:

  • linux et python
  • Le language est python, car la lecture des données osm se fait grace a OsmSax.py (un module d'osmose disponible sur gitorious)
  • Shapely permet de manipuler les objets géométrique
  • Rtree est un index spatial et permet ici de rechercher tous les batiments aux abords
  • le script est déposé https://gitorious.org/building4osm

Principe de correction des batiments chevauchants par calcul d'intersection

  • Télécharger les données osm

Utilisation de https://github.com/werner2101/python-osm/blob/master/src/osm/multipolygon.py pour créer un fichier josm vide d'une commune

  • depuis les modification OSMF redaction account, validation josm puis purger les nodes orphelins
  • Premiere lecture du fichier osm, et ajout de tags temporaires pour marquer les ways (contenant le tag building) qu'il ne faut pas traiter: Chevauchements trop important, polygone non valide (ayant moins de 3 nodes,se coupant ou non fermé)
  • Pour tous les batiments
    • recherche de tous les batiments aux abords
    • verification s'ils se chevauchent (layer identique, pas de maping indoor, pas de batiment qu'il ne faut pas traiter)
      • Calcul des deux nouvelles surfaces, Verification que la correction est valide
      • Ajout d'un tag temporaire sur les 2 ways et modification de la description des ways
      • Ajout des nouveaux noeuds
  • Ecriture du fichier corrigé
  • Avec josm
    • corrections manuelles des ways ayant le tag temporaire identifiant une erreur
    • suppression des tags temporaires
    • grace a la validation josm, suppression des nodes non utilisés

Correction par projection

Projection orthogonale d'un point sur un segment. Cela corrige les intersections et les interstices. Cela correspond avec josm aux touches L (alignement) et J (joindre)

Un peu de théorie:

  • Comprendre les modèles dimentionnels des objets de-9im
  • utilisation de shapely

Problèmes rencontrés:

Pour la correction par intersection

  • Définir ce qui est corrigeable automatiquement ou pas:
    • pas de traitement des relations batiments (surfaces complexes)
    • filtrer les types d'intersections : utilisation de python-shapely avec le filtre de-9im "212101212","212111212"
    • critere de (non)correction: z1 et z2 étant les surfaces (m2) des batiments
      • (z1+z2) * (1-taux) < z1Uz2 < (z1+z2) * (1+taux)
      • (100+100) * 0.95 < 101 < (100+100) * 1.05 -> ne pas corriger
      • (80+20) * 0.95 < 101 < (80+20) * 1.05
      • (80+20) * 0.95 < 98 < (80+20) * 1.05
  • Les corrections génèrent des polygones invalides:
    • c'était du a la précision des coordonnées. un polygone corrigé (sans arrondi des coordonnées) devenait incorrect après upload (arrondi a 7 decimales).
    • Convertion des flottant en texte, arrondi a 7 caractères après le point , puis convertion en flottant a chaque corrections
  • Le traitement était trop long
    • Le script initial était une double boucle sur tous les ways... Pour chaque way, vérifier sur tous les way s'il y a une intersection
    • Utilisation de rtree afin de ne faire une recherche qu'aux abords du way (par bbox du way)
  • Shapely permet de travailler avec des objets graphiques. Quand on modifie un objet, comment réatribuer le numéro de node existant ou en attribuer un nouveau? utilisation de tables de correspondance (id du node, coordonnées) et (coordonnées, id du node)
  • quel batiment modifier ?
    • le batiment contenant le plus de point de l'autre aura des nodes en plus, l'autre aura sa surface réduite, et des nodes seront a supprimer dans josm (validator)
    • si le nombre de point est égal, c'est celui qui a la plus grande surface
  • utilisation de plusieurs méthode pour corriger les intersections (s1 et s2 étants les 2 batiments)
    • methode 1
      • i1=s2.difference(s1)
      • i2=s2.intersection(s1)
      • i3=s1.difference(s2)
      • i4=i1.union(i2)
      • nouveau s1 = i3
      • nouveau s2 = i4
    • methode 2
      • i2=s2.difference(s1)
      • nouveau s1 = s1 (inchangé)
      • nouveau s2 = i2

Pour la correction par projection orthogonale

  • Optimisation : Utilisation de rtree afin de ne faire une recherche qu'aux abords d'un segment du way (par bbox du segment)
  • critere de (non)correction: distance entre un node et un segment :0.5e-6
  • La correction génèrent des dupes nodes: fusionner les nodes et modifier la description des ways
  • La correction génèrent des polygones invalides: fusionner les nodes et modifier la description des ways

Utilisation d'osmose

J'utilise des analyse osmose (osmose.openstreetmap.fr) spécifiques afin de détecter des erreurs avant d'uploader les données. Un script python lit les fichiers xml des erreurs, et ajoute un tag temporaire dans les fichiers pour pouvoir les corriger dans Josm (Par exemple la fusion des batiments morcelés)

Autre

  • ma femme trouve trop bruyant le clic de la souris, achat d'une souris dont le son du clic n'est pas aigu (WMM 4000)

comment corriger tous les cas de chevauchements

  • ce que le script ne sait pas faire : aligner deux murs qui ne sont pas parallèle
  • josm avec les touches j l g ...