"""
Generate pedestrian edges for every public transport stop to serve as access
edge in otherwise pure railway networks
"""
from __future__ import absolute_import
from __future__ import print_function
import sys
import os
if 'SUMO_HOME' in os.environ:
sys.path.append(os.path.join(os.environ['SUMO_HOME'], 'tools'))
import sumolib
from sumolib.options import ArgumentParser
def parse_args():
USAGE = "%(prog)s -n <netfile> -s <stopfile> -o <utput> [options]"
ap = ArgumentParser(usage=USAGE)
ap.add_option("-n", "--net-file", category="input", dest="netfile", required=True, type=ap.net_file,
help="input network file")
ap.add_option("-s", "--stop-file", category="input", dest="stopfile", required=True, type=ap.additional_file,
help="input network file")
ap.add_option("-o", "--output-prefix", category="output", dest="outfile", required=True, type=ap.file,
help="prefix of output files")
ap.add_option("-l", "--length", type=float, default=10.,
help="length of generated solitary edges")
ap.add_option("-w", "--width", type=float, default=8.,
help="width of generated solitary edges")
options = ap.parse_args()
return options
def main(options):
net = sumolib.net.readNet(options.netfile, withConnections=False, withFoes=False)
l2 = options.length / 2
with open(options.outfile + ".edg.xml", 'w') as out_e:
with open(options.outfile + ".nod.xml", 'w') as out_n:
sumolib.writeXMLHeader(out_e, "$Id$")
sumolib.writeXMLHeader(out_n, "$Id$")
out_e.write('<edges>\n')
out_n.write('<nodes>\n')
for stop in sumolib.xml.parse(options.stopfile, ['busStop', 'trainStop'], heterogeneous=True):
edge_id = stop.id + "_access"
x, y = sumolib.geomhelper.positionAtShapeOffset(
net.getLane(stop.lane).getShape(),
(float(stop.startPos) + float(stop.endPos)) / 2)
from_id = edge_id + '_from'
to_id = edge_id + '_to'
out_n.write(' <node id="%s" x="%s" y="%s"/>\n' % (from_id, x - l2, y))
out_n.write(' <node id="%s" x="%s" y="%s"/>\n' % (to_id, x + l2, y))
out_e.write(' <edge id="%s" from="%s" to="%s" allow="pedestrian" width="%s"/>\n' % (
edge_id, from_id, to_id, options.width))
out_e.write('</edges>\n')
out_n.write('</nodes>\n')
if __name__ == "__main__":
options = parse_args()
main(options)