MATSIM
AbstractTransitRouter.java
Go to the documentation of this file.
1 
2 /* *********************************************************************** *
3  * project: org.matsim.*
4  * AbstractTransitRouter.java
5  * *
6  * *********************************************************************** *
7  * *
8  * copyright : (C) 2019 by the members listed in the COPYING, *
9  * LICENSE and WARRANTY file. *
10  * email : info at matsim dot org *
11  * *
12  * *********************************************************************** *
13  * *
14  * This program is free software; you can redistribute it and/or modify *
15  * it under the terms of the GNU General Public License as published by *
16  * the Free Software Foundation; either version 2 of the License, or *
17  * (at your option) any later version. *
18  * See also COPYING, LICENSE and WARRANTY file *
19  * *
20  * *********************************************************************** */
21 
22  package org.matsim.pt.router;
23 
24 import java.util.ArrayList;
25 import java.util.List;
26 
27 import org.matsim.api.core.v01.Coord;
39 
40 public class AbstractTransitRouter {
41 
44 
45  protected AbstractTransitRouter (TransitRouterConfig transitRouterConfig){
46  this.trConfig = transitRouterConfig;
47  }
48 
49  protected AbstractTransitRouter(TransitRouterConfig config, TransitTravelDisutility transitTravelDisutility){
50  this.trConfig = config;
51  this.travelDisutility = transitTravelDisutility;
52  }
53 
54  // a setter is required for default PT router, I dont see any other way to make AbstractTransitRouter 'general purpose'.
55  protected void setTransitTravelDisutility(TransitTravelDisutility transitTravelDisutility){
56  this.travelDisutility = transitTravelDisutility;
57  }
58 
59  // methods
60  protected final double getWalkTime(Person person, Coord coord, Coord toCoord) {
61  return getTravelDisutility().getWalkTravelTime(person, coord, toCoord);
62  }
63 
64  protected final double getTransferTime(Person person, Coord coord, Coord toCoord) {
65  return getTravelDisutility().getWalkTravelTime(person, coord, toCoord) + this.getConfig().getAdditionalTransferTime();
66  }
67 
71  @Deprecated
72  protected final List<Leg> createDirectWalkLegList(Person person, Coord fromCoord, Coord toCoord) {
73  List<Leg> legs = new ArrayList<>();
75  double walkTime = getWalkTime(person, fromCoord, toCoord);
76  leg.setTravelTime(walkTime);
78  Route walkRoute = RouteUtils.createGenericRouteImpl(null, null);
79  walkRoute.setTravelTime(walkTime);
80  leg.setRoute(walkRoute);
81  legs.add(leg);
82  return legs;
83  }
84 
85  private Leg createAccessTransitWalkLeg(Coord fromCoord, RouteSegment routeSegement) {
86  Leg leg = this.createTransitWalkLeg(fromCoord, routeSegement.fromStop.getCoord());
87  Route walkRoute = RouteUtils.createGenericRouteImpl(null, routeSegement.fromStop.getLinkId());
88  walkRoute.setTravelTime(leg.getTravelTime().seconds());
89  walkRoute.setDistance(trConfig.getBeelineDistanceFactor() * NetworkUtils.getEuclideanDistance(fromCoord, routeSegement.fromStop.getCoord()));
90  leg.setRoute(walkRoute);
91  return leg;
92  }
93 
94  private Leg createEgressTransitWalkLeg(RouteSegment routeSegement, Coord toCoord) {
95  Leg leg = this.createTransitWalkLeg(routeSegement.toStop.getCoord(), toCoord);
96  Route walkRoute = RouteUtils.createGenericRouteImpl(routeSegement.toStop.getLinkId(), null);
97  walkRoute.setTravelTime(leg.getTravelTime().seconds());
98  walkRoute.setDistance(trConfig.getBeelineDistanceFactor() * NetworkUtils.getEuclideanDistance(routeSegement.toStop.getCoord(), toCoord));
99  leg.setRoute(walkRoute);
100  return leg;
101  }
102 
104  Leg leg = this.createTransitWalkLeg(routeSegement.getFromStop().getCoord(), routeSegement.getToStop().getCoord());
105  Route walkRoute = RouteUtils.createGenericRouteImpl(routeSegement.getFromStop().getLinkId(), routeSegement.getToStop().getLinkId());
106 // walkRoute.setTravelTime(leg.getTravelTime() );
107  // transit walk leg should include additional transfer time; Amit, Aug'17
108  leg.setTravelTime( getTransferTime(null, routeSegement.getFromStop().getCoord(), routeSegement.getToStop().getCoord()) );
109  walkRoute.setTravelTime(getTransferTime(null, routeSegement.getFromStop().getCoord(), routeSegement.getToStop().getCoord()) );
110  walkRoute.setDistance(trConfig.getBeelineDistanceFactor() * NetworkUtils.getEuclideanDistance(routeSegement.fromStop.getCoord(), routeSegement.toStop.getCoord()));
111  leg.setRoute(walkRoute);
112 
113  return leg;
114  }
115 
116  protected List<Leg> convertPassengerRouteToLegList(double departureTime, InternalTransitPassengerRoute p, Coord fromCoord, Coord toCoord, Person person) {
117  // convert the route into a sequence of legs
118  List<Leg> legs = new ArrayList<>();
119 
120  // access leg
121  Leg accessLeg;
122  // check if first leg extends walking distance
123  if (p.getRoute().get(0).getRouteTaken() == null) {
124  // route starts with transfer - extend initial walk to that stop
125  //TODO: what if first leg extends the walking distance to more than first routeSegment i.e., (accessLeg, transfer, transfer ...). Amit Jan'18
126 // accessLeg = createTransitWalkLeg(fromCoord, p.getRoute().get(0).getToStop().getCoord());
127  accessLeg = createAccessTransitWalkLeg(fromCoord, p.getRoute().get(0));
128  p.getRoute().remove(0);
129  } else {
130  // do not extend it - add a regular walk leg
131  //
132 // accessLeg = createTransitWalkLeg(fromCoord, p.getRoute().get(0).getFromStop().getCoord());
133  accessLeg = createAccessTransitWalkLeg(fromCoord, p.getRoute().get(0));
134  }
135 
136  // egress leg
137  Leg egressLeg;
138  // check if first leg extends walking distance
139  if (p.getRoute().get(p.getRoute().size() - 1).getRouteTaken() == null) {
140  // route starts with transfer - extend initial walk to that stop
141 // egressLeg = createTransitWalkLeg(p.getRoute().get(p.getRoute().size() - 1).getFromStop().getCoord(), toCoord);
142  egressLeg = createEgressTransitWalkLeg(p.getRoute().get(p.getRoute().size() - 1), toCoord);
143  p.getRoute().remove(p.getRoute().size() - 1);
144  } else {
145  // do not extend it - add a regular walk leg
146  // access leg
147 // egressLeg = createTransitWalkLeg(p.getRoute().get(p.getRoute().size() - 1).getToStop().getCoord(), toCoord);
148  egressLeg = createEgressTransitWalkLeg(p.getRoute().get(p.getRoute().size() - 1), toCoord);
149  }
150 
151 
152  // add very first leg
153  legs.add(accessLeg);
154 
155  // route segments are now in pt-walk-pt sequence
156  for (RouteSegment routeSegement : p.getRoute()) {
157  if (routeSegement.getRouteTaken() == null) {// transfer
158  if (!routeSegement.fromStop.equals(routeSegement.toStop)) { // same to/from stop => no transfer. Amit Feb'18
159  legs.add(createTransferTransitWalkLeg(routeSegement));
160  }
161  } else {
162  // pt leg
163  legs.add(createTransitLeg(routeSegement));
164  }
165  }
166 
167  // add last leg
168  legs.add(egressLeg);
169 
170  return legs;
171  }
172 
173  private Leg createTransitLeg(RouteSegment routeSegment) {
175 
177  routeSegment.getFromStop().getLinkId(), routeSegment.getToStop().getLinkId(), //
178  routeSegment.getFromStop().getId(), routeSegment.getToStop().getId(), //
179  routeSegment.getLineTaken(), routeSegment.getRouteTaken()
180  );
181 
182  ptRoute.setTravelTime(routeSegment.travelTime);
183  leg.setRoute(ptRoute);
184 
185  leg.setTravelTime(routeSegment.getTravelTime());
186  return leg;
187  }
188 
189  private Leg createTransitWalkLeg(Coord fromCoord, Coord toCoord) {
191  double walkTime = getWalkTime(null, fromCoord, toCoord);
192  leg.setTravelTime(walkTime);
193  return leg;
194  }
195 
196  protected final TransitRouterConfig getConfig() {
197  return trConfig;
198  }
199 
200  protected final double getWalkDisutility(Person person, Coord coord, Coord toCoord) {
201  return getTravelDisutility().getWalkTravelDisutility(person, coord, toCoord);
202  }
203 
205  return travelDisutility;
206  }
207 
208 }
final double getWalkDisutility(Person person, Coord coord, Coord toCoord)
TransitStopFacility getFromStop()
static Route createGenericRouteImpl(Id< Link > startLinkId, Id< Link > endLinkId)
Leg createEgressTransitWalkLeg(RouteSegment routeSegement, Coord toCoord)
List< Leg > convertPassengerRouteToLegList(double departureTime, InternalTransitPassengerRoute p, Coord fromCoord, Coord toCoord, Person person)
Id< TransitRoute > getRouteTaken()
void setTransitTravelDisutility(TransitTravelDisutility transitTravelDisutility)
final double getTransferTime(Person person, Coord coord, Coord toCoord)
final double getWalkTime(Person person, Coord coord, Coord toCoord)
Leg createTransitWalkLeg(Coord fromCoord, Coord toCoord)
static void setRoutingMode(Leg leg, String mode)
double getWalkTravelDisutility(Person person, Coord coord, Coord toCoord)
AbstractTransitRouter(TransitRouterConfig transitRouterConfig)
Leg createTransferTransitWalkLeg(RouteSegment routeSegement)
static Leg createLeg(String transportMode)
AbstractTransitRouter(TransitRouterConfig config, TransitTravelDisutility transitTravelDisutility)
Id< TransitLine > getLineTaken()
final List< Leg > createDirectWalkLegList(Person person, Coord fromCoord, Coord toCoord)
static double getEuclideanDistance(Coord origin, Coord destination)
TransitStopFacility getToStop()
void setTravelTime(final double seconds)
double getWalkTravelTime(Person person, Coord coord, Coord toCoord)
Leg createAccessTransitWalkLeg(Coord fromCoord, RouteSegment routeSegement)
final TransitTravelDisutility getTravelDisutility()
void setTravelTime(final double travelTime)