| | 45 | import codecs |
| | 46 | |
| | 47 | |
| | 48 | # the file name where the report for the wiki goes, needs to be configurable |
| | 49 | wikiReportFN = 'C:/data/wikiReport.txt' |
| | 50 | # comment to disable side effect |
| | 51 | sideEffects = { |
| | 52 | 'addRouteToNetwork': None, |
| | 53 | 'removeNameRefKey_xx-yyAndcreated_by': None, |
| | 54 | 'modifyNoteTo_xx-yy': None, |
| | 55 | 'flipOrderOfMembers': None, # such that ways go from lower rXn_ref to higher rXn_ref |
| | 56 | #'sortRouteRelations': None, |
| | 57 | #'sortNetworkRelations': None, |
| | 58 | #'removeNodesFromRoutes': None, |
| | 59 | #'addNodes2Routes': None, |
| | 60 | #'selectObjects': None, |
| | 61 | #'zoomToSelection': None, |
| | 62 | #'downloadReferrersForNodes': None, # This will download all ways and relations for nodes with an rXn_ref |
| | 63 | #'downloadReferrersForWays': None, # This will download all relations for ways that have an endnode with an rXn_ref |
| | 64 | 'downloadIncompleteMembers': None, |
| | 65 | 'createWikiReport': None, |
| | 66 | 'reportWhenWaysAreUsedInAnotherRelationToo': None, |
| | 67 | 'addFixmeTODOtags': None, # This will add todo tags to the data containing problems, |
| | 68 | # the intention is that these tags are removed before uploading, |
| | 69 | # once the reported problems are resolved |
| | 70 | #'createGarminGPX': None, # not implemented yet |
| | 71 | #'checkOneWays = False, # not implemented yet |
| | 72 | } |
| | 73 | |
| | 74 | logVerbosity = 30 |
| | 75 | ''' |
| | 76 | 10: only report problems that require attention |
| | 77 | 20: report on collection |
| | 78 | 30: report on network nodes |
| | 79 | 40: report on which routes are being checked |
| | 80 | 50: report everything |
| | 81 | ''' |
| | 122 | elif len(members) == 3: |
| | 123 | # road is splitting or recombining |
| | 124 | if inBranch: |
| | 125 | inBranch = False |
| | 126 | else: |
| | 127 | inBranch = True |
| | 128 | # road is splitting, which is the member we need next? |
| | 129 | # probably the one not going against a oneway restriction |
| | 130 | for member in members: |
| | 131 | if member in processedMembers: continue |
| | 132 | way = member.getWay() |
| | 133 | oneway = way.get('oneway') |
| | 134 | if oneway: |
| | 135 | oneway = oneway.lower() |
| | 136 | else: |
| | 137 | oneway = '' |
| | 138 | if oneway and not(oneway == 'no'): |
| | 139 | ob=way.get('oneway:bicycle') |
| | 140 | if ob: |
| | 141 | ob = ob.lower() |
| | 142 | else: |
| | 143 | ob = '' |
| | 144 | bo=way.get('bicycle:oneway') |
| | 145 | if bo: |
| | 146 | bo = bo.lower() |
| | 147 | else: |
| | 148 | bo = '' |
| | 149 | co=way.get('cycleway_opposite') |
| | 150 | if co: |
| | 151 | co = co.lower() |
| | 152 | else: |
| | 153 | co = '' |
| | 154 | onewayForBicycle = oneway in ['yes', '1', 'true', '-1'] and not(ob in ['yes', '1', 'true'] or |
| | 155 | bo in ['yes', '1', 'true'] or |
| | 156 | co in ['yes', '1', 'true']) |
| | 157 | if oneway == '-1': pass # TODO this also needs to be taken in consideration |
| | 158 | if way.getNode(0).getUniqueId() == nextNode: |
| | 159 | break |
| 125 | | def checkRCNroute(route): |
| 126 | | commandsList = [] |
| 127 | | reNumberDashNumber = re.compile(r'\d+-\d+') |
| 128 | | newRelation = Relation(route) |
| 129 | | relationChanged = False |
| 130 | | created_by = route.get('created_by') |
| 131 | | if created_by: |
| 132 | | print 'removing created_by' |
| 133 | | newRelation.remove('created_by') |
| 134 | | relationChanged = True |
| 135 | | name = route.get('name') |
| 136 | | if name: |
| 137 | | if reNumberDashNumber.match(name): |
| 138 | | print 'removing name when it is of the form ##-##' |
| | 216 | def checkPTroute(route, aDownloadWasNeeded): |
| | 217 | if aDownloadWasNeeded: |
| | 218 | return None, False, '' |
| | 219 | fixme = route.get('fixme') |
| | 220 | |
| | 221 | newRelation = Relation(route); commandslist = []; i=0; roundabout = [] |
| | 222 | wayssequence = []; stopssequence = [] |
| | 223 | unusedways = []; unservedstops = [] |
| | 224 | routeMembers = route.getMembers() |
| | 225 | modified = False |
| | 226 | for member in routeMembers: |
| | 227 | if member.isWay(): |
| | 228 | wayssequence.append(member) |
| | 229 | unusedways.append(member.getWay()) |
| | 230 | elif member.isNode() and (member.getNode().get("highway") in ['bus_stop', 'bus_station'] or member.getNode().get("public_transport") in ['platform']): |
| | 231 | stopssequence.append(member.getNode()) |
| | 232 | unservedstops.append(member.getNode()) |
| | 233 | print(checkForContinuity(wayssequence)) |
| | 234 | def checkRxNroute(route, networklevel, aDownloadWasNeeded): |
| | 235 | if aDownloadWasNeeded: |
| | 236 | return None, False, '' |
| | 237 | if 'removeNameRefKey_xx-yyAndcreated_by' in sideEffects: |
| | 238 | commandsList = [] |
| | 239 | reNumberDashNumber = re.compile(r'\d+\s-\s\d+') |
| | 240 | newRelation = Relation(route) |
| | 241 | relationChanged = False |
| | 242 | created_by = route.get('created_by') |
| | 243 | if created_by: |
| | 244 | print 'removing created_by' |
| | 245 | newRelation.remove('created_by') |
| | 246 | relationChanged = True |
| | 247 | name = route.get('name') |
| | 248 | if name: |
| | 249 | #if reNumberDashNumber.match(name): |
| | 250 | print 'removing name' |
| 141 | | else: |
| 142 | | name = '' |
| 143 | | ref = route.get('ref') |
| 144 | | if ref: |
| 145 | | if reNumberDashNumber.match(ref): |
| 146 | | print 'removing ref when it is of the form ##-##' |
| 147 | | newRelation.remove('ref') |
| 148 | | relationChanged = True |
| 149 | | else: |
| 150 | | ref = '' |
| 151 | | if relationChanged: |
| 152 | | commandsList.append(Command.ChangeCommand(route, newRelation)) |
| 153 | | |
| 154 | | Main.main.undoRedo.add(Command.SequenceCommand("Removing name and/or ref and/or created_by" + name + '/' + ref, commandsList)) |
| 155 | | commandsList = [] |
| 156 | | |
| 157 | | fixme = route.get('fixme') == 'incomplete' |
| 158 | | rcn_refs = []; route_relation_names = []; memberslist = []; roleInNetwork = '' |
| | 253 | else: |
| | 254 | name = '' |
| | 255 | ref = route.get('ref') |
| | 256 | if ref: |
| | 257 | if reNumberDashNumber.match(ref): |
| | 258 | print 'removing ref when it is of the form ##-##' |
| | 259 | newRelation.remove('ref') |
| | 260 | relationChanged = True |
| | 261 | else: |
| | 262 | ref = '' |
| | 263 | if relationChanged: |
| | 264 | commandsList.append(Command.ChangeCommand(route, newRelation)) |
| | 265 | |
| | 266 | Main.main.undoRedo.add(Command.SequenceCommand("Removing name and/or ref and/or created_by" + name + '/' + ref, commandsList)) |
| | 267 | commandsList = [] |
| | 268 | |
| | 269 | fixme = route.get('fixme') |
| | 270 | rXn_refs = []; actual_rXn_refs = []; route_relation_names = [] |
| | 271 | memberslist = []; waymembersinlist = 0; roleInNetwork = '' |
| 162 | | nodesForSorting = {}; beginAndEndNodes = [] |
| 163 | | newRelation = Relation(route); commandslist = []; modified = False; i=0; roundabout = [] |
| 164 | | |
| 165 | | for member in route.getMembers(): |
| | 274 | allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = [] |
| | 275 | nodesWithrXn_ref = {}; likelyCandidateNodesForActualStartOfRoute = {} |
| | 276 | tentacle = 0; tentacles = {}; routeHasStarted = False; high_rXn_refEncountered = 0 |
| | 277 | rXn_refAsInt = None |
| | 278 | # tentacles is a nested list of all the segments of ways wich are present before the actual start of the route |
| | 279 | # sequence, UID of node with rXn_ref, list with ways, reference to next tentacle sequence |
| | 280 | # 1st level: rXn_refs |
| | 281 | # 2nd level: rXn_ref, tentacle sequence, ways, next tentacle |
| | 282 | # {40: [[1, [5n], 2], |
| | 283 | # [2, [3n], 3], |
| | 284 | # [3, [3n, 5n, 7n, 8n], 0], |
| | 285 | # [4, [4n], 0] |
| | 286 | # ], |
| | 287 | # 58: [[1, [2n], 0], |
| | 288 | # [2, [7n], 1] |
| | 289 | # ] |
| | 290 | # } |
| | 291 | newRelation = Relation(route); commandslist = []; i=0; roundabout = [] |
| | 292 | |
| | 293 | if 'sortRouteRelations' in sideEffects: nodesForSorting = {}; beginAndEndNodes = [] |
| | 294 | routeMembers = route.getMembers() |
| | 295 | modified = False |
| | 296 | |
| | 297 | for member in routeMembers: |
| | 298 | memberslist.append(member) |
| 181 | | endnodeId = endnode.getId() |
| 182 | | if not(endnodeId in nodesForSorting): |
| 183 | | nodesForSorting[endnodeId] = [] |
| 184 | | nodesForSorting[endnodeId].append(member) |
| 185 | | |
| 186 | | rcn_ref = endnode.get('rcn_ref') |
| 187 | | if rcn_ref: |
| 188 | | rcn_refAsInt = int(rcn_ref) |
| 189 | | beginAndEndNodes.append([rcn_refAsInt, endnodeId]) |
| 190 | | if not(rcn_refAsInt in rcn_refs): |
| 191 | | rcn_refs.append(rcn_refAsInt) |
| | 322 | endnodeId = endnode.getUniqueId() |
| | 323 | if 'sortRouteRelations' in sideEffects: |
| | 324 | if not(endnodeId in nodesForSorting): |
| | 325 | nodesForSorting[endnodeId] = [] |
| | 326 | nodesForSorting[endnodeId].append(member) |
| | 327 | |
| | 328 | rXn_ref = endnode.get(networklevel + '_ref') |
| | 329 | if rXn_ref: |
| | 330 | rXn_ref_digits = '' |
| | 331 | for character in rXn_ref: |
| | 332 | try: |
| | 333 | int(character) |
| | 334 | rXn_ref_digits += character |
| | 335 | except: pass |
| | 336 | if rXn_ref_digits and rXn_ref_digits==rXn_ref: |
| | 337 | rXn_refAsInt = int(rXn_ref_digits) |
| | 338 | else: |
| | 339 | rXn_refAsInt = -1 |
| | 340 | |
| | 341 | print rXn_ref |
| | 342 | if 'sortRouteRelations' in sideEffects: beginAndEndNodes.append([rXn_refAsInt, endnodeId]) |
| | 343 | # keep track of distinct rXn_ref numbers in a list |
| | 344 | if not(rXn_refAsInt in rXn_refs): |
| | 345 | if len(rXn_refs): high_rXn_refEncountered += 1; tentacle = 0 |
| | 346 | rXn_refs.append(rXn_refAsInt) |
| | 347 | if rXn_refAsInt == -1: |
| | 348 | actual_rXn_refs.append(rXn_ref) |
| | 349 | else: |
| | 350 | actual_rXn_refs.append(str(rXn_refAsInt).zfill(2)) |
| 214 | | elif not(referrer.get('type') in ['route']): |
| 215 | | route_relation_names.append('Node not assigned to network yet') |
| 216 | | # build 2 structures to help check for continuity on ways |
| | 367 | break |
| | 368 | if networkNotFoundForNode: |
| | 369 | route_relation_names.append('Node not assigned to network yet') |
| | 370 | if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(endnode) |
| | 371 | if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection() |
| | 372 | if 'downloadReferrersForNodes' in sideEffects: |
| | 373 | aDownloadWasNeeded = True |
| | 374 | print "Downloading referrers for ", endnode.get(networklevel + '_ref'), ' ', wayNodes |
| | 375 | DownloadReferrersAction.downloadReferrers(mv.editLayer, wayNodes) |
| | 376 | return None, False, '' |
| | 377 | else: |
| | 378 | print "Would download referrers for ", endnode.get(networklevel + '_ref'), ' ', wayNodes |
| | 379 | |
| | 380 | # *** Now let's process the ways *** |
| | 381 | # build at least 2 structures to help check for continuity on ways |
| | 382 | # possibly there are 'tentacles' before the start or after the end when there are split network nodes |
| | 383 | if logVerbosity > 49: |
| | 384 | print 'L2H', allWaysgoingFromLowerToHigher |
| | 385 | print 'H2L', allWaysgoingFromHigherToLower |
| | 386 | print 'L2H', allWaysgoingFromLowerToHigherBeyondEndOfRoute |
| | 387 | print 'H2L', allWaysgoingFromHigherToLowerBeyondEndOfRoute |
| | 388 | |
| | 391 | else: |
| | 392 | if not(routeHasStarted): |
| | 393 | if role: |
| | 394 | if role in ['forward']: |
| | 395 | firstNode=wayNodes[0] |
| | 396 | else: |
| | 397 | firstNode=wayNodes[-1] |
| | 398 | firstNodeUid = firstNode.getUniqueId() |
| | 399 | print firstNodeUid, firstNodeUid in likelyCandidateNodesForActualStartOfRoute |
| | 400 | if firstNodeUid in likelyCandidateNodesForActualStartOfRoute: print likelyCandidateNodesForActualStartOfRoute[firstNodeUid] |
| | 401 | print likelyCandidateNodesForActualStartOfRoute |
| | 402 | if firstNodeUid in likelyCandidateNodesForActualStartOfRoute and likelyCandidateNodesForActualStartOfRoute[firstNodeUid]>1: |
| | 403 | routeHasStarted = True |
| | 404 | if firstNode.get(networklevel + '_ref'): |
| | 405 | if logVerbosity > 49: print 'rXn_ref', firstNode.get(networklevel + '_ref'), 'found in ', firstNode.getUniqueId() |
| | 406 | # This is not the first member anymore and the first node has an rXn_ref and the member has a role, |
| | 407 | # so we have to assign what we thought was the start of the route to one of our tentacles |
| | 408 | tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = [] |
| | 409 | if allWaysgoingFromLowerToHigher: |
| | 410 | prevRole = allWaysgoingFromLowerToHigher[-1].getRole() |
| | 411 | if logVerbosity > 49: print 'prevRoleL2H', prevRole |
| | 412 | if prevRole in ['forward']: |
| | 413 | interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[-1].getUniqueId() |
| | 414 | elif prevRole in ['backward']: |
| | 415 | interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[0].getUniqueId() |
| | 416 | elif allWaysgoingFromHigherToLower: |
| | 417 | prevRole = allWaysgoingFromHigherToLower[-1].getRole() |
| | 418 | if logVerbosity > 49: print 'prevRoleH2L', prevRole |
| | 419 | if prevRole in ['forward']: |
| | 420 | interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[0].getUniqueId() |
| | 421 | elif prevRole in ['backward']: |
| | 422 | interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[-1].getUniqueId() |
| | 423 | if interestingNodeId and firstNode.getUniqueId() == interestingNodeId: |
| | 424 | reference = tentacle+1 |
| | 425 | if allWaysgoingFromLowerToHigher: |
| | 426 | tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, reference] |
| | 427 | elif allWaysgoingFromHigherToLower: |
| | 428 | tentacledescription = [tentacle, allWaysgoingFromHigherToLower, reference] |
| | 429 | allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = []; branch = None |
| | 430 | if tentacledescription: |
| | 431 | if rXn_refAsInt and not(rXn_refAsInt in tentacles): |
| | 432 | tentacles[rXn_refAsInt] = [] |
| | 433 | tentacles[rXn_refAsInt].append(tentacledescription) |
| | 434 | else: |
| | 435 | # no role on way means this is the actual start of our route |
| | 436 | # so, all that went into allWaysgoingFromLowerToHigher etc has to go to the last tentacle |
| | 437 | routeHasStarted = True |
| | 438 | if allWaysgoingFromLowerToHigher or allWaysgoingFromHigherToLower: |
| | 439 | tentacle +=1 |
| | 440 | if allWaysgoingFromHigherToLower: |
| | 441 | allWaysgoingFromLowerToHigher # .append(allWaysgoingFromHigherToLower) |
| | 442 | tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, 0] |
| | 443 | # allWaysgoingFromHigherToLower was assigned the start of the route in mistake in this case |
| | 444 | # it should have gone to both 'branches', so we create a shallow copy |
| | 445 | allWaysgoingFromLowerToHigher = allWaysgoingFromHigherToLower[:]; branch = None |
| | 446 | if not(rXn_refAsInt in tentacles): |
| | 447 | tentacles[rXn_refAsInt] = [] |
| | 448 | tentacles[rXn_refAsInt].append(tentacledescription) |
| | 449 | if high_rXn_refEncountered > 1: |
| | 450 | # We're past the first high rXn_ref, time to disover more tentacles |
| | 451 | if role: |
| | 452 | if role in ['forward']: |
| | 453 | lastNode=wayNodes[-1] |
| | 454 | else: |
| | 455 | lastNode=wayNodes[0] |
| | 456 | if lastNode.get(networklevel + '_ref'): |
| | 457 | print 'rXn_ref', lastNode.get(networklevel + '_ref'), 'found in ', lastNode.getUniqueId() |
| | 458 | tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = [] |
| | 459 | if interestingNodeId and lastNode.getUniqueId() == interestingNodeId: |
| | 460 | reference = tentacle+1 |
| | 461 | if allWaysgoingFromLowerToHigher: |
| | 462 | tentacledescription = [tentacle, allWaysgoingFromLowerToHigherBeyondEndOfRoute, reference] |
| | 463 | elif allWaysgoingFromHigherToLower: |
| | 464 | tentacledescription = [tentacle, allWaysgoingFromHigherToLowerBeyondEndOfRoute, reference] |
| | 465 | allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = []; branch = None |
| | 466 | if tentacledescription: |
| | 467 | if rXn_refAsInt and not(rXn_refAsInt in tentacles): |
| | 468 | tentacles[rXn_refAsInt] = [] |
| | 469 | tentacles[rXn_refAsInt].append(tentacledescription) |
| | 470 | if logVerbosity > 49: print tentacle, repr(tentacles) |
| | 471 | |
| 224 | | lastNodesBeforeSplit = [wayNodes[-1]] |
| 225 | | print 'wayNodes', wayNodes |
| 226 | | print 'lastNodesBeforeSplit', lastNodesBeforeSplit |
| 227 | | print way.getNodesCount(), 'startnode', wayNodes[0], 'endnode', wayNodes[-1] |
| 228 | | print 'roundabout', roundabout |
| 229 | | |
| | 483 | return '', True, '|align="right" | way has no nodes||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" needs to be downloaded first\n' |
| | 484 | if logVerbosity > 49: print waynodes |
| | 485 | if logVerbosity > 29: |
| | 486 | print 'lastNodesBeforeSplit', lastNodesBeforeSplit |
| | 487 | print way.getNodesCount(), 'startnode', wayNodes[0], 'endnode', wayNodes[-1] |
| | 488 | print 'roundabout', roundabout |
| | 489 | print wayNodes[-1].get(networklevel + '_ref'),not(member.getUniqueId() == routeMembers[-1].getUniqueId()) |
| 257 | | #if not(continuous_forward) and not(fixme): |
| 258 | | #sortedRelation = sortRouteRelation(route, nodesForSorting, beginAndEndNodes) |
| 259 | | |
| 260 | | #print route |
| 261 | | #print sortedRelation |
| 262 | | #commandsList.append(Command.ChangeCommand(route, sortedRelation)) |
| 263 | | #Main.main.undoRedo.add(Command.SequenceCommand("Sorted route relation", commandsList)) |
| 264 | | #allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = [] |
| 265 | | #for member in route.getMembers(): |
| 266 | | #if member.isWay(): |
| 267 | | #role = member.getRole() |
| 268 | | #way = member.getWay() |
| 269 | | #if role=='forward': |
| 270 | | #allWaysgoingFromLowerToHigher.append(member) |
| 271 | | #elif role=='backward': |
| 272 | | #allWaysgoingFromHigherToLower.append(member) |
| 273 | | #else: |
| 274 | | #allWaysgoingFromLowerToHigher.append(member) |
| 275 | | #allWaysgoingFromHigherToLower.append(member) |
| 276 | | #print allWaysgoingFromLowerToHigher |
| 277 | | #continuous_forward = checkForContinuity(allWaysgoingFromLowerToHigher) |
| 278 | | #else: |
| | 559 | if 'sortRouteRelations' in sideEffects and not(continuous_forward) and not(fixme): |
| | 560 | sortedRelation = sortRouteRelation(route, nodesForSorting, beginAndEndNodes) |
| | 561 | |
| | 562 | if logVerbosity>49: |
| | 563 | print route |
| | 564 | print sortedRelation |
| | 565 | |
| | 566 | allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = [] |
| | 567 | routeMembers = sortedRelation.getMembers(); i=0 |
| | 568 | for member in routeMembers: |
| | 569 | if member.isWay(): |
| | 570 | role = member.getRole() |
| | 571 | if i==0: |
| | 572 | lastNodesBeforeSplit = [wayNodes] # why nodes in plural? situations occur where the branch starts on a roundabout |
| | 573 | if role and role in ['forward', 'backward']: |
| | 574 | if not(branch): |
| | 575 | if role in ['forward']: |
| | 576 | lastNodesBeforeSplit = [wayNodes[0]] |
| | 577 | else: |
| | 578 | lastNodesBeforeSplit = [wayNodes[-1]] |
| | 579 | if logVerbosity > 29: |
| | 580 | print 'wayNodes', wayNodes |
| | 581 | print 'lastNodesBeforeSplit', lastNodesBeforeSplit |
| | 582 | print way.getNodesCount(), 'startnode', wayNodes[0], 'endnode', wayNodes[-1] |
| | 583 | print 'roundabout', roundabout |
| | 584 | |
| | 585 | if role in ['forward'] and (wayNodes[-1] in lastNodesBeforeSplit or wayNodes[-1] in roundabout): |
| | 586 | branch = 'HigherToLower' |
| | 587 | elif role in ['backward'] and wayNodes[0] in lastNodesBeforeSplit: |
| | 588 | branch = 'HigherToLower' |
| | 589 | elif wayNodes[-1].get(networklevel + '_ref') and not(member.getUniqueId() == routeMembers[-1].getUniqueId()): # not(allWaysgoingFromHigherToLower) and ## this last part is probably not necessary anymore |
| | 590 | # This is for when the route starts forked from a different rXn node (split node situation), we don't want it to kick in for the last member of the route |
| | 591 | branch = 'HigherToLower' |
| | 592 | elif not(branch == 'HigherToLower'): |
| | 593 | branch = 'LowerToHigher' |
| | 594 | print branch |
| | 595 | if branch == 'LowerToHigher': |
| | 596 | allWaysgoingFromLowerToHigher.append(member) |
| | 597 | elif branch == 'HigherToLower': |
| | 598 | allWaysgoingFromHigherToLower.append(member) |
| | 599 | else: |
| | 600 | branch = None; roundabout = [] |
| | 601 | allWaysgoingFromLowerToHigher.append(member) |
| | 602 | allWaysgoingFromHigherToLower.append(member) |
| | 603 | if way.get('junction') == 'roundabout': |
| | 604 | roundabout = way.getNodes() |
| | 605 | i+=1 |
| | 606 | continuous_forward = checkForContinuity(allWaysgoingFromLowerToHigher) |
| | 607 | if continuous_forward: |
| | 608 | # we only want to store the sorted relation, when sorting actually succeeded in getting it continuous |
| | 609 | commandsList.append(Command.ChangeCommand(route, sortedRelation)) |
| | 610 | Main.main.undoRedo.add(Command.SequenceCommand("Sorted route relation", commandsList)) |
| 306 | | newNote = str(rcn_refs[0]).zfill(2) + '-' + str(rcn_refs[1]).zfill(2) |
| 307 | | #print note, newNote |
| 308 | | if not(note) or note != newNote: |
| 309 | | if not(note): note = 'nothing' |
| 310 | | newRelation.put('note', newNote) |
| | 645 | if not(-1 in rXn_refs): |
| | 646 | rXn_refs.sort() |
| | 647 | newNote = str(rXn_refs[0]).zfill(2) + '-' + str(rXn_refs[-1]).zfill(2) |
| | 648 | else: |
| | 649 | newNote = '' |
| | 650 | for ref in actual_rXn_refs: |
| | 651 | newNote+=ref + '-' |
| | 652 | newNote = newNote[:-1] |
| | 653 | if logVerbosity > 49: print note, newNote |
| | 654 | if 'modifyNoteTo_xx-yy' in sideEffects: |
| | 655 | if (not(note) or note != newNote) and rXn_refs[0] != rXn_refs[-1]: |
| | 656 | newRelation = Relation(route) |
| | 657 | #print newRelation.getUniqueId() |
| | 658 | #print route.getUniqueId() |
| | 659 | if not(note): note = 'nothing' |
| | 660 | newRelation.put('note', newNote) |
| | 661 | relationChanged = True |
| | 662 | commandsList.append(Command.ChangeCommand(route, newRelation)) |
| | 663 | |
| | 664 | Main.main.undoRedo.add(Command.SequenceCommand("Changing note from " + note + ' to ' + newNote, commandsList)) |
| | 665 | commandsList = [] |
| | 666 | |
| | 667 | if len(route_relation_names) > 1 and route_relation_names[0] != route_relation_names[1]: |
| | 668 | # print 'This is probably a CONNECTION to another network' |
| | 669 | if logVerbosity > 9: print newNote, route_relation_names |
| | 670 | roleInNetwork = 'connection' |
| | 671 | wikiEN = '' |
| | 672 | else: |
| | 673 | if logVerbosity > 9: print 'less than 2 end nodes with '+networklevel+'_ref found for route', newNote |
| | 674 | wikiEN = 'style="color:red" | ' + repr(rXn_refs) + ' - ?' |
| | 675 | if 'addFixmeTODOtags' in sideEffects and not(route.get(networklevel+':external_connection')) and not(route.get('roundtrip')): |
| | 676 | newRelation = Relation(route) |
| | 677 | #print newRelation.getUniqueId() |
| | 678 | #print route.getUniqueId() |
| | 679 | fixmetodo = 'less than 2 end nodes with '+networklevel+'_ref found for route' + newNote + ' ' + repr(rXn_refs) + ' ' + note |
| | 680 | newRelation.put('fixmetodo', fixmetodo) |
| 330 | | print 'route ',newNote,' is NOT CONTINUOUS in the forward direction' |
| 331 | | #print allWaysgoingFromLowerToHigher |
| | 693 | if logVerbosity > 9: print 'route ',newNote,' is NOT CONTINUOUS going from xx to yy; xx<yy' |
| | 694 | if logVerbosity > 49: print 'L2H:', allWaysgoingFromLowerToHigher |
| | 695 | if not(fixme) and 'addFixmeTODOtags' in sideEffects: |
| | 696 | newRelation = Relation(route) |
| | 697 | #print newRelation.getUniqueId() |
| | 698 | #print route.getUniqueId() |
| | 699 | fixmetodo += ' ' + newNote + 'is not continuous going from xx to yy; xx<yy' |
| | 700 | newRelation.put('fixmetodo', fixmetodo) |
| | 701 | relationChanged = True |
| | 702 | commandsList.append(Command.ChangeCommand(route, newRelation)) |
| | 703 | if not(note): note = 'UNKNOWN' |
| | 704 | |
| | 705 | Main.main.undoRedo.add(Command.SequenceCommand("report that " + note + ' is not continuous going from xx to yy; xx<yy' , commandsList)) |
| | 706 | commandsList = [] |
| 347 | | problem = False |
| 348 | | return roleInNetwork, problem, '|align="right" | ' + note + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + wikiFM + ' ||' + wikiCF + ' ||' + wikiCB + '\n' |
| 349 | | |
| 350 | | def checkNetwork(network): |
| | 733 | problem = '' |
| | 734 | |
| | 735 | print 'PROBLEM:', problem |
| | 736 | return str(roleInNetwork), problem, '|align="right" | ' + str(note) + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + str(wikiFM) + ' ||' + str(wikiCF) + ' ||' + str(wikiCB) + ' ||' + str(wikiEN) + '\n' |
| | 737 | |
| | 738 | def sortNetwork(network): |
| | 739 | # While making a list of all the nodes in the relation with an rXn_ref, find the node with the lowest rXn_ref in the network, not necessarily 01 and bring it to the first position |
| | 740 | # Look at the ways connecting to this node and their parent route relations with network=rXn |
| | 741 | # For all these relations, make a list of all the rXn_ref numbers, they lead to and remember the UIDs of these nodes and keep a ref to the relations |
| | 742 | # Split this list in two, one for internal routes, another for route relations connecting to a foreign network (so the ones with a connection role) |
| | 743 | # Sort both lists and bring the relations in positions following the first node |
| | 744 | # Do the same for all the relations in the second list |
| | 745 | # Then add the lowest rXn_ref number and remove it from the general todo list of rXn_ref nodes that were encountered in internal route relations |
| 352 | | print '********************************************' |
| 353 | | print name |
| 354 | | print '********************************************' |
| 355 | | #'===' + name + '===\n' + |
| 356 | | wikiReportOnNodes = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
| 357 | | '\n|-\n!style="width:2.5em" | Node\n!Link\n! # Roads\n! # Relations\n|-\n') |
| 358 | | |
| 359 | | wikiReportOnRelations = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
| 360 | | '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n|-\n') |
| | 747 | if logVerbosity>19: |
| | 748 | print '********************************************' |
| | 749 | print name |
| | 750 | print '********************************************' |
| | 751 | lowestrXn_refInNetwork=9999; listOfNodeMembersSeen = [] |
| | 752 | dictionaryWithAllNodesBelongingToThisNetwork = {}; dictionaryWithAllNodesBelongingToNeighbouringNetworks = {} |
| | 753 | ListOfInternalRoutesSeen = []; ListOfExternalRoutesSeen = []; dictionaryLinkingRoutesToNotes = {} |
| | 754 | members = network.getMembers() |
| | 755 | # Find a member node with the lowestrXn_refInNetwork and bring it to the front if such node is not there yet |
| | 756 | firstMember = members[0] |
| | 757 | if firstMember.isRelation() or firstMember.isNode() and int(firstMember.getNode().get(networklevel + '_ref')) != lowestrXn_refInNetwork: |
| | 758 | memberNode = None |
| | 759 | for networkMember in members: |
| | 760 | if networkMember.isNode(): |
| | 761 | memberNode = networkMember.getNode() |
| | 762 | if int(memberNode.get(networklevel + '_ref')) == 1: break |
| | 763 | if memberNode: |
| | 764 | network.removeMembersFor(memberNode) |
| | 765 | network.addMember(0, networkMember) |
| | 766 | |
| | 767 | for networkMember in network.getMembers(): |
| | 768 | if networkMember.isNode(): |
| | 769 | node = networkMember.getNode() |
| | 770 | rXn_ref = node.get(networklevel + '_ref') |
| | 771 | if int(rXn_ref) == 1: |
| | 772 | referrersForNode = node.getReferrers() |
| | 773 | for referrer in referrersForNode: |
| | 774 | if referrer.getType() is dummy_way.getType(): |
| | 775 | referrersForWay = referrer.getReferrers() |
| | 776 | for wayReferrer in referrersForWay: |
| | 777 | if wayReferrer.getType() is dummy_relation.getType(): |
| | 778 | aRelation = wayReferrer |
| | 779 | if aRelation.get('type') == 'route' and aRelation.get('network') ==networklevel and not(aRelation.get('ref')): |
| | 780 | rXnNetworkCountForNode+=1 |
| | 781 | if aRelation.hasIncompleteMembers(): |
| | 782 | name = aRelation.get('name') |
| | 783 | if not(name): name = '' |
| | 784 | note = aRelation.get('note') |
| | 785 | if not(note): note = '' |
| | 786 | networkname = aRelation.get('network') |
| | 787 | if not(networkname): networkname = '' |
| | 788 | if 'downloadIncompleteMembers' in sideEffects: |
| | 789 | aDownloadWasNeeded = True |
| | 790 | print 'Downloading incomplete members for', note |
| | 791 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(aRelation, aRelation.getIncompleteMembers(), mv.editLayer )) |
| | 792 | time.sleep(1) |
| | 793 | continue |
| | 794 | else: |
| | 795 | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + networkname + ' ' + note + ' ' + name) |
| | 796 | break |
| | 797 | networkMembersList = [] |
| | 798 | for subMember in network.getMembers(): |
| | 799 | if subMember.isRelation(): |
| | 800 | routeRelation = subMember.getRelation() |
| | 801 | networkMembersList.append(routeRelation.getUniqueId()) |
| | 802 | routeId = aRelation.getUniqueId() |
| | 803 | if rXnRelationWeWantToProcess and not(routeId in networkMembersList): |
| | 804 | roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(aRelation, aDownloadWasNeeded) |
| | 805 | if problemReported and 'createWikiReport' in sideEffects: |
| | 806 | wikiReportOnRelations += wikiReport + '\n|-\n' |
| | 807 | if 'addRouteToNetwork' in sideEffects and not(aDownloadWasNeeded): |
| | 808 | newRelation = Relation(network) |
| | 809 | newmember = RelationMember(roleFromRouteCheck, aRelation) |
| | 810 | if logVerbosity > 9: print newRelation.getMembersCount(), ' ',i, ' ', newmember |
| | 811 | newRelation.addMember( i, newmember) |
| | 812 | commandsList = [] |
| | 813 | commandsList.append(Command.ChangeCommand(network, newRelation)) |
| | 814 | note = aRelation.get('note') |
| | 815 | if not(note): |
| | 816 | note = '' |
| | 817 | Main.main.undoRedo.add(Command.SequenceCommand("Adding " + note + " to network", commandsList)) |
| | 818 | commandsList = [] |
| | 819 | if logVerbosity > 9: print 'Added newly found RCN route relation to network: ', note |
| | 820 | i+=1 |
| | 821 | |
| | 822 | def checkNetwork(network, networklevel, aDownloadWasNeeded): |
| | 823 | name = ''; name = network.get('name') |
| | 824 | if logVerbosity>19: |
| | 825 | print '********************************************' |
| | 826 | print name |
| | 827 | print '********************************************' |
| | 828 | if 'createWikiReport' in sideEffects: |
| | 829 | wikiReportOnNodes = ('\n==' + name + '==\n{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
| | 830 | '\n|-\n!style="width:2.5em" | Node\n!Link\n! # Roads\n! # Relations\n|-\n') |
| | 831 | wikiReportOnRelations = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
| | 832 | '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n! end nodes\n|-\n') |
| 362 | | for networkmember in network.getMembers(): |
| 363 | | if networkmember.isRelation(): |
| 364 | | subrelation = networkmember.getRelation() |
| 365 | | if subrelation.hasIncompleteMembers(): |
| 366 | | #JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the route relations first') |
| 367 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(subrelation, subrelation.getIncompleteMembers(), mv.editLayer )) |
| 368 | | break |
| 369 | | roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(subrelation) |
| 370 | | if problemReported: |
| 371 | | wikiReportOnRelations += wikiReport + '\n|-\n' |
| 372 | | #if roleFromRouteCheck: |
| 373 | | role = networkmember.getRole() |
| 374 | | if role != roleFromRouteCheck: |
| 375 | | print |
| 376 | | print 'Role in network is ', role |
| 377 | | print 'Maybe this should be: ', roleFromRouteCheck |
| 378 | | if networkmember.isNode(): |
| 379 | | node = networkmember.getNode() |
| 380 | | rcn_ref = node.get('rcn_ref') |
| 381 | | expected_rcn_route_relations = node.get('expected_rcn_route_relations') |
| 382 | | if expected_rcn_route_relations: |
| 383 | | expected_rcn_route_relations = int(expected_rcn_route_relations) |
| | 834 | for networkMember in network.getMembers(): |
| | 835 | if networkMember.isRelation(): |
| | 836 | routeRelation = networkMember.getRelation() |
| | 837 | if routeRelation.get('network') ==networklevel: |
| | 838 | if routeRelation.hasIncompleteMembers(): |
| | 839 | name = routeRelation.get('name') |
| | 840 | if not(name): name = '' |
| | 841 | note = routeRelation.get('note') |
| | 842 | if not(note): note = '' |
| | 843 | kindOfNetwork = routeRelation.get('network') |
| | 844 | if not(kindOfNetwork): kindOfNetwork = '' |
| | 845 | if 'downloadIncompleteMembers' in sideEffects: |
| | 846 | aDownloadWasNeeded = True |
| | 847 | print 'Downloading incomplete members for', note |
| | 848 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(routeRelation, routeRelation.getIncompleteMembers(), mv.editLayer )) |
| | 849 | time.sleep(1) |
| | 850 | continue |
| | 851 | else: |
| | 852 | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + kindOfNetwork + ' ' + note + ' ' + name) |
| | 853 | break |
| | 854 | roleFromRouteCheck, problemReported, wikiReport = checkRxNroute(routeRelation, networklevel, aDownloadWasNeeded) |
| | 855 | if problemReported and 'createWikiReport' in sideEffects: |
| | 856 | wikiReportOnRelations += wikiReport + '\n|-\n' |
| | 857 | role = networkMember.getRole() |
| | 858 | if logVerbosity > 29 and role != roleFromRouteCheck: |
| | 859 | print |
| | 860 | print 'Role in network is ', role |
| | 861 | print 'Maybe this should be: ', roleFromRouteCheck |
| | 862 | if networkMember.isNode(): |
| | 863 | node = networkMember.getNode() |
| | 864 | rXn_ref = node.get(networklevel + '_ref') |
| | 865 | expected_rXn_route_relations = node.get('expected_' + networklevel + '_route_relations') |
| | 866 | if expected_rXn_route_relations: |
| | 867 | expected_rXn_route_relations = int(expected_rXn_route_relations) |
| 407 | | if len(referrersForWay) < 1: |
| 408 | | Main.main.getCurrentDataSet().setSelected(referrer) |
| 409 | | AutoScaleAction.zoomToSelection() |
| 410 | | ##selectedWay = mv.editLayer.data.getSelected() |
| 411 | | #DownloadReferrersAction.downloadReferrers(mv.editLayer, referrersForNode) |
| 412 | | referrersForWay = referrer.getReferrers() |
| 413 | | for wayreferrer in referrersForWay: |
| 414 | | if wayreferrer.getType() is dummy_relation.getType(): |
| 415 | | memberslist = [] |
| 416 | | if wayreferrer.get('type') == 'route' and wayreferrer.get('network') == 'rcn': |
| 417 | | rcnNetworkCountForNode+=1 |
| 418 | | for submember in network.getMembers(): |
| 419 | | if submember.isRelation(): |
| 420 | | subrelation = submember.getRelation() |
| 421 | | memberslist.append(subrelation.getId()) |
| 422 | | if not(wayreferrer.getId()): |
| 423 | | print dir(wayreferrer) |
| 424 | | break |
| 425 | | routeId = wayreferrer.getId() |
| 426 | | if not(routeId) or not(routeId in memberslist): |
| 427 | | if wayreferrer.get('network') == 'rcn': |
| 428 | | roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(wayreferrer) |
| 429 | | print wikiReport |
| 430 | | if problemReported: |
| 431 | | wikiReportOnRelations += wikiReport + '\n|-\n' |
| | 892 | if len(referrersForWay) < 1 and 'downloadReferrersForWays' in sideEffects: |
| | 893 | aDownloadWasNeeded = True |
| | 894 | if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(referrer) |
| | 895 | if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection() |
| | 896 | print 'Downloading referrers for ', referrer.get('name') , ' ', rXn_ref |
| | 897 | DownloadReferrersAction.downloadReferrers(mv.editLayer, referrer) |
| | 898 | |
| | 899 | for wayReferrer in referrersForWay: |
| | 900 | if wayReferrer.getType() is dummy_relation.getType(): |
| | 901 | aRelation = wayReferrer |
| | 902 | rXnRelationWeWantToProcess = False # We need this again further on, when deciding whether or not to add this relation to the network |
| | 903 | if aRelation.get('type') == 'route' and aRelation.get('network') ==networklevel and not(aRelation.get('ref')): # in ['RUR','NRR','NRW','2LR','3LR','KAI','EHR','DFR','WBR','Nk']): |
| | 904 | # The check on the ref is for Germany, where many rXn networks run crisscross through another. |
| | 905 | # We wouldn't want to get entangled in that mess. |
| | 906 | # The list is continuously getting longer, of course. But it's the best we can do here |
| | 907 | rXnRelationWeWantToProcess = True |
| | 908 | rXnNetworkCountForNode+=1 |
| | 909 | if aRelation.hasIncompleteMembers(): |
| | 910 | name = aRelation.get('name') |
| | 911 | if not(name): name = '' |
| | 912 | note = aRelation.get('note') |
| | 913 | if not(note): note = '' |
| | 914 | kindOfNetwork = aRelation.get('network') |
| | 915 | if not(kindOfNetwork): kindOfNetwork = '' |
| | 916 | if 'downloadIncompleteMembers' in sideEffects: |
| | 917 | aDownloadWasNeeded = True |
| | 918 | print 'Downloading incomplete members for', note |
| | 919 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(aRelation, aRelation.getIncompleteMembers(), mv.editLayer )) |
| | 920 | time.sleep(1) |
| | 921 | continue |
| | 922 | else: |
| | 923 | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + kindOfNetwork + ' ' + note + ' ' + name) |
| | 924 | break |
| | 925 | networkMembersList = [] |
| | 926 | # print network |
| | 927 | for subMember in network.getMembers(): |
| | 928 | if subMember.isRelation(): |
| | 929 | routeRelation = subMember.getRelation() |
| | 930 | networkMembersList.append(routeRelation.getUniqueId()) |
| | 931 | routeId = aRelation.getUniqueId() |
| | 932 | if rXnRelationWeWantToProcess and not(routeId in networkMembersList): |
| | 933 | roleFromRouteCheck, problemReported, wikiReport = checkRxNroute(aRelation, networklevel, aDownloadWasNeeded) |
| | 934 | if problemReported and 'createWikiReport' in sideEffects: |
| | 935 | wikiReportOnRelations += wikiReport + '\n|-\n' |
| | 936 | if 'addRouteToNetwork' in sideEffects and not(aDownloadWasNeeded): |
| 451 | | print |
| 452 | | wikiReportOnNodes += ('|-\n|}\n') |
| 453 | | wikiReportOnRelations += ('|-\n|}\n<br style="clear:left;" />\n') |
| 454 | | fh = open('C:/wikiReport.txt', 'a') |
| 455 | | fh.write(wikiReportOnNodes) |
| 456 | | fh.write(wikiReportOnRelations) |
| 457 | | fh.close() |
| 458 | | |
| | 955 | if logVerbosity > 19: print |
| | 956 | if 'createWikiReport' in sideEffects: |
| | 957 | fh = codecs.open(wikiReportFN, 'a', encoding="UTF-8") |
| | 958 | wikiReportOnNodes += ('|-\n|}\n') |
| | 959 | wikiReportOnRelations += ('|-\n|}\n<br style="clear:left;" />\n') |
| | 960 | fh.write(wikiReportOnNodes) |
| | 961 | fh.write(wikiReportOnRelations) |
| | 962 | fh.close() |
| | 963 | |
| | 964 | def checkAssociatedStreet(street): |
| | 965 | streetnameOfRelation = street.get('name') |
| | 966 | streetname = []; housenumber = [] |
| | 967 | for member in street.getMembers(): |
| | 968 | role = member.getRole() |
| | 969 | if role =='street': |
| | 970 | if member.isWay(): |
| | 971 | m = member.getWay() |
| | 972 | elif member.isRelation(): |
| | 973 | m = member.getRelation() |
| | 974 | sname = m.get('name') |
| | 975 | if sname and not(sname in streetname): |
| | 976 | streetname.append(sname) |
| | 977 | elif role =='house': |
| | 978 | if member.isNode(): |
| | 979 | element = member.getNode() |
| | 980 | elif member.isWay(): |
| | 981 | element = member.getWay() |
| | 982 | housenumber=element.get('addr:housenumber') |
| | 983 | sname = element.get('addr:street') |
| | 984 | if sname and not(sname in streetname): |
| | 985 | streetname.append(sname) |
| | 986 | #print streetnameOfRelation, streetname, housenumber |
| | 987 | if len(streetname) != 1 or streetnameOfRelation!=streetname[0]: |
| | 988 | print streetnameOfRelation, len(streetname), streetname |
| | 989 | |
| | 990 | aDownloadWasNeeded = False |
| | 991 | ''' |
| | 992 | Since Downloading referrers or missing members happens asynchronously in a separate worker thread |
| | 993 | the script can run in three modes |
| | 994 | |
| | 995 | 1. No downloads allowed/offline run; output mentions that data was incomplete in its reports. |
| | 996 | 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. |
| | 997 | All hierarchies are still checked, looking for more incomplete data for which more downloads need to be scheduled. |
| | 998 | 3. Normal run; All data is available and proper reporting can be performed. |
| | 999 | ''' |
| 477 | | #JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the relations first') |
| 478 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(relation, relation.getIncompleteMembers(), mv.editLayer )) |
| 479 | | break |
| 480 | | if relation.get('type') == 'route' and relation.get('network') == 'rcn': |
| 481 | | checkRCNroute(relation) |
| 482 | | if relation.get('type') == 'network' and relation.get('network') == 'rcn': |
| 483 | | checkNetwork(relation) |
| 484 | | if relation.get('type') == 'collection' and relation.get('network') == 'rcn': |
| 485 | | for networkmember in relation.getMembers(): |
| 486 | | if networkmember.isRelation(): |
| 487 | | subrelation = networkmember.getRelation() |
| 488 | | if subrelation.hasIncompleteMembers(): |
| 489 | | #JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the network relations first') |
| 490 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(subrelation, subrelation.getIncompleteMembers(), mv.editLayer )) |
| 491 | | #break |
| 492 | | checkNetwork(subrelation) |
| 493 | | |
| | 1017 | if 'downloadIncompleteMembers' in sideEffects: |
| | 1018 | aDownloadWasNeeded = True |
| | 1019 | print 'Downloading referrers for ', str(relation.get('name')), ' ', str(relation.get('note')) |
| | 1020 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(relation, relation.getIncompleteMembers(), mv.editLayer )) |
| | 1021 | continue |
| | 1022 | else: |
| | 1023 | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the relations first') |
| | 1024 | exit() |
| | 1025 | networklevel = relation.get('network') |
| | 1026 | relationType = relation.get('type') |
| | 1027 | |
| | 1028 | if networklevel in ('rcn','rwn','rhn'): |
| | 1029 | if relationType == 'route': |
| | 1030 | checkRxNroute(relation, networklevel, aDownloadWasNeeded) |
| | 1031 | elif relationType == 'network': |
| | 1032 | checkNetwork(relation, networklevel, aDownloadWasNeeded) |
| | 1033 | elif relationType == 'collection': |
| | 1034 | for collectionMember in relation.getMembers(): |
| | 1035 | if collectionMember.isRelation(): |
| | 1036 | networkRelation = collectionMember.getRelation() |
| | 1037 | if networkRelation.hasIncompleteMembers(): |
| | 1038 | name = networkRelation.get('name') |
| | 1039 | if not(name): name = '' |
| | 1040 | networkname = networkRelation.get('network') |
| | 1041 | if not(networkname): networkname = '' |
| | 1042 | if 'downloadIncompleteMembers' in sideEffects: |
| | 1043 | aDownloadWasNeeded = True |
| | 1044 | print 'Downloading referrers for ', name |
| | 1045 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(networkRelation, networkRelation.getIncompleteMembers(), mv.editLayer )) |
| | 1046 | continue |
| | 1047 | else: |
| | 1048 | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the network relations first:' + networkname + ' ' + name) |
| | 1049 | break |
| | 1050 | checkNetwork(networkRelation, networklevel, aDownloadWasNeeded) |
| | 1051 | elif relationType == 'associatedStreet': |
| | 1052 | checkAssociatedStreet(relation) |
| | 1053 | elif relationType == "route_master": |
| | 1054 | pass |
| | 1055 | elif relationType == "route" and relation.get('route') in ['bus','tram']: |
| | 1056 | checkPTroute(relation, aDownloadWasNeeded) |
| | 1057 | |
| | 1058 | if aDownloadWasNeeded: |
| | 1059 | 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') |