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

Attachment: 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

Répondre à