Search in sources :

Example 31 with TripTimes

use of org.opentripplanner.routing.trippattern.TripTimes in project OpenTripPlanner by opentripplanner.

the class TimetableSnapshotSource method addTripToGraphAndBuffer.

/**
 * Add a (new) trip to the graph and the buffer
 *
 * @param graph graph
 * @param trip trip
 * @param tripUpdate trip update containing stop time updates
 * @param stops list of stops corresponding to stop time updates
 * @param serviceDate service date of trip
 * @param realTimeState real-time state of new trip
 * @return true iff successful
 */
private boolean addTripToGraphAndBuffer(final String feedId, final Graph graph, final Trip trip, final TripUpdate tripUpdate, final List<Stop> stops, final ServiceDate serviceDate, final RealTimeState realTimeState) {
    // Preconditions
    Preconditions.checkNotNull(stops);
    Preconditions.checkArgument(tripUpdate.getStopTimeUpdateCount() == stops.size(), "number of stop should match the number of stop time updates");
    // Calculate seconds since epoch on GTFS midnight (noon minus 12h) of service date
    final Calendar serviceCalendar = serviceDate.getAsCalendar(timeZone);
    final long midnightSecondsSinceEpoch = serviceCalendar.getTimeInMillis() / MILLIS_PER_SECOND;
    // Create StopTimes
    final List<StopTime> stopTimes = new ArrayList<>(tripUpdate.getStopTimeUpdateCount());
    for (int index = 0; index < tripUpdate.getStopTimeUpdateCount(); ++index) {
        final StopTimeUpdate stopTimeUpdate = tripUpdate.getStopTimeUpdate(index);
        final Stop stop = stops.get(index);
        // Determine whether stop is skipped
        final boolean skippedStop = isStopSkipped(stopTimeUpdate);
        // Only create stop time for non-skipped stops
        if (!skippedStop) {
            // Create stop time
            final StopTime stopTime = new StopTime();
            stopTime.setTrip(trip);
            stopTime.setStop(stop);
            // Set arrival time
            if (stopTimeUpdate.hasArrival() && stopTimeUpdate.getArrival().hasTime()) {
                final long arrivalTime = stopTimeUpdate.getArrival().getTime() - midnightSecondsSinceEpoch;
                if (arrivalTime < 0 || arrivalTime > MAX_ARRIVAL_DEPARTURE_TIME) {
                    LOG.warn("ADDED trip has invalid arrival time (compared to start date in " + "TripDescriptor), skipping.");
                    return false;
                }
                stopTime.setArrivalTime((int) arrivalTime);
            }
            // Set departure time
            if (stopTimeUpdate.hasDeparture() && stopTimeUpdate.getDeparture().hasTime()) {
                final long departureTime = stopTimeUpdate.getDeparture().getTime() - midnightSecondsSinceEpoch;
                if (departureTime < 0 || departureTime > MAX_ARRIVAL_DEPARTURE_TIME) {
                    LOG.warn("ADDED trip has invalid departure time (compared to start date in " + "TripDescriptor), skipping.");
                    return false;
                }
                stopTime.setDepartureTime((int) departureTime);
            }
            // Exact time
            stopTime.setTimepoint(1);
            if (stopTimeUpdate.hasStopSequence()) {
                stopTime.setStopSequence(stopTimeUpdate.getStopSequence());
            }
            // Set different pickup type for last stop
            if (index == tripUpdate.getStopTimeUpdateCount() - 1) {
                // No pickup available
                stopTime.setPickupType(1);
            } else {
                // Regularly scheduled pickup
                stopTime.setPickupType(0);
            }
            // Set different drop off type for first stop
            if (index == 0) {
                // No drop off available
                stopTime.setDropOffType(1);
            } else {
                // Regularly scheduled drop off
                stopTime.setDropOffType(0);
            }
            // Add stop time to list
            stopTimes.add(stopTime);
        }
    }
    // TODO: filter/interpolate stop times like in GTFSPatternHopFactory?
    // Create StopPattern
    final StopPattern stopPattern = new StopPattern(stopTimes);
    // Get cached trip pattern or create one if it doesn't exist yet
    final TripPattern pattern = tripPatternCache.getOrCreateTripPattern(stopPattern, trip.getRoute(), graph);
    // Add service code to bitset of pattern if needed (using copy on write)
    final int serviceCode = graph.serviceCodes.get(trip.getServiceId());
    if (!pattern.getServices().get(serviceCode)) {
        final BitSet services = (BitSet) pattern.getServices().clone();
        services.set(serviceCode);
        pattern.setServices(services);
    }
    // Create new trip times
    final TripTimes newTripTimes = new TripTimes(trip, stopTimes, graph.deduplicator);
    // TODO: should we incorporate the delay field if present?
    for (int stopIndex = 0; stopIndex < newTripTimes.getNumStops(); stopIndex++) {
        newTripTimes.updateArrivalTime(stopIndex, newTripTimes.getScheduledArrivalTime(stopIndex));
        newTripTimes.updateDepartureTime(stopIndex, newTripTimes.getScheduledDepartureTime(stopIndex));
    }
    // Set service code of new trip times
    newTripTimes.serviceCode = serviceCode;
    // Make sure that updated trip times have the correct real time state
    newTripTimes.setRealTimeState(realTimeState);
    // Add new trip times to the buffer
    final boolean success = buffer.update(feedId, pattern, newTripTimes, serviceDate);
    return success;
}
Also used : StopPattern(org.opentripplanner.model.StopPattern) Stop(org.onebusaway.gtfs.model.Stop) Calendar(java.util.Calendar) ArrayList(java.util.ArrayList) BitSet(java.util.BitSet) TripPattern(org.opentripplanner.routing.edgetype.TripPattern) StopTimeUpdate(com.google.transit.realtime.GtfsRealtime.TripUpdate.StopTimeUpdate) TripTimes(org.opentripplanner.routing.trippattern.TripTimes) StopTime(org.onebusaway.gtfs.model.StopTime)

Example 32 with TripTimes

use of org.opentripplanner.routing.trippattern.TripTimes in project OpenTripPlanner by opentripplanner.

the class TimetableSnapshotSource method cancelScheduledTrip.

/**
 * Cancel scheduled trip in buffer given trip id (without agency id) on service date
 *
 * @param tripId trip id without agency id
 * @param serviceDate service date
 * @return true if scheduled trip was cancelled
 */
private boolean cancelScheduledTrip(String feedId, String tripId, final ServiceDate serviceDate) {
    boolean success = false;
    final TripPattern pattern = getPatternForTripId(feedId, tripId);
    if (pattern != null) {
        // Cancel scheduled trip times for this trip in this pattern
        final Timetable timetable = pattern.scheduledTimetable;
        final int tripIndex = timetable.getTripIndex(tripId);
        if (tripIndex == -1) {
            LOG.warn("Could not cancel scheduled trip {}", tripId);
        } else {
            final TripTimes newTripTimes = new TripTimes(timetable.getTripTimes(tripIndex));
            newTripTimes.cancel();
            buffer.update(feedId, pattern, newTripTimes, serviceDate);
            success = true;
        }
    }
    return success;
}
Also used : Timetable(org.opentripplanner.routing.edgetype.Timetable) TripTimes(org.opentripplanner.routing.trippattern.TripTimes) TripPattern(org.opentripplanner.routing.edgetype.TripPattern)

Example 33 with TripTimes

use of org.opentripplanner.routing.trippattern.TripTimes in project OpenTripPlanner by opentripplanner.

the class TimetableSnapshotSource method handleScheduledTrip.

private boolean handleScheduledTrip(final TripUpdate tripUpdate, final String feedId, final ServiceDate serviceDate) {
    final TripDescriptor tripDescriptor = tripUpdate.getTrip();
    // This does not include Agency ID or feed ID, trips are feed-unique and we currently assume a single static feed.
    final String tripId = tripDescriptor.getTripId();
    final TripPattern pattern = getPatternForTripId(feedId, tripId);
    if (pattern == null) {
        LOG.warn("No pattern found for tripId {}, skipping TripUpdate.", tripId);
        return false;
    }
    if (tripUpdate.getStopTimeUpdateCount() < 1) {
        LOG.warn("TripUpdate contains no updates, skipping.");
        return false;
    }
    // Apply update on the *scheduled* time table and set the updated trip times in the buffer
    final TripTimes updatedTripTimes = pattern.scheduledTimetable.createUpdatedTripTimes(tripUpdate, timeZone, serviceDate);
    if (updatedTripTimes == null) {
        return false;
    }
    // Make sure that updated trip times have the correct real time state
    updatedTripTimes.setRealTimeState(RealTimeState.UPDATED);
    final boolean success = buffer.update(feedId, pattern, updatedTripTimes, serviceDate);
    return success;
}
Also used : TripDescriptor(com.google.transit.realtime.GtfsRealtime.TripDescriptor) TripTimes(org.opentripplanner.routing.trippattern.TripTimes) TripPattern(org.opentripplanner.routing.edgetype.TripPattern)

Example 34 with TripTimes

use of org.opentripplanner.routing.trippattern.TripTimes in project OpenTripPlanner by opentripplanner.

the class TimetableSnapshotSource method cancelPreviouslyAddedTrip.

/**
 * Cancel previously added trip from buffer if there is a previously added trip with given trip
 * id (without agency id) on service date
 *
 * @param feedId feed id the trip id belongs to
 * @param tripId trip id without agency id
 * @param serviceDate service date
 * @return true if a previously added trip was cancelled
 */
private boolean cancelPreviouslyAddedTrip(final String feedId, final String tripId, final ServiceDate serviceDate) {
    boolean success = false;
    final TripPattern pattern = buffer.getLastAddedTripPattern(feedId, tripId, serviceDate);
    if (pattern != null) {
        // Cancel trip times for this trip in this pattern
        final Timetable timetable = buffer.resolve(pattern, serviceDate);
        final int tripIndex = timetable.getTripIndex(tripId);
        if (tripIndex == -1) {
            LOG.warn("Could not cancel previously added trip {}", tripId);
        } else {
            final TripTimes newTripTimes = new TripTimes(timetable.getTripTimes(tripIndex));
            newTripTimes.cancel();
            buffer.update(feedId, pattern, newTripTimes, serviceDate);
            success = true;
        }
    }
    return success;
}
Also used : Timetable(org.opentripplanner.routing.edgetype.Timetable) TripTimes(org.opentripplanner.routing.trippattern.TripTimes) TripPattern(org.opentripplanner.routing.edgetype.TripPattern)

Example 35 with TripTimes

use of org.opentripplanner.routing.trippattern.TripTimes in project OpenTripPlanner by opentripplanner.

the class TestTransfers method applyUpdateToTripPattern.

/**
 * Apply an update to a table trip pattern and check whether the update was applied correctly
 */
private void applyUpdateToTripPattern(TripPattern pattern, String tripId, String stopId, int stopSeq, int arrive, int depart, ScheduleRelationship scheduleRelationship, int timestamp, ServiceDate serviceDate) throws ParseException {
    TimetableSnapshot snapshot = graph.timetableSnapshotSource.getTimetableSnapshot();
    Timetable timetable = snapshot.resolve(pattern, serviceDate);
    TimeZone timeZone = new SimpleTimeZone(-7, "PST");
    long today = serviceDate.getAsDate(timeZone).getTime() / 1000;
    TripDescriptor.Builder tripDescriptorBuilder = TripDescriptor.newBuilder();
    tripDescriptorBuilder.setTripId(tripId);
    StopTimeEvent.Builder departStopTimeEventBuilder = StopTimeEvent.newBuilder();
    StopTimeEvent.Builder arriveStopTimeEventBuilder = StopTimeEvent.newBuilder();
    departStopTimeEventBuilder.setTime(today + depart);
    arriveStopTimeEventBuilder.setTime(today + arrive);
    StopTimeUpdate.Builder stopTimeUpdateBuilder = StopTimeUpdate.newBuilder();
    stopTimeUpdateBuilder.setStopSequence(stopSeq);
    stopTimeUpdateBuilder.setDeparture(departStopTimeEventBuilder);
    stopTimeUpdateBuilder.setArrival(arriveStopTimeEventBuilder);
    stopTimeUpdateBuilder.setScheduleRelationship(scheduleRelationship);
    TripUpdate.Builder tripUpdateBuilder = TripUpdate.newBuilder();
    tripUpdateBuilder.setTrip(tripDescriptorBuilder);
    tripUpdateBuilder.addStopTimeUpdate(0, stopTimeUpdateBuilder);
    TripUpdate tripUpdate = tripUpdateBuilder.build();
    TripTimes updatedTripTimes = timetable.createUpdatedTripTimes(tripUpdate, timeZone, serviceDate);
    assertNotNull(updatedTripTimes);
    int tripIndex = timetable.getTripIndex(tripId);
    assertTrue(tripIndex != -1);
    timetable.setTripTimes(tripIndex, updatedTripTimes);
}
Also used : Timetable(org.opentripplanner.routing.edgetype.Timetable) TripUpdate(com.google.transit.realtime.GtfsRealtime.TripUpdate) TimetableSnapshot(org.opentripplanner.routing.edgetype.TimetableSnapshot) TimeZone(java.util.TimeZone) SimpleTimeZone(java.util.SimpleTimeZone) StopTimeEvent(com.google.transit.realtime.GtfsRealtime.TripUpdate.StopTimeEvent) TripDescriptor(com.google.transit.realtime.GtfsRealtime.TripDescriptor) SimpleTimeZone(java.util.SimpleTimeZone) StopTimeUpdate(com.google.transit.realtime.GtfsRealtime.TripUpdate.StopTimeUpdate) TripTimes(org.opentripplanner.routing.trippattern.TripTimes)

Aggregations

TripTimes (org.opentripplanner.routing.trippattern.TripTimes)40 TripPattern (org.opentripplanner.routing.edgetype.TripPattern)19 Stop (org.onebusaway.gtfs.model.Stop)13 FrequencyEntry (org.opentripplanner.routing.trippattern.FrequencyEntry)12 TransitStop (org.opentripplanner.routing.vertextype.TransitStop)10 ArrayList (java.util.ArrayList)9 Trip (org.onebusaway.gtfs.model.Trip)9 RoutingRequest (org.opentripplanner.routing.core.RoutingRequest)9 Timetable (org.opentripplanner.routing.edgetype.Timetable)9 AgencyAndId (org.onebusaway.gtfs.model.AgencyAndId)8 StopTime (org.onebusaway.gtfs.model.StopTime)8 ServiceDay (org.opentripplanner.routing.core.ServiceDay)8 Test (org.junit.Test)7 StopPattern (org.opentripplanner.model.StopPattern)7 StopTimeUpdate (com.google.transit.realtime.GtfsRealtime.TripUpdate.StopTimeUpdate)6 PatternHop (org.opentripplanner.routing.edgetype.PatternHop)6 TimetableSnapshot (org.opentripplanner.routing.edgetype.TimetableSnapshot)6 TripDescriptor (com.google.transit.realtime.GtfsRealtime.TripDescriptor)5 Coordinate (com.vividsolutions.jts.geom.Coordinate)5 RoutingContext (org.opentripplanner.routing.core.RoutingContext)5