Changes between Version 1 and Version 2 of Help/Plugin/Scripting/Python/RCN_Route_Validator
- Timestamp:
- 2011-10-30T21:04:16+01:00 (14 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Help/Plugin/Scripting/Python/RCN_Route_Validator
v1 v2 1 1 2 2 {{{ 3 #!python 3 4 #!/bin/jython 4 5 ''' 5 6 CheckRouteOrNetworkOrCollectionOfRoutes.jy 6 - Validation of a rcn route, network or collection of networks relation 7 - Depending on what is selected in JOSM when invoked 7 - Validation of a rcn route relation 8 8 9 9 This code is released under the GNU General … … 55 55 #'downloadReferrersForNodes': None, # This will download all ways and relations for nodes with an rcn_ref 56 56 #'downloadReferrersForWays': None, # This will download all relations for ways that have an endnode with an rcn_ref 57 'downloadIncompleteMembers': None, 57 #'downloadIncompleteMembers': None, 58 58 'createWikiReport': None, 59 'createGarminGPX': None, 59 #'createGarminGPX': None, # not implemented yet 60 60 #'checkOneWays = False, # not implemented yet 61 61 } … … 63 63 logVerbosity = 10 64 64 ''' 65 10: only report problems that need fixing65 10: only report problems that require attention 66 66 20: report on collection 67 67 30: report on network nodes … … 69 69 50: report everything 70 70 ''' 71 71 72 def getMapView(): 72 73 if Main.main and Main.main.map: … … 80 81 nextNode = None 81 82 routeToReturn = Relation(route) 82 ##print dir (routeToReturn) 83 #routeToReturn.clearOsmId() 83 # Which node has the lower rcn_ref? 84 84 lowestNodeInt = 10000; lowPos = 0 85 85 for nodeTuple in beginAndEndnodes: … … 88 88 if not(nextNode): 89 89 return route 90 91 ''' 92 node1: way1 93 node2: way1,way2 94 node3: way2,way3,way4 95 node4: way3,way5 96 node5: way5,way6 97 node6: 98 node8: way8, way9 99 node9: way7,way9,way10 100 node10: way10, way11 101 w1,w2,w3,w5,w6,w7,w4,w8,w9,w10''' 102 # At this point nextNode contains the unique ID of the node with the lower rcn_ref 90 103 members=nodesDict[nextNode] 91 processedMembers = {} 104 processedMembers = {}; inBranch = False 92 105 #print len(nodesDict) 93 106 #print dir(route) … … 96 109 if len(members) == 1: 97 110 member = members[0] 111 elif len(members) == 3: 112 # road is splitting or recombining 113 if inBranch: 114 inBranch = False 115 else: 116 inBranch = True 117 # road is splitting, which is the member we need next? 118 # probably the one not going against a oneway restriction 119 for member in members: 120 if member in processedMembers: continue 121 way = member.getWay() 122 oneway = way.get('oneway') 123 if oneway: 124 oneway = oneway.lower() 125 else: 126 oneway = '' 127 if oneway and not(oneway == 'no'): 128 ob=way.get('oneway:bicycle') 129 if ob: 130 ob = ob.lower() 131 else: 132 ob = '' 133 bo=way.get('bicycle:oneway') 134 if bo: 135 bo = bo.lower() 136 else: 137 bo = '' 138 co=way.get('cycleway_opposite') 139 if co: 140 co = co.lower() 141 else: 142 co = '' 143 onewayForBicycle = oneway in ['yes', '1', 'true', '-1'] and not(ob in ['yes', '1', 'true'] or 144 bo in ['yes', '1', 'true'] or 145 co in ['yes', '1', 'true']) 146 if oneway == '-1': pass # TODO this needs to be taken in consideration 147 if way.getNode(0).getUniqueId() == nextNode: 148 break 98 149 else: 99 150 member = members[1] … … 102 153 way = member.getWay() 103 154 routeToReturn.removeMembersFor(way) 155 print 'lowPos',lowPos 104 156 routeToReturn.addMember(lowPos,member) 105 157 #routeToReturn.setModified(True) … … 107 159 nextNode = way.getNode(way.nodesCount-1).getUniqueId() 108 160 if currentNode == nextNode: 109 nextNode = way.getNode(0).getUniqueId() 161 nextNode = way.getNode(0).getUniqueId() 110 162 if nextNode in nodesDict: 111 163 members=nodesDict[nextNode] … … 124 176 if member.isWay(): 125 177 way = member.getWay() 126 if logVerbosity > 50: print dir(way)127 178 if logVerbosity > 49: 128 179 print way.getKeys() … … 151 202 return listIsContinuous 152 203 153 def checkRCNroute(route): 204 def checkRCNroute(route, aDownloadWasNeeded): 205 if aDownloadWasNeeded: 206 return None, False, '' 154 207 if 'removeNameRefKey_xx-yyAndcreated_by' in sideEffects: 155 208 commandsList = [] … … 184 237 commandsList = [] 185 238 186 fixme = route.get('fixme') == 'incomplete'239 fixme = route.get('fixme') 187 240 rcn_refs = []; route_relation_names = []; memberslist = []; roleInNetwork = '' 188 241 sameNodeNumberRepeated = False 189 242 allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = []; branch = None 243 allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = [] 244 nodesWithrcn_ref = {}; likelyCandidateNodesForActualStartOfRoute = {} 245 tentacle = 0; tentacles = {}; routeHasStarted = False; high_rcn_refEncountered = 0 246 rcn_refAsInt = None 247 # tentacles is a nested list of all the segments of ways wich are present before the actual start of the route 248 # sequence, UID of node with rcn_ref, list with ways, reference to next tentacle sequence 249 # 1st level: rcn_refs 250 # 2nd level: rcn_ref, tentacle sequence, ways, next tentacle 251 # {40: [[1, [5n], 2], 252 # [2, [3n], 3], 253 # [3, [3n, 5n, 7n, 8n], 0], 254 # [4, [4n], 0] 255 # ], 256 # 58: [[1, [2n], 0], 257 # [2, [7n], 1] 258 # ] 259 # } 190 260 newRelation = Relation(route); commandslist = []; i=0; roundabout = [] 191 261 … … 194 264 for member in routeMembers: 195 265 if member.isWay(): 266 if high_rcn_refEncountered: high_rcn_refEncountered += 1 196 267 role = member.getRole() 268 # make a Python list out of the members, in case we want to simply flip all of them 269 # this would happen if we encounter the high rcn_ref before the low rcn_ref 197 270 memberslist.append(member) 198 271 way = member.getWay() 199 #print way.get('name')272 if logVerbosity > 49: print way.get('name') 200 273 wayNodes = way.getNodes() 201 274 202 275 notfoundyet = True 276 if logVerbosity > 49: print wayNodes 277 if role in ['forward']: 278 lastNode=wayNodes[-1] 279 else: 280 lastNode=wayNodes[0] 281 lastNodeUid = lastNode.getUniqueId() 282 if lastNodeUid in likelyCandidateNodesForActualStartOfRoute: 283 likelyCandidateNodesForActualStartOfRoute[lastNodeUid] += 1 284 else: 285 likelyCandidateNodesForActualStartOfRoute[lastNodeUid] = 1 286 203 287 for endnode in wayNodes: 288 endnodeId = endnode.getUniqueId() 204 289 if 'sortRouteRelations' in sideEffects: 205 endnodeId = endnode.getUniqueId()206 290 if not(endnodeId in nodesForSorting): 207 291 nodesForSorting[endnodeId] = [] … … 210 294 rcn_ref = endnode.get('rcn_ref') 211 295 if rcn_ref: 212 rcn_refAsInt = int(rcn_ref) 296 rcn_refAsInt = int(rcn_ref.replace("(","").replace(")","")) 213 297 if 'sortRouteRelations' in sideEffects: beginAndEndNodes.append([rcn_refAsInt, endnodeId]) 298 # keep track of distinct rcn_ref numbers in a list 214 299 if not(rcn_refAsInt in rcn_refs): 300 if len(rcn_refs): high_rcn_refEncountered += 1; tentacle = 0 215 301 rcn_refs.append(rcn_refAsInt) 216 302 else: 217 303 sameNodeNumberRepeated = True 304 # keep track of node IDs with an rcn_ref on them 305 if not(rcn_refAsInt in nodesWithrcn_ref): 306 nodesWithrcn_ref[rcn_refAsInt] = [] 307 nodesWithrcn_ref[rcn_refAsInt].append(endnodeId) 218 308 referrersForNode = endnode.getReferrers(); networkNotFoundForNode = True 219 309 for referrer in referrersForNode: 220 310 if referrer.getType() is dummy_relation.getType(): 311 # This node belongs to a relation 221 312 if referrer.get('type') in ['network'] and referrer.get('network') in ['rcn']: 313 # and we have a winner 222 314 networkNotFoundForNode = False 223 break224 if networkNotFoundForNode:225 # node is not assigned to a network yet226 Main.main.getCurrentDataSet().setSelected(endnode)227 AutoScaleAction.zoomToSelection()228 selectedNode = mv.editLayer.data.getSelected()229 if 'downloadReferrersForNodes' in sideEffects:230 print "Downloading referrers for ", endnode.get('rcn_ref'), ' ', wayNodes231 DownloadReferrersAction.downloadReferrers(mv.editLayer, wayNodes)232 else:233 print "Would download referrers for ", endnode.get('rcn_ref'), ' ', wayNodes234 referrersForNode = endnode.getReferrers()235 for referrer in referrersForNode:236 if referrer.getType() is dummy_relation.getType():237 networkOrRouteType = referrer.get('type') in ['network'] #, 'route']238 if referrer.get('network')=='rcn' and networkOrRouteType:239 315 relname=referrer.get('name') 240 316 if relname: 241 317 route_relation_names.append(relname) 242 elif not(referrer.get('type') in ['route']): 243 route_relation_names.append('Node not assigned to network yet') 244 # FIXME This is still buggy 245 # build 2 structures to help check for continuity on ways 318 break 319 if networkNotFoundForNode: 320 route_relation_names.append('Node not assigned to network yet') 321 if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(endnode) 322 if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection() 323 if 'downloadReferrersForNodes' in sideEffects: 324 aDownloadWasNeeded = True 325 print "Downloading referrers for ", endnode.get('rcn_ref'), ' ', wayNodes 326 DownloadReferrersAction.downloadReferrers(mv.editLayer, wayNodes) 327 return None, False, '' 328 else: 329 print "Would download referrers for ", endnode.get('rcn_ref'), ' ', wayNodes 330 331 # *** Now let's process the ways *** 332 # build at least 2 structures to help check for continuity on ways 333 # possibly there are 'tentacles' before the start or after the end when there are split network nodes 334 if logVerbosity > 49: 335 print 'L2H', allWaysgoingFromLowerToHigher 336 print 'H2L', allWaysgoingFromHigherToLower 337 print 'L2H', allWaysgoingFromLowerToHigherBeyondEndOfRoute 338 print 'H2L', allWaysgoingFromHigherToLowerBeyondEndOfRoute 339 246 340 if i==0: 247 341 lastNodesBeforeSplit = [wayNodes] 342 else: 343 if not(routeHasStarted): 344 if role: 345 if role in ['forward']: 346 firstNode=wayNodes[0] 347 else: 348 firstNode=wayNodes[-1] 349 firstNodeUid = firstNode.getUniqueId() 350 print firstNodeUid, firstNodeUid in likelyCandidateNodesForActualStartOfRoute 351 if firstNodeUid in likelyCandidateNodesForActualStartOfRoute: print likelyCandidateNodesForActualStartOfRoute[firstNodeUid] 352 print likelyCandidateNodesForActualStartOfRoute 353 if firstNodeUid in likelyCandidateNodesForActualStartOfRoute and likelyCandidateNodesForActualStartOfRoute[firstNodeUid]>1: 354 routeHasStarted = True 355 if firstNode.get('rcn_ref'): 356 if logVerbosity > 49: print 'rcn_ref', firstNode.get('rcn_ref'), 'found in ', firstNode.getUniqueId() 357 # This is not the first member anymore and the first node has an rcn_ref and the member has a role, 358 # so we have to assign what we thought was the start of the route to one of our tentacles 359 tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = [] 360 if allWaysgoingFromLowerToHigher: 361 prevRole = allWaysgoingFromLowerToHigher[-1].getRole() 362 if logVerbosity > 49: print 'prevRoleL2H', prevRole 363 if prevRole in ['forward']: 364 interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[-1].getUniqueId() 365 elif prevRole in ['backward']: 366 interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[0].getUniqueId() 367 elif allWaysgoingFromHigherToLower: 368 prevRole = allWaysgoingFromHigherToLower[-1].getRole() 369 if logVerbosity > 49: print 'prevRoleH2L', prevRole 370 if prevRole in ['forward']: 371 interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[0].getUniqueId() 372 elif prevRole in ['backward']: 373 interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[-1].getUniqueId() 374 if interestingNodeId and firstNode.getUniqueId() == interestingNodeId: 375 reference = tentacle+1 376 if allWaysgoingFromLowerToHigher: 377 tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, reference] 378 elif allWaysgoingFromHigherToLower: 379 tentacledescription = [tentacle, allWaysgoingFromHigherToLower, reference] 380 allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = []; branch = None 381 if tentacledescription: 382 if rcn_refAsInt and not(rcn_refAsInt in tentacles): 383 tentacles[rcn_refAsInt] = [] 384 tentacles[rcn_refAsInt].append(tentacledescription) 385 else: 386 # no role on way means this is the actual start of our route 387 # so, all that went into allWaysgoingFromLowerToHigher etc has to go to the last tentacle 388 routeHasStarted = True 389 if allWaysgoingFromLowerToHigher or allWaysgoingFromHigherToLower: 390 tentacle +=1 391 if allWaysgoingFromHigherToLower: 392 allWaysgoingFromLowerToHigher # .append(allWaysgoingFromHigherToLower) 393 tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, 0] 394 # allWaysgoingFromHigherToLower was assigned the start of the route in mistake in this case 395 # it should have gone to both 'branches', so we create a shallow copy 396 allWaysgoingFromLowerToHigher = allWaysgoingFromHigherToLower[:]; branch = None 397 if not(rcn_refAsInt in tentacles): 398 tentacles[rcn_refAsInt] = [] 399 tentacles[rcn_refAsInt].append(tentacledescription) 400 if high_rcn_refEncountered > 1: 401 # We're past the first high rcn_ref 402 if role: 403 if role in ['forward']: 404 lastNode=wayNodes[-1] 405 else: 406 lastNode=wayNodes[0] 407 if lastNode.get('rcn_ref'): 408 print 'rcn_ref', lastNode.get('rcn_ref'), 'found in ', lastNode.getUniqueId() 409 tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = [] 410 if interestingNodeId and lastNode.getUniqueId() == interestingNodeId: 411 reference = tentacle+1 412 if allWaysgoingFromLowerToHigher: 413 tentacledescription = [tentacle, allWaysgoingFromLowerToHigherBeyondEndOfRoute, reference] 414 elif allWaysgoingFromHigherToLower: 415 tentacledescription = [tentacle, allWaysgoingFromHigherToLowerBeyondEndOfRoute, reference] 416 allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = []; branch = None 417 if tentacledescription: 418 if rcn_refAsInt and not(rcn_refAsInt in tentacles): 419 tentacles[rcn_refAsInt] = [] 420 tentacles[rcn_refAsInt].append(tentacledescription) 421 if logVerbosity > 49: print tentacle, repr(tentacles) 422 248 423 if role and role in ['forward', 'backward']: 249 if not(branch): 250 print 'wayNodes', wayNodes 251 424 # if there is a role, it might be part of the route proper when it branches 425 # this is what we suppose, if we encounter another node with a low rcn_ref, we add what we already had 426 # to the tentacles structure and clear fromLowToHigh 427 if not(branch): 252 428 if wayNodes: 253 429 if role in ['forward']: … … 257 433 else: 258 434 return '', True, '|align="right" | way has no nodes||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" needs to be downloaded first\n' 435 if logVerbosity > 49: print waynodes 259 436 if logVerbosity > 29: 260 437 print 'lastNodesBeforeSplit', lastNodesBeforeSplit … … 267 444 branch = 'HigherToLower' 268 445 269 elif not(allWaysgoingFromHigherToLower) and wayNodes[-1].get('rcn_ref') and not(member.getUniqueId() == routeMembers[-1].getUniqueId()): 446 elif branch == 'LowerToHigher' and not(allWaysgoingFromHigherToLower) and wayNodes[-1].get('rcn_ref') and not(member.getUniqueId() == routeMembers[-1].getUniqueId()): 270 447 # This is for when the route starts forked from a different rcn node (split node situation), we don't want it to kick in for the last member of the route 271 448 branch = 'HigherToLower' … … 273 450 branch = 'LowerToHigher' 274 451 print branch 275 if branch == 'LowerToHigher': 276 allWaysgoingFromLowerToHigher.append(member) 277 elif branch == 'HigherToLower': 278 allWaysgoingFromHigherToLower.append(member) 452 if high_rcn_refEncountered < 2: 453 if branch == 'LowerToHigher': 454 allWaysgoingFromLowerToHigher.append(member) 455 elif branch == 'HigherToLower': 456 allWaysgoingFromHigherToLower.append(member) 457 else: 458 if branch == 'LowerToHigher': 459 allWaysgoingFromLowerToHigherBeyondEndOfRoute.append(member) 460 elif branch == 'HigherToLower': 461 allWaysgoingFromHigherToLowerBeyondEndOfRoute.append(member) 279 462 else: 280 463 branch = None; roundabout = [] 281 allWaysgoingFromLowerToHigher.append(member) 282 allWaysgoingFromHigherToLower.append(member) 464 routeHasStarted = True 465 if high_rcn_refEncountered < 2: 466 allWaysgoingFromLowerToHigher.append(member) 467 allWaysgoingFromHigherToLower.append(member) 468 else: 469 allWaysgoingFromLowerToHigherBeyondEndOfRoute.append(member) 470 allWaysgoingFromHigherToLowerBeyondEndOfRoute.append(member) 283 471 if way.get('junction') == 'roundabout': 284 472 roundabout = way.getNodes() 473 elif member.isNode(): 474 node = member.getNode() 475 #commandsList.append(Command.ChangeCommand(route, sortedRelation)) 476 #Main.main.undoRedo.add(Command.SequenceCommand("Sorted route relation", commandsList)) 285 477 i+=1 286 478 #if modified: … … 292 484 if len(allWaysgoingFromLowerToHigher) > 1: 293 485 continuous_forward = checkForContinuity(allWaysgoingFromLowerToHigher) 294 if not(continuous_forward) and not(fixme) and 'sortRouteRelations' in sideEffects:486 if 'sortRouteRelations' in sideEffects and not(continuous_forward) and not(fixme): 295 487 sortedRelation = sortRouteRelation(route, nodesForSorting, beginAndEndNodes) 296 488 … … 351 543 # a route relation with only one way member 352 544 continuous_backward = True 353 545 print continuous_forward, continuous_backward 546 547 for rcn_nodeTentacles in tentacles: 548 for seq, tentacleMember, next in tentacles[rcn_nodeTentacles]: 549 print rcn_nodeTentacles, ' ', seq, ' ', next, ' ', checkForContinuity(tentacleMember) 354 550 # Drawing conclusions about rcn_refs 355 551 if logVerbosity > 39: print rcn_refs … … 373 569 note = route.get('note') 374 570 newNote = str(rcn_refs[0]).zfill(2) + '-' + str(rcn_refs[1]).zfill(2) 375 #print note, newNote571 if logVerbosity > 49: print note, newNote 376 572 if 'modifyNoteTo_xx-yy' in sideEffects: 377 573 if not(note) or note != newNote: … … 387 583 if len(route_relation_names) > 1 and route_relation_names[0] != route_relation_names[1]: 388 584 # print 'This is probably a CONNECTION to another network' 389 if logVerbosity > 9: print route_relation_names 585 if logVerbosity > 9: print newNote, route_relation_names 390 586 roleInNetwork = 'connection' 587 wikiEN = '' 391 588 else: 392 print 'less than 2 end nodes with rcn_ref found' 589 if logVerbosity > 9: print 'less than 2 end nodes with rcn_ref found for route', newNote 590 wikiEN = 'style="color:red" | ' + repr(rcn_refs) + ' - ?' 393 591 if fixme and not(continuous_forward or continuous_backward): 394 if logVerbosity > 1: print 'FIXME flag is INCOMPLETE'592 if logVerbosity > 9: print 'FIXME flag is INCOMPLETE for route', newNote 395 593 if continuous_forward: 396 594 wikiCF = 'align="right" | continuous' … … 399 597 wikiCF = 'align="right" style="color:red" | NOT continuous' 400 598 if logVerbosity > 9: print 'route ',newNote,' is NOT CONTINUOUS in the forward direction' 401 if logVerbosity > 49: print allWaysgoingFromLowerToHigher 599 if logVerbosity > 49: print 'L2H:', allWaysgoingFromLowerToHigher 402 600 if continuous_backward: 403 601 wikiCB = 'align="right" | continuous' … … 406 604 wikiCB = 'align="right" style="color:red" | NOT continuous' 407 605 if logVerbosity > 9: print 'route ',newNote,' is NOT CONTINUOUS in the backward direction' 408 if logVerbosity > 49: print allWaysgoingFromHigherToLower 606 if logVerbosity > 49: print 'H2L: ', allWaysgoingFromHigherToLower 409 607 print 410 608 if fixme: 411 wikiFM = 'style="color:red" | fixme'609 wikiFM = 'style="color:red" | ' + fixme 412 610 else: 413 611 wikiFM = ' | ' 414 if fixme or not(continuous_forward) or not(continuous_backward): 612 if fixme or not(continuous_forward) or not(continuous_backward) or (len(rcn_refs)<2 and not(route.get('rcn:external_connection'))): 415 613 problem = True 416 614 else: 417 615 problem = False 418 return roleInNetwork, problem, '|align="right" | ' + note + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + wikiFM + ' ||' + wikiCF + ' ||' + wikiCB + '\n' 419 420 def checkNetwork(network): 616 617 return roleInNetwork, problem, '|align="right" | ' + note + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + wikiFM + ' ||' + wikiCF + ' ||' + wikiCB + ' ||' + wikiEN + '\n' 618 619 def checkNetwork(network, aDownloadWasNeeded): 421 620 name = network.get('name') 422 621 if logVerbosity>19: … … 428 627 '\n|-\n!style="width:2.5em" | Node\n!Link\n! # Roads\n! # Relations\n|-\n') 429 628 wikiReportOnRelations = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + 430 '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n|-\n') 629 '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n! end nodes\n|-\n') 431 630 i=1 432 631 for networkMember in network.getMembers(): 433 632 if networkMember.isRelation(): 434 633 routeRelation = networkMember.getRelation() 435 if routeRelation.hasIncompleteMembers(): 436 if 'downloadIncompleteMembers' in sideEffects: 437 print 'Downloading incomplete members for', routeRelation.get('note') 438 DownloadRelationMemberTask.run(DownloadRelationMemberTask(routeRelation, routeRelation.getIncompleteMembers(), mv.editLayer )) 439 continue 440 else: 441 JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the route relations first') 442 break 443 roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(routeRelation) 444 if problemReported and 'createWikiReport' in sideEffects: 445 wikiReportOnRelations += wikiReport + '\n|-\n' 446 role = networkMember.getRole() 447 if logVerbosity > 29 and role != roleFromRouteCheck: 448 print 449 print 'Role in network is ', role 450 print 'Maybe this should be: ', roleFromRouteCheck 634 if routeRelation.get('network') == 'rcn': 635 if routeRelation.hasIncompleteMembers(): 636 name = aRelation.get('name') 637 if not(name): name = '' 638 note = aRelation.get('note') 639 if not(note): note = '' 640 network = aRelation.get('network') 641 if not(network): network = '' 642 if 'downloadIncompleteMembers' in sideEffects: 643 aDownloadWasNeeded = True 644 print 'Downloading incomplete members for', note 645 DownloadRelationMemberTask.run(DownloadRelationMemberTask(routeRelation, routeRelation.getIncompleteMembers(), mv.editLayer )) 646 time.sleep(1) 647 continue 648 else: 649 JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + network + ' ' + note + ' ' + name) 650 break 651 roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(routeRelation, aDownloadWasNeeded) 652 if problemReported and 'createWikiReport' in sideEffects: 653 wikiReportOnRelations += wikiReport + '\n|-\n' 654 role = networkMember.getRole() 655 if logVerbosity > 29 and role != roleFromRouteCheck: 656 print 657 print 'Role in network is ', role 658 print 'Maybe this should be: ', roleFromRouteCheck 451 659 if networkMember.isNode(): 452 660 node = networkMember.getNode() … … 467 675 break 468 676 if networkNotFoundForNode and 'downloadReferrersNodes' in sideEffects: 469 Main.main.getCurrentDataSet().setSelected(node)470 AutoScaleAction.zoomToSelection()471 selectedNode = mv.editLayer.data.getSelected()472 print 'Downloading referrers for ',selectedNode.get('rcn_ref')473 Download ReferrersAction.downloadReferrers(mv.editLayer, selectedNode)474 referrersForNode = node.getReferrers()677 aDownloadWasNeeded = True 678 if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(node) 679 if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection() 680 #selectedNode = mv.editLayer.data.getSelected() 681 print 'Downloading referrers for ', node.get('rcn_ref') 682 DownloadReferrersAction.downloadReferrers(mv.editLayer, node) 475 683 476 684 rcnNetworkCountForNode = roads = 0 … … 480 688 referrersForWay = referrer.getReferrers() 481 689 if len(referrersForWay) < 1 and 'downloadReferrersForWays' in sideEffects: 482 Main.main.getCurrentDataSet().setSelected(referrer)483 AutoScaleAction.zoomToSelection()484 selectedWay = mv.editLayer.data.getSelected()690 aDownloadWasNeeded = True 691 if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(referrer) 692 if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection() 485 693 print 'Downloading referrers for ', referrer.get('name') , ' ', rcn_ref 486 DownloadReferrersAction.downloadReferrers(mv.editLayer, selectedWay)487 referrersForWay = referrer.getReferrers() 694 DownloadReferrersAction.downloadReferrers(mv.editLayer, referrer) 695 488 696 for wayReferrer in referrersForWay: 489 697 if wayReferrer.getType() is dummy_relation.getType(): … … 491 699 if aRelation.get('type') == 'route' and aRelation.get('network') == 'rcn': 492 700 rcnNetworkCountForNode+=1 701 if aRelation.hasIncompleteMembers(): 702 name = aRelation.get('name') 703 if not(name): name = '' 704 note = aRelation.get('note') 705 if not(note): note = '' 706 networkname = aRelation.get('network') 707 if not(networkname): networkname = '' 708 if 'downloadIncompleteMembers' in sideEffects: 709 aDownloadWasNeeded = True 710 print 'Downloading incomplete members for', note 711 DownloadRelationMemberTask.run(DownloadRelationMemberTask(aRelation, aRelation.getIncompleteMembers(), mv.editLayer )) 712 time.sleep(1) 713 continue 714 else: 715 JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + networkname + ' ' + note + ' ' + name) 716 break 493 717 networkMembersList = [] 494 718 for subMember in network.getMembers(): … … 499 723 if not(routeId in networkMembersList): 500 724 if aRelation.get('network') == 'rcn': 501 roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(aRelation) 725 roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(aRelation, aDownloadWasNeeded) 502 726 if problemReported and 'createWikiReport' in sideEffects: 503 727 wikiReportOnRelations += wikiReport + '\n|-\n' 504 if 'addRouteToNetwork' in sideEffects: 728 if 'addRouteToNetwork' in sideEffects and not(aDownloadWasNeeded): 505 729 newRelation = Relation(network) 506 730 newmember = RelationMember(roleFromRouteCheck, aRelation) … … 531 755 532 756 757 aDownloadWasNeeded = False 758 ''' 759 Since Downloading referrers or missing members happens asynchronously in a separate worker thread 760 the script can run in three modes 761 762 1. No downloads allowed/offline run; output mentions that data was incomplete in its reports. 763 2. Download run; When incomplete items are encountered, they are scheduled to be downloaded. From then on, no more quality checks are performed on the data. 764 All hierarchies are still checked, looking for more incomplete data for which more downloads need to be scheduled. 765 3. Normal run; All data is available and proper reporting can be performed. 766 ''' 767 533 768 dummy_way = Way() 534 769 dummy_relation = Relation() … … 536 771 mv = getMapView() 537 772 if mv and mv.editLayer and mv.editLayer.data: 538 if 'createWikiReport' in sideEffects:539 fh = open('C:/wikiReport.txt', 'w')540 fh.close()541 773 selectedRelations = mv.editLayer.data.getSelectedRelations() 542 774 … … 544 776 JOptionPane.showMessageDialog(Main.parent, "Please select a route, network or collection relation") 545 777 else: 778 if 'createWikiReport' in sideEffects: 779 fh = open('C:/wikiReport.txt', 'w') 780 fh.close() 546 781 for relation in selectedRelations: 547 782 if logVerbosity> 49: print relation 548 783 if relation.hasIncompleteMembers(): 549 784 if 'downloadIncompleteMembers' in sideEffects: 785 aDownloadWasNeeded = True 550 786 print 'Downloading referrers for ', str(relation.get('name')), ' ', str(relation.get('note')) 551 787 DownloadRelationMemberTask.run(DownloadRelationMemberTask(relation, relation.getIncompleteMembers(), mv.editLayer )) … … 553 789 else: 554 790 JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the relations first') 555 break791 exit() 556 792 if relation.get('network') == 'rcn': 557 793 relationType = relation.get('type') 558 794 if relationType == 'route': 559 checkRCNroute(relation) 795 checkRCNroute(relation, aDownloadWasNeeded) 560 796 elif relationType == 'network': 561 checkNetwork(relation) 797 checkNetwork(relation, aDownloadWasNeeded) 562 798 elif relationType == 'collection': 563 799 for collectionMember in relation.getMembers(): … … 565 801 networkRelation = collectionMember.getRelation() 566 802 if networkRelation.hasIncompleteMembers(): 803 name = networkRelation.get('name') 804 if not(name): name = '' 805 networkname = networkRelation.get('network') 806 if not(networkname): networkname = '' 567 807 if 'downloadIncompleteMembers' in sideEffects: 568 print 'Downloading referrers for ', relation.get('name') 808 aDownloadWasNeeded = True 809 print 'Downloading referrers for ', name 569 810 DownloadRelationMemberTask.run(DownloadRelationMemberTask(networkRelation, networkRelation.getIncompleteMembers(), mv.editLayer )) 570 811 continue 571 812 else: 572 JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the network relations first ')813 JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the network relations first:' + networkname + ' ' + name) 573 814 break 574 checkNetwork(networkRelation) 815 checkNetwork(networkRelation, aDownloadWasNeeded) 816 if aDownloadWasNeeded: 817 JOptionPane.showMessageDialog(Main.parent, 'There was incomplete data and downloading mode was initiated,\nNo further quality checks were performed.\nPlease run the script again when all downloads have completed') 575 818 576 819 }}}