Example #1
0
def main(options):

    gtfsZip = zipfile.ZipFile(sumolib.open(options.gtfs, False))
    routes, trips_on_day, shapes, stops, stop_times = gtfs2osm.import_gtfs(
        options, gtfsZip)

    stop_times['arrival_time'] = stop_times['arrival_time'].map(time2sec)
    stop_times['departure_time'] = stop_times['departure_time'].map(time2sec)

    if 'fare_stops.txt' in gtfsZip.namelist():
        zones = pd.read_csv(gtfsZip.open('fare_stops.txt'), dtype=str)
        stops_merged = pd.merge(pd.merge(stops, stop_times, on='stop_id'),
                                zones,
                                on='stop_id')
    else:
        stops_merged = pd.merge(stops, stop_times, on='stop_id')
        stops_merged['fare_zone'] = ''
        stops_merged['fare_token'] = ''
        stops_merged['start_char'] = ''

    trips_routes_merged = pd.merge(trips_on_day, routes, on='route_id')
    full_data_merged = pd.merge(stops_merged,
                                trips_routes_merged,
                                on='trip_id')[[
                                    'trip_id', 'route_id', 'route_short_name',
                                    'route_type', 'stop_id', 'stop_name',
                                    'stop_lat', 'stop_lon', 'stop_sequence',
                                    'fare_zone', 'fare_token', 'start_char',
                                    'arrival_time', 'departure_time'
                                ]].drop_duplicates()

    fcdFile = {}
    tripFile = {}
    if not os.path.exists(options.fcd):
        os.makedirs(options.fcd)
    seenModes = set()
    modes = set(
        options.modes.split(",") if options.modes else gtfs2osm.GTFS2OSM_MODES.
        values())
    for mode in modes:
        filePrefix = os.path.join(options.fcd, mode)
        fcdFile[mode] = io.open(filePrefix + '.fcd.xml', 'w', encoding="utf8")
        sumolib.writeXMLHeader(fcdFile[mode], "gtfs2fcd.py")
        fcdFile[mode].write(u'<fcd-export>\n')
        if options.verbose:
            print('Writing fcd file "%s"' % fcdFile[mode].name)
        tripFile[mode] = io.open(filePrefix + '.rou.xml', 'w')
        tripFile[mode].write(u"<routes>\n")
    timeIndex = 0
    for _, trip_data in full_data_merged.groupby(['route_id']):
        seqs = {}
        for trip_id, data in trip_data.groupby(['trip_id']):
            stopSeq = []
            buf = u""
            offset = 0
            firstDep = None
            for __, d in data.sort_values(by=['stop_sequence']).iterrows():
                arrivalSec = d.arrival_time + timeIndex
                stopSeq.append(d.stop_id)
                departureSec = d.departure_time + timeIndex
                until = 0 if firstDep is None else departureSec - timeIndex - firstDep
                buf += ((
                    u'    <timestep time="%s"><vehicle id="%s" x="%s" y="%s" until="%s" '
                    +
                    u'name=%s fareZone="%s" fareSymbol="%s" startFare="%s" speed="20"/></timestep>\n'
                ) % (arrivalSec - offset, trip_id, d.stop_lon, d.stop_lat,
                     until, sumolib.xml.quoteattr(d.stop_name), d.fare_zone,
                     d.fare_token, d.start_char))
                if firstDep is None:
                    firstDep = departureSec - timeIndex
                offset += departureSec - arrivalSec
            mode = gtfs2osm.GTFS2OSM_MODES[d.route_type]
            if mode in modes:
                s = tuple(stopSeq)
                if s not in seqs:
                    seqs[s] = trip_id
                    fcdFile[mode].write(buf)
                    timeIndex = arrivalSec
                tripFile[mode].write(
                    u'    <vehicle id="%s" route="%s" type="%s" depart="%s" line="%s_%s"/>\n'
                    % (trip_id, seqs[s], mode, firstDep, d.route_short_name,
                       seqs[s]))
                seenModes.add(mode)
    if options.gpsdat:
        if not os.path.exists(options.gpsdat):
            os.makedirs(options.gpsdat)
        for mode in modes:
            fcdFile[mode].write(u'</fcd-export>\n')
            fcdFile[mode].close()
            tripFile[mode].write(u"</routes>\n")
            tripFile[mode].close()
            if mode in seenModes:
                traceExporter.main([
                    '', '--base-date', '0', '-i', fcdFile[mode].name,
                    '--gpsdat-output',
                    os.path.join(options.gpsdat, "gpsdat_%s.csv" % mode)
                ])
            else:
                os.remove(fcdFile[mode].name)
                os.remove(tripFile[mode].name)
    if options.vtype_output:
        with io.open(options.vtype_output, 'w', encoding="utf8") as vout:
            sumolib.xml.writeHeader(vout, root="additional")
            for mode in sorted(seenModes):
                vout.write(u'    <vType id="%s" vClass="%s"/>\n' %
                           (mode, gtfs2osm.OSM2SUMO_MODES[mode]))
            vout.write(u'</additional>\n')
Example #2
0
def main(options):
    if options.verbose:
        print('Loading GTFS data "%s"' % options.gtfs)
    gtfsZip = zipfile.ZipFile(sumolib.open(options.gtfs, False))
    routes = pd.read_csv(gtfsZip.open('routes.txt'), dtype=str)
    stops = pd.read_csv(gtfsZip.open('stops.txt'), dtype=str)
    stop_times = pd.read_csv(gtfsZip.open('stop_times.txt'),
                             converters={'trip_id': str, 'arrival_time': time2sec, 'departure_time': time2sec,
                                         'stop_id': str, 'stop_sequence': int})
    trips = pd.read_csv(gtfsZip.open('trips.txt'), dtype=str)
    calendar = pd.read_csv(gtfsZip.open('calendar.txt'), dtype=str)
    calendar_dates = pd.read_csv(gtfsZip.open('calendar_dates.txt'), dtype=str)

    # currently not used:
    # agency = pd.read_csv(gtfsZip.open('agency.txt'), dtype=str)
    # transfers = pd.read_csv(gtfsZip.open('transfers.txt'), dtype=str)

    # Merging the tables
    weekday = 'monday tuesday wednesday thursday friday saturday sunday'.split(
    )[datetime.datetime.strptime(options.date, "%Y%m%d").weekday()]
    removed = calendar_dates[(calendar_dates.date == options.date) & (calendar_dates.exception_type == '2')]
    services = calendar[(calendar.start_date <= options.date) & (calendar.end_date >= options.date) &
                        (calendar[weekday] == '1') & (~calendar.service_id.isin(removed.service_id))]
    added = calendar_dates[(calendar_dates.date == options.date) & (calendar_dates.exception_type == '1')]
    trips_on_day = trips[trips.service_id.isin(services.service_id) | trips.service_id.isin(added.service_id)]
    if 'fare_stops.txt' in gtfsZip.namelist():
        zones = pd.read_csv(gtfsZip.open('fare_stops.txt'), dtype=str)
        stops_merged = pd.merge(pd.merge(stops, stop_times, on='stop_id'), zones, on='stop_id')
    else:
        stops_merged = pd.merge(stops, stop_times, on='stop_id')
        stops_merged['fare_zone'] = ''
        stops_merged['fare_token'] = ''
        stops_merged['start_char'] = ''

    trips_routes_merged = pd.merge(trips_on_day, routes, on='route_id')
    full_data_merged = pd.merge(stops_merged,
                                trips_routes_merged,
                                on='trip_id')[['trip_id', 'route_id', 'route_short_name', 'route_type',
                                               'stop_id', 'stop_name', 'stop_lat', 'stop_lon', 'stop_sequence',
                                               'fare_zone', 'fare_token', 'start_char',
                                               'arrival_time', 'departure_time']].drop_duplicates()

    gtfs_modes = {
        # modes according to https://developers.google.com/transit/gtfs/reference/#routestxt
        '0':  'tram',
        '1':  'subway',
        '2':  'rail',
        '3':  'bus',
        '4':  'ship',
        # '5':  'cableTram',
        # '6':  'aerialLift',
        # '7':  'funicular',
        # modes used in Berlin and MDV see https://developers.google.com/transit/gtfs/reference/extended-route-types
        '100':  'rail',        # DB
        '109':  'light_rail',  # S-Bahn
        '400':  'subway',      # U-Bahn
        '1000': 'ship',        # Faehre
        # additional modes used in Hamburg
        '402':  'subway',      # U-Bahn
        '1200': 'ship',        # Faehre
        # modes used by hafas
        's': 'light_rail',
        'RE': 'rail',
        'RB': 'rail',
        'IXB': 'rail',        # tbd
        'ICE': 'rail_electric',
        'IC': 'rail_electric',
        'IRX': 'rail',        # tbd
        'EC': 'rail',
        'NJ': 'rail',        # tbd
        'RHI': 'rail',        # tbd
        'DPN': 'rail',        # tbd
        'SCH': 'rail',        # tbd
        'Bsv': 'rail',        # tbd
        'KAT': 'rail',        # tbd
        'AIR': 'rail',        # tbd
        'DPS': 'rail',        # tbd
        'lt': 'light_rail',  # tbd
        'BUS': 'bus',        # tbd
        'Str': 'tram',        # tbd
        'DPF': 'rail',        # tbd
    }
    # bus and tram modes from https://developers.google.com/transit/gtfs/reference/extended-route-types
    for i in range(700, 717):
        gtfs_modes[str(i)] = 'bus'
    for i in range(900, 907):
        gtfs_modes[str(i)] = 'tram'
    fcdFile = {}
    tripFile = {}
    if not os.path.exists(options.fcd):
        os.makedirs(options.fcd)
    seenModes = set()
    modes = set(options.modes.split(",") if options.modes else gtfs_modes.values())
    for mode in modes:
        filePrefix = os.path.join(options.fcd, mode)
        fcdFile[mode] = io.open(filePrefix + '.fcd.xml', 'w', encoding="utf8")
        sumolib.writeXMLHeader(fcdFile[mode], "gtfs2fcd.py")
        fcdFile[mode].write(u'<fcd-export>\n')
        if options.verbose:
            print('Writing fcd file "%s"' % fcdFile[mode].name)
        tripFile[mode] = io.open(filePrefix + '.rou.xml', 'w')
        tripFile[mode].write(u"<routes>\n")
    timeIndex = 0
    for _, trip_data in full_data_merged.groupby(['route_id']):
        seqs = {}
        for trip_id, data in trip_data.groupby(['trip_id']):
            stopSeq = []
            buf = u""
            offset = 0
            firstDep = None
            for __, d in data.sort_values(by=['stop_sequence']).iterrows():
                arrivalSec = d.arrival_time + timeIndex
                stopSeq.append(d.stop_id)
                departureSec = d.departure_time + timeIndex
                until = 0 if firstDep is None else departureSec - timeIndex - firstDep
                buf += ((u'    <timestep time="%s"><vehicle id="%s" x="%s" y="%s" until="%s" ' +
                         u'name=%s fareZone="%s" fareSymbol="%s" startFare="%s" speed="20"/></timestep>\n') %
                        (arrivalSec - offset, trip_id, d.stop_lon, d.stop_lat, until,
                         sumolib.xml.quoteattr(d.stop_name), d.fare_zone, d.fare_token, d.start_char))
                if firstDep is None:
                    firstDep = departureSec - timeIndex
                offset += departureSec - arrivalSec
            mode = gtfs_modes[d.route_type]
            if mode in modes:
                s = tuple(stopSeq)
                if s not in seqs:
                    seqs[s] = trip_id
                    fcdFile[mode].write(buf)
                    timeIndex = arrivalSec
                tripFile[mode].write(u'    <vehicle id="%s" route="%s" type="%s" depart="%s" line="%s_%s"/>\n' %
                                     (trip_id, seqs[s], mode, firstDep, d.route_short_name, seqs[s]))
                seenModes.add(mode)
    if options.gpsdat:
        if not os.path.exists(options.gpsdat):
            os.makedirs(options.gpsdat)
        for mode in modes:
            fcdFile[mode].write(u'</fcd-export>\n')
            fcdFile[mode].close()
            tripFile[mode].write(u"</routes>\n")
            tripFile[mode].close()
            if mode in seenModes:
                traceExporter.main(['', '--base-date', '0', '-i', fcdFile[mode].name,
                                    '--gpsdat-output', os.path.join(options.gpsdat, "gpsdat_%s.csv" % mode)])
            else:
                os.remove(fcdFile[mode].name)
                os.remove(tripFile[mode].name)
    if options.vtype_output:
        with io.open(options.vtype_output, 'w', encoding="utf8") as vout:
            sumolib.xml.writeHeader(vout, root="additional")
            for mode in sorted(seenModes):
                vout.write(u'    <vType id="%s" vClass="%s"/>\n' %
                           (mode, "rail_urban" if mode in ("light_rail", "subway") else mode))
            vout.write(u'</additional>\n')
Example #3
0
def main(options):
    if options.verbose:
        print('Loading GTFS data "%s"' % options.gtfs)
    gtfsZip = zipfile.ZipFile(options.gtfs)
    routes = pd.read_csv(gtfsZip.open('routes.txt'), dtype=str)
    stops = pd.read_csv(gtfsZip.open('stops.txt'), dtype=str)
    stop_times = pd.read_csv(gtfsZip.open('stop_times.txt'), dtype=str)
    trips = pd.read_csv(gtfsZip.open('trips.txt'), dtype=str)
    calendar_dates = pd.read_csv(gtfsZip.open('calendar_dates.txt'), dtype=str)

    # currently not used:
    # agency = pd.read_csv(gtfsZip.open('agency.txt'), dtype=str)
    # calendar = pd.read_csv(gtfsZip.open('calendar.txt'), dtype=str)
    # transfers = pd.read_csv(gtfsZip.open('transfers.txt'), dtype=str)

    # Merging the tables
    tmp = pd.merge(trips, calendar_dates, on='service_id')
    trips_on_day = tmp[tmp['date'] == options.date]
    if options.region == "moin":
        zones = pd.read_csv(gtfsZip.open('fare_stops.txt'), dtype=str)
        stops_merged = pd.merge(pd.merge(stops, stop_times, on='stop_id'),
                                zones,
                                on='stop_id')
    else:
        stops_merged = pd.merge(stops, stop_times, on='stop_id')
        stops_merged['fare_zone'] = ''
        stops_merged['fare_token'] = ''
        stops_merged['start_char'] = ''

    trips_routes_merged = pd.merge(trips_on_day, routes, on='route_id')
    full_data_merged = pd.merge(stops_merged,
                                trips_routes_merged,
                                on='trip_id')[[
                                    'trip_id', 'route_id', 'route_short_name',
                                    'route_type', 'stop_id', 'stop_name',
                                    'stop_lat', 'stop_lon', 'stop_sequence',
                                    'fare_zone', 'fare_token', 'start_char',
                                    'arrival_time', 'departure_time'
                                ]].drop_duplicates()

    gtfs_modes = {
        # modes according to https://developers.google.com/transit/gtfs/reference/#routestxt
        '0': 'tram',
        '1': 'subway',
        '2': 'rail',
        '3': 'bus',
        '4': 'ship',
        # '5':  'cableTram',
        # '6':  'aerialLift',
        # '7':  'funicular',
        # modes used in Berlin and MDV see https://developers.google.com/transit/gtfs/reference/extended-route-types
        '100': 'rail',  # DB
        '109': 'light_rail',  # S-Bahn
        '400': 'subway',  # U-Bahn
        '700': 'bus',  # Bus
        '714': 'bus',  # SEV
        '715': 'bus',  # Rufbus
        '900': 'tram',  # Tram
        '1000': 'ship',  # Faehre
        # modes used by hafas
        's': 'light_rail',
        'RE': 'rail',
        'RB': 'rail',
        'IXB': 'rail',  # tbd
        'ICE': 'rail_electric',
        'IC': 'rail_electric',
        'IRX': 'rail',  # tbd
        'EC': 'rail',
        'NJ': 'rail',  # tbd
        'RHI': 'rail',  # tbd
        'DPN': 'rail',  # tbd
        'SCH': 'rail',  # tbd
        'Bsv': 'rail',  # tbd
        'KAT': 'rail',  # tbd
        'AIR': 'rail',  # tbd
        'DPS': 'rail',  # tbd
        'lt': 'light_rail',  # tbd
        'BUS': 'bus',  # tbd
        'Str': 'tram',  # tbd
        'DPF': 'rail',  # tbd
        '3': 'bus',  # tbd
    }
    fcdFile = {}
    tripFile = {}
    if not os.path.exists(options.fcd):
        os.makedirs(options.fcd)
    seenModes = set()
    for mode in set(gtfs_modes.values()):
        filePrefix = os.path.join(options.fcd, mode)
        fcdFile[mode] = open(filePrefix + '.fcd.xml', 'w', encoding="utf8")
        sumolib.writeXMLHeader(fcdFile[mode], "gtfs2fcd.py")
        fcdFile[mode].write('<fcd-export>\n')
        if options.verbose:
            print('Writing fcd file "%s"' % fcdFile[mode].name)
        tripFile[mode] = open(filePrefix + '.rou.xml', 'w')
        tripFile[mode].write("<routes>\n")
    timeIndex = 0
    for _, trip_data in full_data_merged.groupby(['route_id']):
        seqs = {}
        for trip_id, data in trip_data.groupby(['trip_id']):
            stopSeq = []
            buf = ""
            offset = 0
            firstDep = None
            for __, d in data.sort_values(by=['stop_sequence']).iterrows():
                arrival = list(map(int, d.arrival_time.split(":")))
                arrivalSec = arrival[0] * 3600 + arrival[1] * 60 + arrival[
                    2] + timeIndex
                stopSeq.append(d.stop_id)
                departure = list(map(int, d.departure_time.split(":")))
                departureSec = departure[0] * 3600 + departure[
                    1] * 60 + departure[2] + timeIndex
                until = 0 if firstDep is None else departureSec - timeIndex - firstDep
                buf += ((
                    '    <timestep time="%s"><vehicle id="%s_%s" x="%s" y="%s" until="%s" '
                    +
                    'name=%s fareZone="%s" fareSymbol="%s" startFare="%s" speed="20"/></timestep>\n'
                ) % (arrivalSec - offset, d.route_short_name, trip_id,
                     d.stop_lon, d.stop_lat, until,
                     sumolib.xml.quoteattr(d.stop_name), d.fare_zone,
                     d.fare_token, d.start_char))
                if firstDep is None:
                    firstDep = departureSec - timeIndex
                offset += departureSec - arrivalSec
            mode = gtfs_modes[d.route_type]
            s = tuple(stopSeq)
            if s not in seqs:
                seqs[s] = trip_id
                fcdFile[mode].write(buf)
                timeIndex = arrivalSec
            tripFile[mode].write(
                '    <vehicle id="%s" route="%s" type="%s" depart="%s" line="%s_%s"/>\n'
                % (trip_id, seqs[s], mode, firstDep, d.route_short_name,
                   seqs[s]))
            seenModes.add(mode)
    if options.gpsdat:
        if not os.path.exists(options.gpsdat):
            os.makedirs(options.gpsdat)
        for mode in set(gtfs_modes.values()):
            fcdFile[mode].write('</fcd-export>\n')
            fcdFile[mode].close()
            tripFile[mode].write("</routes>\n")
            tripFile[mode].close()
            if mode in seenModes:
                f = "gpsdat_%s.csv" % mode
                traceExporter.main([
                    '', '--base-date', '0', '-i', fcdFile[mode].name,
                    '--gpsdat-output', f
                ])
                with open(f) as inp, open(os.path.join(options.gpsdat, f),
                                          "w") as outp:
                    for l in inp:
                        outp.write(l[l.index("_") + 1:])
                os.remove(f)
            else:
                os.remove(fcdFile[mode].name)
                os.remove(tripFile[mode].name)
    if options.vtype_output:
        with open(options.vtype_output, 'w', encoding="utf8") as vout:
            sumolib.xml.writeHeader(vout, os.path.basename(__file__),
                                    "additional")
            for mode in sorted(seenModes):
                vout.write(
                    '    <vType id="%s" vClass="%s"/>\n' %
                    (mode, "rail_urban" if mode in ("light_rail",
                                                    "subway") else mode))
            vout.write('</additional>\n')