Search in sources :

Example 61 with BlockStopTimeEntry

use of org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry in project onebusaway-application-modules by camsys.

the class ScheduledBlockLocationServiceImpl method getScheduledBlockLocationBetweenStopTimes.

private ScheduledBlockLocation getScheduledBlockLocationBetweenStopTimes(List<BlockStopTimeEntry> stopTimes, int scheduleTime, int stopTimeIndex) {
    BlockStopTimeEntry blockBefore = stopTimes.get(stopTimeIndex - 1);
    BlockStopTimeEntry blockAfter = stopTimes.get(stopTimeIndex);
    StopTimeEntry before = blockBefore.getStopTime();
    StopTimeEntry after = blockAfter.getStopTime();
    ScheduledBlockLocation result = new ScheduledBlockLocation();
    result.setScheduledTime(scheduleTime);
    result.setInService(true);
    result.setStopTimeIndex(stopTimeIndex);
    int fromTime = before.getDepartureTime();
    int toTime = after.getArrivalTime();
    int fromTimeOffset = fromTime - scheduleTime;
    int toTimeOffset = toTime - scheduleTime;
    if (Math.abs(fromTimeOffset) < Math.abs(toTimeOffset)) {
        result.setClosestStop(blockBefore);
        result.setClosestStopTimeOffset(fromTimeOffset);
    } else {
        result.setClosestStop(blockAfter);
        result.setClosestStopTimeOffset(toTimeOffset);
    }
    result.setPreviousStop(blockBefore);
    result.setNextStop(blockAfter);
    result.setNextStopTimeOffset(toTimeOffset);
    double ratio = (scheduleTime - fromTime) / ((double) (toTime - fromTime));
    double fromDistance = blockBefore.getDistanceAlongBlock();
    double toDistance = blockAfter.getDistanceAlongBlock();
    double distanceAlongBlock = ratio * (toDistance - fromDistance) + fromDistance;
    result.setDistanceAlongBlock(distanceAlongBlock);
    int shapePointIndexFrom = -1;
    int shapePointIndexTo = -1;
    /**
     * Are we between trips? Where is the transition point?
     */
    if (!before.getTrip().equals(after.getTrip())) {
        if (distanceAlongBlock >= blockAfter.getTrip().getDistanceAlongBlock()) {
            result.setActiveTrip(blockAfter.getTrip());
            shapePointIndexFrom = 0;
            shapePointIndexTo = nextShapePointIndex(after);
        } else {
            result.setActiveTrip(blockBefore.getTrip());
            shapePointIndexFrom = before.getShapePointIndex();
            shapePointIndexTo = Integer.MAX_VALUE;
        }
    } else {
        result.setActiveTrip(blockBefore.getTrip());
        shapePointIndexFrom = before.getShapePointIndex();
        shapePointIndexTo = nextShapePointIndex(after);
    }
    BlockTripEntry activeTrip = result.getActiveTrip();
    PointAndOrientation po = getLocationAlongShape(activeTrip, distanceAlongBlock, shapePointIndexFrom, shapePointIndexTo);
    if (po != null) {
        result.setLocation(po.getPoint());
        result.setOrientation(po.getOrientation());
        return result;
    }
    StopEntry beforeStop = before.getStop();
    StopEntry afterStop = after.getStop();
    double latFrom = beforeStop.getStopLat();
    double lonFrom = beforeStop.getStopLon();
    double latTo = afterStop.getStopLat();
    double lonTo = afterStop.getStopLon();
    double lat = (latTo - latFrom) * ratio + latFrom;
    double lon = (lonTo - lonFrom) * ratio + lonFrom;
    CoordinatePoint location = new CoordinatePoint(lat, lon);
    result.setLocation(location);
    double orientation = SphericalGeometryLibrary.getOrientation(latFrom, lonFrom, latTo, lonTo);
    result.setOrientation(orientation);
    return result;
}
Also used : ScheduledBlockLocation(org.onebusaway.transit_data_federation.services.blocks.ScheduledBlockLocation) CoordinatePoint(org.onebusaway.geospatial.model.CoordinatePoint) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) StopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.StopTimeEntry) BlockTripEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry) PointAndOrientation(org.onebusaway.transit_data_federation.impl.shapes.PointAndOrientation) StopEntry(org.onebusaway.transit_data_federation.services.transit_graph.StopEntry) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) CoordinatePoint(org.onebusaway.geospatial.model.CoordinatePoint)

Example 62 with BlockStopTimeEntry

use of org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry in project onebusaway-application-modules by camsys.

the class ScheduledBlockLocationServiceImpl method getScheduledBlockLocationFromDistanceAlongBlock.

/**
 **
 * {@link ScheduledBlockLocationService} Interface
 ***
 */
@Override
public ScheduledBlockLocation getScheduledBlockLocationFromDistanceAlongBlock(BlockConfigurationEntry blockConfig, double distanceAlongBlock) {
    if (distanceAlongBlock < 0.0 || distanceAlongBlock > blockConfig.getTotalBlockDistance())
        return null;
    List<BlockStopTimeEntry> stopTimes = blockConfig.getStopTimes();
    int n = stopTimes.size();
    int stopTimeIndex = GenericBinarySearch.search(blockConfig, n, distanceAlongBlock, IndexAdapters.BLOCK_CONFIG_DISTANCE_INSTANCE);
    return getScheduledBlockLocationFromDistanceAlongBlockAndStopTimeIndex(stopTimes, distanceAlongBlock, stopTimeIndex);
}
Also used : BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) CoordinatePoint(org.onebusaway.geospatial.model.CoordinatePoint)

Example 63 with BlockStopTimeEntry

use of org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry in project onebusaway-application-modules by camsys.

the class ScheduledBlockLocationServiceImpl method getScheduledBlockLocationFromDistanceAlongBlock.

@Override
public ScheduledBlockLocation getScheduledBlockLocationFromDistanceAlongBlock(ScheduledBlockLocation previousLocation, double distanceAlongBlock) {
    if (previousLocation.getDistanceAlongBlock() > distanceAlongBlock)
        throw new IllegalStateException("previousLocation's distanceAlongBlock must be before the requested distanceAlongBlock");
    BlockTripEntry trip = previousLocation.getActiveTrip();
    BlockConfigurationEntry blockConfig = trip.getBlockConfiguration();
    List<BlockStopTimeEntry> stopTimes = blockConfig.getStopTimes();
    int indexFrom = previousLocation.getStopTimeIndex();
    int indexTo = indexFrom + 1;
    while (indexTo < stopTimes.size()) {
        double d = blockConfig.getDistanceAlongBlockForIndex(indexTo);
        if (distanceAlongBlock <= d)
            break;
        indexTo++;
    }
    int stopTimeIndex = GenericBinarySearch.searchRange(blockConfig, indexFrom, indexTo, distanceAlongBlock, IndexAdapters.BLOCK_CONFIG_DISTANCE_INSTANCE);
    return getScheduledBlockLocationFromDistanceAlongBlockAndStopTimeIndex(stopTimes, distanceAlongBlock, stopTimeIndex);
}
Also used : BlockTripEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry) BlockConfigurationEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockConfigurationEntry) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) CoordinatePoint(org.onebusaway.geospatial.model.CoordinatePoint)

Example 64 with BlockStopTimeEntry

use of org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry in project onebusaway-application-modules by camsys.

the class ScheduledBlockLocationServiceImpl method getScheduledBlockLocationFromScheduleTimeAndStopTimeIndex.

private ScheduledBlockLocation getScheduledBlockLocationFromScheduleTimeAndStopTimeIndex(List<BlockStopTimeEntry> stopTimes, int scheduleTime, int stopTimeIndex) {
    // Did we have a direct hit?
    if (0 <= stopTimeIndex && stopTimeIndex < stopTimes.size()) {
        BlockStopTimeEntry blockStopTime = stopTimes.get(stopTimeIndex);
        StopTimeEntry stopTime = blockStopTime.getStopTime();
        BlockStopTimeEntry previousBlockStopTime = null;
        if (stopTimeIndex > 0) {
            previousBlockStopTime = stopTimes.get(stopTimeIndex - 1);
        }
        /**
         * Is the vehicle currently at a layover at the stop?
         */
        if (stopTime.getArrivalTime() <= scheduleTime && scheduleTime <= stopTime.getDepartureTime()) {
            return getScheduledBlockLocationWhenAtStopTime(blockStopTime, previousBlockStopTime, stopTime, scheduleTime, stopTimeIndex);
        }
    }
    /**
     * If the stopTimeIndex is zero, and we weren't at a layover at the first
     * block stop time (see above), then we are looking for the scheduled
     * location before the scheduled start of the block
     */
    if (stopTimeIndex == 0) {
        return getScheduledBlockLocationBeforeStartOfBlock(stopTimes, scheduleTime);
    }
    /**
     * If the stopTimeIndex is beyond the last stop time, we don't attempt to
     * determine a scheduled location, since we're beyond the end of the block
     */
    if (stopTimeIndex == stopTimes.size()) {
        // Out of bounds for these stop times
        return null;
    }
    return getScheduledBlockLocationBetweenStopTimes(stopTimes, scheduleTime, stopTimeIndex);
}
Also used : BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) StopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.StopTimeEntry) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry)

Example 65 with BlockStopTimeEntry

use of org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry in project onebusaway-application-modules by camsys.

the class ScheduledBlockLocationServiceImpl method interpolateLocation.

private ScheduledBlockLocation interpolateLocation(BlockStopTimeEntry blockPrevious, BlockStopTimeEntry blockFrom, BlockStopTimeEntry blockTo, double distanceAlongBlock, int stopTimeIndex) {
    if (distanceAlongBlock < 0.0)
        return null;
    StopTimeEntry from = blockFrom.getStopTime();
    StopTimeEntry to = blockTo.getStopTime();
    double r = (distanceAlongBlock - blockFrom.getDistanceAlongBlock()) / (blockTo.getDistanceAlongBlock() - blockFrom.getDistanceAlongBlock());
    int scheduledTime = (int) (r * (to.getArrivalTime() - from.getDepartureTime()) + from.getDepartureTime());
    if (r > 1)
        scheduledTime += to.getSlackTime();
    BlockTripEntry activeTrip = distanceAlongBlock < blockTo.getDistanceAlongBlock() ? blockFrom.getTrip() : blockTo.getTrip();
    BlockStopTimeEntry closestStop = r < 0.5 ? blockFrom : blockTo;
    BlockStopTimeEntry previousStop = null;
    BlockStopTimeEntry nextStop = null;
    int shapePointIndexFrom = -1;
    int shapePointIndexTo = -1;
    if (r <= 0) {
        /**
         * Location along the block is before the two stop times
         */
        previousStop = blockPrevious;
        nextStop = blockFrom;
        shapePointIndexFrom = 0;
        shapePointIndexTo = nextShapePointIndex(from);
    } else if (r <= 1.0) {
        /**
         * Location along the block is between the two stop times
         */
        previousStop = blockFrom;
        nextStop = blockTo;
        shapePointIndexFrom = from.getShapePointIndex();
        shapePointIndexTo = nextShapePointIndex(to);
    } else {
        /**
         * Location along the block is after the two stop times
         */
        shapePointIndexFrom = to.getShapePointIndex();
        shapePointIndexTo = Integer.MAX_VALUE;
    }
    ScheduledBlockLocation location = new ScheduledBlockLocation();
    location.setActiveTrip(activeTrip);
    location.setClosestStop(closestStop);
    location.setClosestStopTimeOffset(closestStop.getStopTime().getArrivalTime() - scheduledTime);
    location.setPreviousStop(previousStop);
    location.setNextStop(nextStop);
    if (nextStop != null)
        location.setNextStopTimeOffset(nextStop.getStopTime().getArrivalTime() - scheduledTime);
    location.setInService(nextStop != null);
    location.setStopTimeIndex(stopTimeIndex);
    location.setDistanceAlongBlock(distanceAlongBlock);
    location.setScheduledTime(scheduledTime);
    /**
     * In this case, distance along block and distance along trip are the same
     * because we are still in the first trip of the block
     */
    PointAndOrientation po = getLocationAlongShape(activeTrip, distanceAlongBlock, shapePointIndexFrom, shapePointIndexTo);
    if (po != null) {
        location.setLocation(po.getPoint());
        location.setOrientation(po.getOrientation());
    }
    return location;
}
Also used : ScheduledBlockLocation(org.onebusaway.transit_data_federation.services.blocks.ScheduledBlockLocation) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) StopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.StopTimeEntry) BlockTripEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry) PointAndOrientation(org.onebusaway.transit_data_federation.impl.shapes.PointAndOrientation) CoordinatePoint(org.onebusaway.geospatial.model.CoordinatePoint) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry)

Aggregations

BlockStopTimeEntry (org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry)71 StopTimeEntry (org.onebusaway.transit_data_federation.services.transit_graph.StopTimeEntry)32 BlockTripEntry (org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry)29 BlockConfigurationEntry (org.onebusaway.transit_data_federation.services.transit_graph.BlockConfigurationEntry)23 AgencyAndId (org.onebusaway.gtfs.model.AgencyAndId)20 StopTimeInstance (org.onebusaway.transit_data_federation.model.StopTimeInstance)16 TripEntry (org.onebusaway.transit_data_federation.services.transit_graph.TripEntry)15 ArrayList (java.util.ArrayList)14 FrequencyBlockStopTimeEntry (org.onebusaway.transit_data_federation.services.transit_graph.FrequencyBlockStopTimeEntry)14 CoordinatePoint (org.onebusaway.geospatial.model.CoordinatePoint)11 StopEntry (org.onebusaway.transit_data_federation.services.transit_graph.StopEntry)11 BlockInstance (org.onebusaway.transit_data_federation.services.blocks.BlockInstance)10 ScheduledBlockLocation (org.onebusaway.transit_data_federation.services.blocks.ScheduledBlockLocation)9 ArrivalAndDepartureInstance (org.onebusaway.transit_data_federation.services.realtime.ArrivalAndDepartureInstance)9 Date (java.util.Date)8 BlockEntryImpl (org.onebusaway.transit_data_federation.impl.transit_graph.BlockEntryImpl)8 InstanceState (org.onebusaway.transit_data_federation.services.blocks.InstanceState)8 BlockLocation (org.onebusaway.transit_data_federation.services.realtime.BlockLocation)8 BlockStopTimeIndex (org.onebusaway.transit_data_federation.services.blocks.BlockStopTimeIndex)7 FrequencyBlockStopTimeIndex (org.onebusaway.transit_data_federation.services.blocks.FrequencyBlockStopTimeIndex)7