<div dir="ltr"><div><div>Si tu peux installer le plugin scripting et Jython, j'ai un script qui fait cela. Il fait un peu plus, donc tu devras enlever ce dont tu n'as pas besoin.<br><br></div>Jo<br><br></div>Ce qui t'intéresse commence à la ligne 122.<br><br>#!/bin/jython<br>'''<br>CheckRouteOrNetworkOrCollectionOfRoutes.jy<br>- Validation of a rXn route relation<br><br>This code is released under the GNU General<br>Public License v2 or later.<br><br>The GPL v3 is accessible here:<br><a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a><br><br>The GPL v2 is accessible here:<br><a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html">http://www.gnu.org/licenses/old-licenses/gpl-2.0.html</a><br><br>It comes with no warranty whatsoever.<br><br>This code illustrates how to use Jython (Python in the scripting plugin of JOSM) to:<br>* loop over all members of a route relation<br>* find out whether the member is a node, a way or a relation<br>* add/change properties of a relation<br>* remove properties of a relation<br>* add members to a relation<br>* remove members from a relation<br>* sort all members backwards<br><br>* How to set an element selected<br><br>'''<br>from javax.swing import JOptionPane<br>from org.openstreetmap.josm import Main<br>import org.openstreetmap.josm.command as Command<br>import org.openstreetmap.josm.data.osm.Node as Node<br>import org.openstreetmap.josm.data.osm.Way as Way<br>import org.openstreetmap.josm.data.osm.Relation as Relation<br>import org.openstreetmap.josm.data.Bounds as Bounds<br>import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor as BoundingXYVisitor<br>import org.openstreetmap.josm.data.osm.TagCollection as TagCollection<br>import org.openstreetmap.josm.data.osm.DataSet as DataSet<br>import org.openstreetmap.josm.data.osm.RelationMember as RelationMember<br>import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask as DownloadRelationMemberTask<br>import org.openstreetmap.josm.actions.DownloadReferrersAction as DownloadReferrersAction<br>import org.openstreetmap.josm.actions.AutoScaleAction as AutoScaleAction <br>import org.openstreetmap.josm.plugins.utilsplugin2.replacegeometry.ReplaceGeometryUtils as ReplaceGeometryUtils<br>#import org.openstreetmap.josm.plugins.utilsplugin2.selection.SelectAllInsideAction.java as SelectAllInsideAction<br>import org.openstreetmap.josm.plugins.todo as Todo<br>import org.openstreetmap.josm.plugins.todo.TodoListModel as TodoListModel<br>import org.openstreetmap.josm.plugins.todo.TodoDialog as TodoDialog<br>print dir(TodoDialog)<br>import javax.swing.DefaultListSelectionModel as DefaultListSelectionModel<br><br><br># the file name where the report for the wiki goes, needs to be configurable<br>wikiReportFN = 'C:/data/wikiReport.txt'<br># comment to disable side effect<br>sideEffects = {}<br><br>logVerbosity = 30<br>'''<br>10: only report problems that require attention<br>20: report on collection<br>30: report on network nodes<br>40: report on which routes are being checked<br>50: report everything<br>'''<br><br>def getMapView():<br>    if Main.main and Main.main.map:<br>        return Main.main.map.mapView<br>    else:<br>        return None<br><br>def findSuitableBuilding(node, ignorelist, zoomOutThisManyTimes=2, houseNumber=None, street=None):<br>    bboxCalculator = BoundingXYVisitor()<br>    bboxCalculator.computeBoundingBox([node])<br>    bboxCalculator.enlargeBoundingBox()<br>    if bboxCalculator.getBounds():<br>         mv.recalculateCenterScale(bboxCalculator)<br>    mv.zoomTo(node.getEastNorth())<br>    stopPosition = Node()<br>    found = False<br>    for i in range(1,zoomOutThisManyTimes):<br>        candidates = mv.getAllNearest(mv.getPoint(node),ignorelist,Node().nodePredicate)<br>        if candidates:<br>            for candidate in candidates:<br>                if candidate in ignorelist: break<br>                for foundway in candidate.getReferrers():<br>                    if houseNumber and \<br>                          'addr:housenumber' in foundway.getKeys() and \<br>                          foundway.get('addr:housenumber').upper() == houseNumber.upper():<br>                        if 'addr:street' in foundway.getKeys() and street and \<br>                              foundway.get('addr:street').upper() == street.upper():<br>                            continue<br>                            # if we find a building with the housenumber we were looking for, stop searching<br>                        print 'Building with same housenumber'<br>                        found = True; break<br>                    if 'addr:housenumber' in foundway.getKeys():<br>                        # If we find a building with another housenumber, add its nodes to the ignorelist<br>                        print foundway.get('addr:housenumber') + " not a good candidate"<br>                        for node in foundway.getNodes():<br>                            ignorelist.append(node)<br>                        continue<br>                    if 'building' in foundway.getKeys():<br>                        # If we get here, this means we found a building, without housenumber information, which may be a good candidate<br>                        print 'found a good candidate building without a housenumber'<br>                        found = True; break<br>                else:<br>                    ignorelist.append(candidate)<br>                    print 'Ignoring ', candidate<br>        if found:<br>            break<br>        else:<br>            bboxCalculator.enlargeBoundingBox() # zoom out a bit and try again<br>            if bboxCalculator.getBounds():<br>                mv.recalculateCenterScale(bboxCalculator)<br>    if not(found):<br>        print 'Found no suitable candidate building'<br>        return None<br>    else:<br>        print 'Returning ' + repr(foundway) + ' as the best candidate'<br>        return foundway<br><br>dummy_way = Way()<br>dummy_relation = Relation()<br><br>mv = getMapView()<br>if mv and mv.editLayer and mv.editLayer.data:<br>    selectedRelations = mv.editLayer.data.getSelectedRelations()<br>    selectedWays = mv.editLayer.data.getSelectedWays()<br>    selectedNodes = mv.editLayer.data.getSelectedNodes()<br>    #todoList = TodoListModel(DefaultListSelectionModel())<br>    #print type(todoList)<br>    #print dir(todoList)<br>    if not(selectedRelations or selectedWays or selectedNodes):<br>        JOptionPane.showMessageDialog(Main.parent, "Please select an address node, a building or an associatedStreet relation")<br>    else:<br>        asrelations = []<br>        for node in selectedNodes:<br>            for parent in node.getReferrers():<br>                #print dir(parent)<br>                if parent.getType() == dummy_relation.getType() and parent.get('type') == 'associatedStreet':<br>                    asrelations.append(parent)<br>        for way in selectedWays:<br>            for parent in way.getReferrers():<br>                if parent.getType() == dummy_relation.getType() and parent.get('type') == 'associatedStreet':<br>                    asrelations.append(parent)<br>        for relation in selectedRelations:<br>           for parentrelation in relation.getReferrers():<br>               if parentrelation.get('type') == 'associatedStreet':<br>                    asrelations.append(parent)<br>        #print asrelations<br>        ignorelist = []<br>        for zoomTries in range(2,5):<br>            #for relation in asrelations:<br>                #for member in relation.getMembers():<br>                #    if member.isWay():<br>                #        for node in member.getWay().getNodes():<br>                #            ignorelist.append(node)<br>                #    if member.isNode():<br>                #        ignorelist.append(member.getNode())<br>            for relation in asrelations:<br>                memberCounter = -1<br>                for member in relation.getMembers():<br>                    memberCounter += 1<br>                    if member.isWay() and not(member.getWay().get('addr:housenumber')):<br>                        pass<br>                    if member.isNode():<br>                        node = member.getNode()<br>                        if 'addr:housenumber' in node.getKeys():<br>                            hn = node.get('addr:housenumber')<br>                        print hn<br>                        candidateBuilding = findSuitableBuilding(node, ignorelist, zoomOutThisManyTimes=zoomTries, houseNumber=hn, street=node.get('addr:street'))<br>                        if candidateBuilding:<br>                            candidateBuilding.get("addr:housenumber")<br>                            buildingtype = candidateBuilding.get('building')<br>                            street = candidateBuilding.get('addr:street')<br>                            print buildingtype, street, node.get('addr:street'), candidateBuilding.get("addr:housenumber")<br>                            candaddrhn=candidateBuilding.get("addr:housenumber")<br>                            if buildingtype and not(buildingtype in ['garage','garages']):<br>                                if street and street != node.get('addr:street'):<br>                                    break<br>                                Main.main.getEditLayer().data.setSelected([candidateBuilding, node])<br>                                AutoScaleAction.autoScale("selection")<br>                                if not(street): street = 'No street'<br>                                if not(candaddrhn): candaddrhn = 'No number'<br>                                rc=JOptionPane.showInputDialog('(' + str(zoomTries) + ') Found ' + street +  ' ' + candaddrhn + ' for:', node.get('addr:street') + ' ' + node.get("addr:housenumber"))<br>                                print 'rc', rc<br>                                if rc == None: continue<br>                                #print dir(candidateBuilding.getBBox())<br>                                #print member<br>                                newBuilding = Way(candidateBuilding)<br>                                memberNode = member.getNode()<br>                                for key in memberNode.getKeys():<br>                                    newBuilding.put(key, memberNode.get(key))<br>                                for key in ['addr:city', 'addr:country', 'addr:postcode']:<br>                                    newBuilding.remove(key)<br>                                if candidateBuilding.get('building') == 'yes': <br>                                    newBuilding.put('building', 'house')<br><br>                                CommandsList=[Command.ChangeCommand( candidateBuilding, newBuilding)]<br>                                #Main.main.undoRedo.add(Command.SequenceCommand("Add tags to building", CommandsList))<br>                                <br>                                newRelation = Relation(relation)<br>                                newRelation.removeMember(memberCounter)<br>                                newMember = RelationMember('house', candidateBuilding)<br>                                newRelation.addMember(memberCounter, newMember)<br>                                <br>                                CommandsList.append(Command.ChangeCommand(relation, newRelation))<br>                                #Main.main.undoRedo.add(Command.SequenceCommand("Replace node with building in aS Relation", CommandsList))<br>                                #print dir(memberNode)<br>                                print 'memberNode is undeleted ', memberNode.isDeleted()<br>                                if not(memberNode.isDeleted()):<br>                                    print 'deleting ' + memberNode.get("addr:housenumber")<br>                                    CommandsList.append(Command.DeleteCommand(memberNode))<br>                                Main.main.undoRedo.add(Command.SequenceCommand("Teplace temp node with building in aS relation", CommandsList))<br><br>                                #todoList.add([candidateBuilding])<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">2014-11-05 11:37 GMT+01:00 Tony Emery <span dir="ltr"><<a href="mailto:tony.emery@yahoo.fr" target="_blank">tony.emery@yahoo.fr</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On travaille actuellement dans les communes de la CCPRO dans lesquelles nous<br>
n'avons pas qualifier les adresses.<br>
<br>
Donc, sauf quelques adresses isolées, ça doit pour être jouable.<br>
<br>
Le problème est qu'on doit être sûr que la relation qui est créée dans OSM<br>
récupère aussi les tronçons de voies correspondant et qui, eux, sont déjà<br>
dans OSM.<br>
<span class=""><br>
<br>
<br>
-----<br>
Tony EMERY<br>
Administrateur OpenStreetMap.fr<br>
Mandataire Grand Sud-Est<br>
Géomaticien & chef de projets<br>
--<br>
</span>View this message in context: <a href="http://gis.19327.n5.nabble.com/Creation-automatique-de-relations-associated-street-tp5823180p5823208.html" target="_blank">http://gis.19327.n5.nabble.com/Creation-automatique-de-relations-associated-street-tp5823180p5823208.html</a><br>
<span class="im HOEnZb">Sent from the France mailing list archive at Nabble.com.<br>
<br>
</span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
Talk-fr mailing list<br>
<a href="mailto:Talk-fr@openstreetmap.org">Talk-fr@openstreetmap.org</a><br>
<a href="https://lists.openstreetmap.org/listinfo/talk-fr" target="_blank">https://lists.openstreetmap.org/listinfo/talk-fr</a><br>
</div></div></blockquote></div><br></div>