bonsoir, ci joint un fichier osm que j'ai créé et ou le validator de josm ne trouve pas d'erreur
j'ai utilisé le script de Bruno Cortial afin d'en faire un corrigeant ces erreurs je j'ai essayé sur http://cadastre.openstreetmap.fr/data/091/Y0191-CROSNE-houses.osm le nombre d'erreur detecté par josm passe de 9 a 43. merci de vos remarques quand au code/syntaxe (je learn...) didier
waydouble.osm
Description: XML document
#!/usr/bin/python
# -*- coding: utf8 -*-
# way_sort_ref : A partir d’un fichier .osm, crée un autre .osm en
# réordonnant les ref des ways fermés du plus petit au plus grand
# cela ajoute un attribut erreur=vrai pour les ways ayant moins de 4 ref
import OsmSax, sys, copy
class Node(object):
def __init__(self, id=None, lon=None, lat=None, tags=None):
self.id = id
if lon != None: self.lon, self.lat = float(lon), float(lat)
if tags:
self.tags = tags
else:
self.tags = {}
self.inWay = set()
self.inRel = set()
class Way(object):
def __init__(self, id=None, nodes=None, tags=None):
self.id = id
if nodes:
self.nodes = nodes
else:
self.nodes = []
if tags:
self.tags = tags
else:
self.tags = {}
class Relation(object):
def __init__(self, id, members=None, tags=None):
self.id = id
if members:
self.members = members
else:
self.members = []
if tags:
self.tags = tags
else:
self.tags = {}
def __repr__(self):
return "Relation(id=%r, members=%r, tags=%r)" % (self.id, self.members, self.tags)
class Cache:
def __init__(self):
self.nods = {}
self.ways = {}
self.rels = {}
def NodeCreate(self, data):
self.nods[data["id"]] = Node(id=data["id"],lon=data["lon"],lat=data["lat"],tags=data["tag"])
def WayCreate(self, data):
self.ways[data["id"]] = Way(id=data["id"],nodes=data["nd"],tags=data["tag"])
def RelationCreate(self, data):
self.rels[data["id"]] = Relation(id=data["id"],tags=data["tag"],members=data["member"])
###########################################################################
# fichier de sortie en deuxieme arguement de la ligne de commande
fout = sys.argv[2]
#fout = 'test.osm'
# fichier a analyser / corriger en premier argument de la ligne de commande
data = OsmSax.OsmSaxReader(sys.argv[1])
#data = OsmSax.OsmSaxReader("waydouble.osm")
# la, je ne sais pas trop encore
cache = Cache()
print 'Parse du fichier...'
# OsmSax
data.CopyTo(cache)
# variable pour comptabiliser le nombre de changement effectué
nberr=0
#boucle sur tous les ways
for w in cache.ways.values():
# verification si le way est fermé (dernier=premier)
#nbele=len(w.nodes)
#dernier = w.nodes[nbele-1]
if w.nodes[0] == w.nodes[len(w.nodes)-1] :
# la plus grande valeur de cette liste
maxref=max(w.nodes)
if len(w.nodes)<4 :
# ajouter un attribu aux way
w.tags['fixme']=''
w.tags['note']='way ferme avec 2 noeuds , ce n''est pas une surface'
else :
# position de l'élément maxref dans la liste
pmaxref=w.nodes.index(maxref)
# si maxref=0, la liste est deja bien ordonnée
if pmaxref>0 :
# on prend la liste du max a la fin + du debut au max
newl = w.nodes[pmaxref:len(w.nodes)] + w.nodes[1:pmaxref+1]
# affectation des valeurs
w.nodes=copy.copy(newl)
nberr += 1
print nberr
print "Il y a %s corrections." % nberr
print 'Ecriture...'
out = OsmSax.OsmSaxWriter(fout, "UTF-8")
out.startDocument()
out.startElement("osm", {'version':'0.6'})
for n in cache.nods.values():
out.NodeCreate({'id':n.id,'lon':n.lon,'lat':n.lat,'tag':n.tags})
for w in cache.ways.values():
out.WayCreate({'id':w.id,'nd':w.nodes,'tag':w.tags})
for r in cache.rels.values():
out.RelationCreate({'id':r.id,'member':r.members,'tag':r.tags})
out.endElement("osm")
_______________________________________________ dev-fr mailing list [email protected] http://lists.openstreetmap.org/listinfo/dev-fr
