/** * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onebusaway.transit_data_federation.impl.otp; import java.util.Set; import org.onebusaway.transit_data.model.tripplanning.ConstraintsBean; import org.onebusaway.transit_data.model.tripplanning.Modes; import org.onebusaway.transit_data_federation.services.ArrivalAndDepartureService; import org.onebusaway.transit_data_federation.services.StopTimeService; import org.onebusaway.transit_data_federation.services.otp.OTPConfigurationService; import org.onebusaway.transit_data_federation.services.transit_graph.TransitGraphDao; import org.onebusaway.transit_data_federation.services.tripplanner.ItinerariesService; import org.onebusaway.transit_data_federation.services.tripplanner.StopHopService; import org.onebusaway.transit_data_federation.services.tripplanner.StopTransferService; import org.onebusaway.transit_data_federation.services.tripplanner.TransferPatternService; import org.opentripplanner.routing.core.TraverseModeSet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component class OTPConfigurationServiceImpl implements OTPConfigurationService { private TransitGraphDao _transitGraphDao; private StopHopService _stopHopService; private StopTransferService _stopTransferService; private ArrivalAndDepartureService _arrivalAndDepartureService; private StopTimeService _stopTimeService; private ItinerariesService _itinerariesService; private TransferPatternService _transferPatternService; @Autowired public void setTransitGraphDao(TransitGraphDao transitGraphDao) { _transitGraphDao = transitGraphDao; } @Autowired public void setStopHopService(StopHopService stopHopService) { _stopHopService = stopHopService; } @Autowired public void setStopTranferService(StopTransferService stopTransferService) { _stopTransferService = stopTransferService; } @Autowired public void setArrivalAndDepartureService( ArrivalAndDepartureService realTimeArrivalAndDepartureService) { _arrivalAndDepartureService = realTimeArrivalAndDepartureService; } @Autowired public void setStopTimeService(StopTimeService stopTimeService) { _stopTimeService = stopTimeService; } @Autowired public void setItinerariesService(ItinerariesService itinerariesService) { _itinerariesService = itinerariesService; } @Autowired public void setTransferPatternService( TransferPatternService transferPatternService) { _transferPatternService = transferPatternService; } @Override public GraphContext createGraphContext() { GraphContext context = new GraphContext(); context.setArrivalAndDepartureService(_arrivalAndDepartureService); context.setItinerariesService(_itinerariesService); context.setStopTimeService(_stopTimeService); context.setStopHopService(_stopHopService); context.setStopTransferService(_stopTransferService); context.setTransferPatternService(_transferPatternService); context.setTransitGraphDao(_transitGraphDao); return context; } /** * From 'Transit Capacity and Quality of Service Manual' - Part 3 - Exhibit * 3.9 * * http://onlinepubs.trb.org/Onlinepubs/tcrp/tcrp100/part%203.pdf * * Table of passenger perceptions of time. Given that actual in-vehicle time * seems to occur in real-time (penalty ratio of 1.0), how do passengers * perceived walking, waiting for the first vehicle, and waiting for a * transfer. In addition, is there an additive penalty for making a transfer * of any kind. */ @Override public OBATraverseOptions createTraverseOptions() { OBATraverseOptions options = new OBATraverseOptions(); options.walkReluctance = 2.2; options.waitAtBeginningFactor = 0.1; options.waitReluctance = 2.5; options.boardCost = 5 * 60; options.maxTransfers = 2; options.minTransferTime = 120; options.maxWalkDistance = 1500; /** * Ten seconds max */ options.maxComputationTime = 10000; options.useServiceDays = false; options.currentTime = System.currentTimeMillis(); return options; } @Override public void applyConstraintsToTraverseOptions(ConstraintsBean constraints, OBATraverseOptions options) { options.setArriveBy(constraints.isArriveBy()); /** * Modes */ Set<String> modes = constraints.getModes(); if (modes != null) { TraverseModeSet ms = new TraverseModeSet(); if (modes.contains(Modes.WALK)) ms.setWalk(true); if (modes.contains(Modes.TRANSIT)) ms.setTransit(true); options.setModes(ms); } /** * Preset optimization types */ String optimizeFor = constraints.getOptimizeFor(); if (optimizeFor != null) { optimizeFor = optimizeFor.toLowerCase(); if (optimizeFor.equals("min_time")) { options.boardCost = 0; options.waitReluctance = 1.0; options.waitReluctance = 1.0; } else if (optimizeFor.equals("min_transfers")) { options.boardCost = 20 * 60; } else if (optimizeFor.equals("min_walking")) { options.walkReluctance = 5.0; } } /** * Walking */ if (constraints.getWalkSpeed() != -1) options.speed = constraints.getWalkSpeed(); if (constraints.getMaxWalkingDistance() != -1) options.maxWalkDistance = constraints.getMaxWalkingDistance(); if (constraints.getWalkReluctance() != -1) options.walkReluctance = constraints.getWalkReluctance(); /** * Waiting */ if (constraints.getInitialWaitReluctance() != -1) options.waitAtBeginningFactor = constraints.getInitialWaitReluctance(); if (constraints.getInitialWaitReluctance() != -1) options.waitReluctance = constraints.getWaitReluctance(); /** * Transferring */ if (constraints.getTransferCost() != -1) options.boardCost = constraints.getTransferCost(); if (constraints.getMinTransferTime() != -1) options.minTransferTime = constraints.getMinTransferTime(); if (constraints.getMaxTransfers() != -1) options.maxTransfers = constraints.getMaxTransfers(); if (constraints.getMaxComputationTime() != -1 && constraints.getMaxComputationTime() < 15000) options.maxComputationTime = constraints.getMaxComputationTime(); options.numItineraries = constraints.getResultCount(); options.useRealtime = constraints.isUseRealTime(); if (constraints.getMaxTripDuration() != -1) options.maxTripDuration = constraints.getMaxTripDuration() * 1000; if (constraints.getCurrentTime() != -1) options.currentTime = constraints.getCurrentTime(); options.lookaheadTime = constraints.getLookaheadTime(); } }