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