/usr/share/sumo/tools/route/findUTurns.py is in sumo-tools 0.15.0~dfsg-2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #!/usr/bin/env python
"""
@file findUTurns.py
@author Michael Behrisch
@author Daniel Krajzewicz
@date 2008-04-16
@version $Id: findUTurns.py 11671 2012-01-07 20:14:30Z behrisch $
Determines the number of U turns in a route file by comparing
the edge ids of successive edges for "negation". This works with
most Elmar (Navteq) imported nets. Optional it can also remove
U turns at the start and the end of a route and output the
modified routes.
SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
Copyright (C) 2008-2012 DLR (http://www.dlr.de/) and contributors
All rights reserved
"""
import os, sys
from xml.sax import make_parser, handler
from optparse import OptionParser
class RouteReader(handler.ContentHandler):
def __init__(self):
self._vehAttrs = None
self._routeString = ''
self._routeCount = 0
self._uTurnCount = 0
self._uTurnFirst = 0
self._uTurnLast = 0
self._short = 0
def startElement(self, name, attrs):
if name == 'vehicle':
self._vehAttrs = attrs
elif name == 'route':
self._routeString = ''
if attrs.has_key("edges"):
self._routeString = attrs['edges']
elif name == 'routes':
if options.repair:
print '<routes>'
print >> sys.stderr, " Route UTurn UTurnFirst UTurnLast Short"
else:
if options.repair:
print '<' + name,
for key in attrs.keys():
print '%s="%s"' % (key, attrs[key]),
print '/>'
def characters(self, content):
self._routeString += content
def endElement(self, name):
if name == 'route':
self._routeCount += 1
lastEdge = ' '
route = self._routeString.split()
routeStart = 0
routeEnd = len(route)
if len(route) == 2:
self._short += 1
for index, edge in enumerate(route):
if (lastEdge[0] == '-' and edge == lastEdge[1:]) or\
(edge[0] == '-' and lastEdge == edge[1:]):
self._uTurnCount += 1
if index == 1:
self._uTurnFirst += 1
routeStart = 1
if index == len(route) - 1:
self._uTurnLast += 1
routeEnd -= 1
lastEdge = edge
if self._routeCount % 10000 == 0:
print >> sys.stderr, "%8i %6i %10i %9i %6i"\
% (self._routeCount, self._uTurnCount,
self._uTurnFirst, self._uTurnLast,
self._short), "\r",
if routeEnd - routeStart > 1:
if options.repair:
print '<vehicle',
for key in self._vehAttrs.keys():
print '%s="%s"' % (key, self._vehAttrs[key]),
print '>'
print ' <route edges="%s"/>' % ' '.join(route[routeStart:routeEnd])
print '</vehicle>'
elif name == 'routes':
if options.repair:
print '</routes>'
print >> sys.stderr, "%8i %6i %10i %9i %6i"\
% (self._routeCount, self._uTurnCount,
self._uTurnFirst, self._uTurnLast,
self._short)
optParser = OptionParser(usage="usage: %prog [options] <routefile>+")
optParser.add_option("-r", "--repair", action="store_true", dest="repair",
default=False, help="remove U turns at start and end of the route")
(options, args) = optParser.parse_args()
if len(args) == 0:
optParser.error("Please give at least one route file!")
parser = make_parser()
for f in args:
parser.setContentHandler(RouteReader())
parser.parse(f)
|