Bonjour
Pour mon premier message à cette liste de distribution je vais me
présenter rapidement. Je vis à Toulouse et je participe à OpenstreetMap
depuis un peu plus d'un an (je sais plus trop). Bref. Au début c'était
juste pour corriger une évolution et je trouve que c'est de plus en plus
prenant et je me trouve maintenant à faire des modifs beaucoup plus
lourdes. :-)
J'ai toujours trouvé que la mise à jour des bâtiments était pénible à
faire. Parce qu'il faut comparer ce qui existe avec ce qui est fourni
par le cadastre. On peut superposer les deux avec josm. C'est très
facile quand il y a 100 pâtés de maison mais c'est un cauchemard quand
il y en a plus de 1000.
Du coup j'ai fait un petit script python (joint à ce message) qui fait
la comparaison entre ce qui existe et ce qui fourni par le cadastre. Il
détermine quels sont les bâtiments supprimés, les bâtiments nouveaux, et
les bâtiments modifiés. Il y a toujours un travail à faire à partir des
résultats obtenus parce que ce n'est pas possible d'éviter des faux
positifs mais ça évite de faire une comparaison maison par maison. Bien
sûr, il vaut mieux que la commune sur laquelle il est appliqué soit déjà
issue des données du cadastre. Une commune ou le bâti est tracé à partir
de Bing donnera des résultats plus mitigés.
Je ne vais pas détailler ici le fonctionnement de mon script. C'est déjà
fait dans cette fil que j'ai ouvert sur le forum osm-fr :
http://forum.openstreetmap.fr/viewtopic.php?f=5t=1762
Je peux vous fournir un fichier exemple d'utilisation. Il s'agit du bâti
de la commune de Seilh (https://www.openstreetmap.org/relation/158877)
au nord de Toulouse :
http://sendbox.fr/pro/5r3o7uspdsb0/Seilh.zip.html
Ce zip contient 2 fichiers :
Seilh_as_is.osm : les batiments tels qu'ils sont dans OSM actuellement
Seilh_to_be.osm : les bâtiments tels que le cadastre le donne actuellement.
Pour l'utilisation la commande est simple :
python BatiOSm.py Seilh_as_is.osm Seilh_to_be.osm prefixe
préfixe sera utilisé pour nommer les fichiers résultats.
Merci pour votre aide et pour votre retour si vous avez des suggestions
d'améliorations ou si vous avez des comportements bizarres !
Sébastien
# -*- coding:Utf-8 -*-
#!/usr/bin/env python
import sys
import os
from math import sqrt
import time
from operator import attrgetter
BORNE_INF_MODIF = 1.e-5
BORNE_SUP_MODIF = 1.e-4
class Point:
Définition d'un point.
Attributs :
- identifiant (chaine de caractère)
- latitude et longitude (flottant)
def __init__(self, node_id, node_lat, node_lon):
self.node_id = node_id
self.node_lat = float(node_lat)
self.node_lon = float(node_lon)
def affiche(self):
print self.node_id, self.node_lat, self.node_lon
def distance(self, other):
Calcul de la distance entre deux points
d_lat = self.node_lat - other.node_lat
d_lon = self.node_lon - other.node_lon
return sqrt(d_lat**2 + d_lon**2)
def export_node(self):
Création du code xml équivalent au point
self.print_node = node id=' + self.node_id + \
' action='modify' visible='true' lat=' + \
str(self.node_lat) + ' lon=' + str(self.node_lon) + ' /
class Batiment:
L'entité Batiment rassemble plusieurs données :
- bat_id : un identifiant (chaine de caractère)
- nbre_node : le nombre de points du batiment (nombre entier)
- node_id : le tableau des Points du batiments
- pt_moy : le point de référence du batiments (centre de gravité)
- dist_mini : une valeurs de distance pour détecter la modification du batiment
- largeur : la largeur du batiment
- status : le status du batiment (nouveau, identique, modifié, supprimé)
- nombre_tag : le nombre de tag défini dans le fichier
- tableau_tag_key : le tableau d'identifiants des tags
- tableau_tag_value : le tableau des valeurs des tags
- pbAire : l'information si le batiment a une aire nulle
- multipolygone : yes si le batiment en est un, no sinon
- role : le role si le batiment appartient à une relation
- ind_relation : l'indice de la relation auquel il appartient
def __init__(self, bat_id, nbre_node, node_id,
numTag, tableauTagKey, tableauTagValue,
distance=1000, largeur = 0., status = UNKNOWN, pbAire = NO,
multipolygone = no, role = outer, ind_relation = 0):
self.bat_id = bat_id
self.nbre_node = nbre_node
self.node_id = node_id
self.dist_mini = float(distance)
self.largeur = largeur
self.status = status
self.nombre_tag = numTag
self.tableau_tag_key = tableauTagKey
self.tableau_tag_value = tableauTagValue
self.pbAire = NO
self.multipolygone = no
self.role = outer
self.ind_relation = 0
def