Skip to content

Commit

Permalink
Refactor GTFS-Flex-specific fields out of PatternHop; create new Flex…
Browse files Browse the repository at this point in the history
…PatternHop class
  • Loading branch information
sdjacobs committed Dec 28, 2018
1 parent f3a6b09 commit f46c326
Show file tree
Hide file tree
Showing 11 changed files with 199 additions and 162 deletions.
Expand Up @@ -12,6 +12,9 @@
* Class to keep track of GTFS-Flex related StopPattern parameters * Class to keep track of GTFS-Flex related StopPattern parameters
*/ */
public class StopPatternFlexFields implements Serializable { public class StopPatternFlexFields implements Serializable {

private static final long serialVersionUID = 1L;

public final int size; public final int size;


public final int[] continuousPickup; public final int[] continuousPickup;
Expand Down
121 changes: 121 additions & 0 deletions src/main/java/org/opentripplanner/routing/edgetype/FlexPatternHop.java
@@ -0,0 +1,121 @@
package org.opentripplanner.routing.edgetype;

import com.vividsolutions.jts.geom.Geometry;
import org.opentripplanner.model.Stop;
import org.opentripplanner.routing.vertextype.PatternStopVertex;

/** A PatternHop with GTFS-Flex service enabled. */
public class FlexPatternHop extends PatternHop {

private static final long serialVersionUID = 1L;

private RequestStops requestPickup = RequestStops.NO;

private RequestStops requestDropoff = RequestStops.NO;

private double serviceAreaRadius = 0d;

private Geometry serviceArea = null;

public FlexPatternHop(PatternStopVertex from, PatternStopVertex to, Stop begin, Stop end, int stopIndex) {
super(from, to, begin, end, stopIndex, true);
}

protected FlexPatternHop(PatternStopVertex from, PatternStopVertex to, Stop begin, Stop end, int stopIndex, boolean setInPattern) {
super(from, to, begin, end, stopIndex, setInPattern);
}

/**
* Return the permissions associated with unscheduled pickups in between the endpoints of this
* PatternHop. This relates to flag-stops in the GTFS-Flex specification; if flex and/or flag
* stops are not enabled, this will always be RequestStops.NO.
*/
public RequestStops getRequestPickup() {
return requestPickup;
}

/**
* Return the permissions associated with unscheduled dropoffs in between the endpoints of this
* PatternHop. This relates to flag-stops in the GTFS-Flex specification; if flex and/or flag
* stops are not enabled, this will always be RequestStops.NO.
*/
public RequestStops getRequestDropoff() {
return requestDropoff;
}

/**
* Return whether flag stops are enabled in this hop. Flag stops are enabled if either pickups
* or dropoffs at unscheduled locations can be requested. This is a GTFS-Flex feature.
*/
private boolean hasFlagStopService() {
return requestPickup.allowed() || requestDropoff.allowed();
}

@Override
public boolean hasFlexService() {
return hasFlagStopService() || getServiceAreaRadius() > 0 || getServiceArea() != null;
}

public boolean canRequestService(boolean boarding) {
return boarding ? requestPickup.allowed() : requestDropoff.allowed();
}

public double getServiceAreaRadius() {
return serviceAreaRadius;
}

public Geometry getServiceArea() {
return serviceArea;
}

public boolean hasServiceArea() {
return serviceArea != null;
}

public void setRequestPickup(RequestStops requestPickup) {
this.requestPickup = requestPickup;
}

public void setRequestPickup(int code) {
setRequestPickup(RequestStops.fromGtfs(code));
}

public void setRequestDropoff(RequestStops requestDropoff) {
this.requestDropoff = requestDropoff;
}

public void setRequestDropoff(int code) {
setRequestDropoff(RequestStops.fromGtfs(code));
}

public void setServiceAreaRadius(double serviceAreaRadius) {
this.serviceAreaRadius = serviceAreaRadius;
}

public void setServiceArea(Geometry serviceArea) {
this.serviceArea = serviceArea;
}

private enum RequestStops {
NO(1), YES(0), PHONE(2), COORDINATE_WITH_DRIVER(3);

final int gtfsCode;

RequestStops(int gtfsCode) {
this.gtfsCode = gtfsCode;
}

private static RequestStops fromGtfs(int code) {
for (RequestStops it : values()) {
if(it.gtfsCode == code) {
return it;
}
}
return NO;
}

boolean allowed() {
return this != NO;
}
}
}
108 changes: 4 additions & 104 deletions src/main/java/org/opentripplanner/routing/edgetype/PatternHop.java
Expand Up @@ -14,12 +14,9 @@
import org.opentripplanner.routing.core.State; import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.core.StateEditor; import org.opentripplanner.routing.core.StateEditor;
import org.opentripplanner.routing.core.TraverseMode; import org.opentripplanner.routing.core.TraverseMode;
import org.opentripplanner.routing.trippattern.RealTimeState;
import org.opentripplanner.routing.trippattern.TripTimes; import org.opentripplanner.routing.trippattern.TripTimes;
import org.opentripplanner.routing.vertextype.PatternStopVertex; import org.opentripplanner.routing.vertextype.PatternStopVertex;


import java.util.Locale;

/** /**
* A transit vehicle's journey between departure at one stop and arrival at the next. * A transit vehicle's journey between departure at one stop and arrival at the next.
* This version represents a set of such journeys specified by a TripPattern. * This version represents a set of such journeys specified by a TripPattern.
Expand All @@ -30,14 +27,6 @@ public class PatternHop extends TablePatternEdge implements OnboardEdge, HopEdge


private Stop begin, end; private Stop begin, end;


private RequestStops requestPickup = RequestStops.NO;

private RequestStops requestDropoff = RequestStops.NO;

private double serviceAreaRadius = 0d;

private Geometry serviceArea = null;

public int stopIndex; public int stopIndex;


private LineString geometry = null; private LineString geometry = null;
Expand Down Expand Up @@ -184,104 +173,15 @@ public String toString() {
return "PatternHop(" + getFromVertex() + ", " + getToVertex() + ")"; return "PatternHop(" + getFromVertex() + ", " + getToVertex() + ")";
} }


@Override
public int getStopIndex() {
return stopIndex;
}

/**
* Return the permissions associated with unscheduled pickups in between the endpoints of this
* PatternHop. This relates to flag-stops in the GTFS-Flex specification; if flex and/or flag
* stops are not enabled, this will always be RequestStops.NO.
*/
public RequestStops getRequestPickup() {
return requestPickup;
}

/**
* Return the permissions associated with unscheduled dropoffs in between the endpoints of this
* PatternHop. This relates to flag-stops in the GTFS-Flex specification; if flex and/or flag
* stops are not enabled, this will always be RequestStops.NO.
*/
public RequestStops getRequestDropoff() {
return requestDropoff;
}

/**
* Return whether flag stops are enabled in this hop. Flag stops are enabled if either pickups
* or dropoffs at unscheduled locations can be requested. This is a GTFS-Flex feature.
*/
private boolean hasFlagStopService() {
return requestPickup.allowed() || requestDropoff.allowed();
}

/** /**
* Return true if any GTFS-Flex service is defined for this hop. * Return true if any GTFS-Flex service is defined for this hop.
*/ */
public boolean hasFlexService() { public boolean hasFlexService() {
return hasFlagStopService() || getServiceAreaRadius() > 0 || getServiceArea() != null; return false;
}

public boolean canRequestService(boolean boarding) {
return boarding ? requestPickup.allowed() : requestDropoff.allowed();
}

public double getServiceAreaRadius() {
return serviceAreaRadius;
} }


public Geometry getServiceArea() { @Override
return serviceArea; public int getStopIndex() {
} return stopIndex;

public boolean hasServiceArea() {
return serviceArea != null;
}

public void setRequestPickup(RequestStops requestPickup) {
this.requestPickup = requestPickup;
}

public void setRequestPickup(int code) {
setRequestPickup(RequestStops.fromGtfs(code));
}

public void setRequestDropoff(RequestStops requestDropoff) {
this.requestDropoff = requestDropoff;
}

public void setRequestDropoff(int code) {
setRequestDropoff(RequestStops.fromGtfs(code));
}

public void setServiceAreaRadius(double serviceAreaRadius) {
this.serviceAreaRadius = serviceAreaRadius;
}

public void setServiceArea(Geometry serviceArea) {
this.serviceArea = serviceArea;
}

private enum RequestStops {
NO(1), YES(0), PHONE(2), COORDINATE_WITH_DRIVER(3);

final int gtfsCode;

RequestStops(int gtfsCode) {
this.gtfsCode = gtfsCode;
}

private static RequestStops fromGtfs(int code) {
for (RequestStops it : values()) {
if(it.gtfsCode == code) {
return it;
}
}
return NO;
}

boolean allowed() {
return this != NO;
}
} }
} }
Expand Up @@ -509,13 +509,17 @@ public void makePatternVerticesAndEdges(Graph graph, Map<Stop, ? extends Transit
} }
pav1 = new PatternArriveVertex(graph, this, stop + 1); pav1 = new PatternArriveVertex(graph, this, stop + 1);
arriveVertices[stop + 1] = pav1; arriveVertices[stop + 1] = pav1;
hopEdges[stop] = new PatternHop(pdv0, pav1, s0, s1, stop);
if (stopPattern.hasFlexFields()) { if (stopPattern.hasFlexFields()) {
FlexPatternHop hop = new FlexPatternHop(pdv0, pav1, s0, s1, stop);
StopPatternFlexFields flexFields = stopPattern.getFlexFields(); StopPatternFlexFields flexFields = stopPattern.getFlexFields();
hopEdges[stop].setRequestPickup(flexFields.continuousPickup[stop]); hop.setRequestPickup(flexFields.continuousPickup[stop]);
hopEdges[stop].setRequestDropoff(flexFields.continuousDropOff[stop]); hop.setRequestDropoff(flexFields.continuousDropOff[stop]);
hopEdges[stop].setServiceAreaRadius(flexFields.serviceAreaRadius[stop]); hop.setServiceAreaRadius(flexFields.serviceAreaRadius[stop]);
hopEdges[stop].setServiceArea(flexFields.serviceAreas[stop]); hop.setServiceArea(flexFields.serviceAreas[stop]);
hopEdges[stop] = hop;
} else {
hopEdges[stop] = new PatternHop(pdv0, pav1, s0, s1, stop);
} }


/* Get the arrive and depart vertices for the current stop (not pattern stop). */ /* Get the arrive and depart vertices for the current stop (not pattern stop). */
Expand Down
Expand Up @@ -10,6 +10,7 @@
import org.opentripplanner.model.Stop; import org.opentripplanner.model.Stop;
import org.opentripplanner.routing.core.RoutingRequest; import org.opentripplanner.routing.core.RoutingRequest;
import org.opentripplanner.routing.core.State; import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.edgetype.FlexPatternHop;
import org.opentripplanner.routing.edgetype.PatternHop; import org.opentripplanner.routing.edgetype.PatternHop;
import org.opentripplanner.routing.trippattern.TripTimes; import org.opentripplanner.routing.trippattern.TripTimes;
import org.opentripplanner.routing.vertextype.PatternArriveVertex; import org.opentripplanner.routing.vertextype.PatternArriveVertex;
Expand All @@ -18,7 +19,7 @@
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


public class PartialPatternHop extends PatternHop { public class PartialPatternHop extends FlexPatternHop {


private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;


Expand All @@ -28,7 +29,7 @@ public class PartialPatternHop extends PatternHop {
private double endIndex; private double endIndex;
private double originalHopLength; private double originalHopLength;
private double percentageOfHop; private double percentageOfHop;
private PatternHop originalHop; private FlexPatternHop originalHop;
private Geometry boardArea; private Geometry boardArea;
private Geometry alightArea; private Geometry alightArea;
private LineString displayGeometry; private LineString displayGeometry;
Expand All @@ -42,7 +43,7 @@ public class PartialPatternHop extends PatternHop {


// constructor for flag stops // constructor for flag stops
// this could be merged into deviated-route service constructor // this could be merged into deviated-route service constructor
public PartialPatternHop(PatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop, double startIndex, double endIndex, double buffer) { public PartialPatternHop(FlexPatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop, double startIndex, double endIndex, double buffer) {
super(from, to, fromStop, toStop, hop.getStopIndex(), false); super(from, to, fromStop, toStop, hop.getStopIndex(), false);
setRequestPickup(hop.getRequestPickup()); setRequestPickup(hop.getRequestPickup());
setRequestDropoff(hop.getRequestDropoff()); setRequestDropoff(hop.getRequestDropoff());
Expand All @@ -58,7 +59,7 @@ public PartialPatternHop(PatternHop hop, PatternStopVertex from, PatternStopVert
} }


// constructor for deviated-route service // constructor for deviated-route service
public PartialPatternHop(PatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop, double startIndex, double endIndex, public PartialPatternHop(FlexPatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop, double startIndex, double endIndex,
LineString startGeometry, int startVehicleTime, LineString endGeometry, int endVehicleTime, double buffer) { LineString startGeometry, int startVehicleTime, LineString endGeometry, int endVehicleTime, double buffer) {
super(from, to, fromStop, toStop, hop.getStopIndex(), false); super(from, to, fromStop, toStop, hop.getStopIndex(), false);
setRequestPickup(hop.getRequestPickup()); setRequestPickup(hop.getRequestPickup());
Expand Down Expand Up @@ -102,7 +103,7 @@ public PartialPatternHop(PatternHop hop, PatternStopVertex from, PatternStopVert
} }


// pass-thru for TemporaryDirectPatternHop // pass-thru for TemporaryDirectPatternHop
public PartialPatternHop(PatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop) { public PartialPatternHop(FlexPatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop) {
super(from, to, fromStop, toStop, hop.getStopIndex(), false); super(from, to, fromStop, toStop, hop.getStopIndex(), false);
setRequestPickup(hop.getRequestPickup()); setRequestPickup(hop.getRequestPickup());
setRequestDropoff(hop.getRequestDropoff()); setRequestDropoff(hop.getRequestDropoff());
Expand Down Expand Up @@ -131,12 +132,12 @@ private void setGeometry(PatternHop hop, LengthIndexedLine line, double boardBuf
} }


// given hop s0->s1 and a temporary position t, create a partial hop s0->t // given hop s0->s1 and a temporary position t, create a partial hop s0->t
public static PartialPatternHop startHop(PatternHop hop, PatternArriveVertex to, Stop toStop) { public static PartialPatternHop startHop(FlexPatternHop hop, PatternArriveVertex to, Stop toStop) {
LengthIndexedLine line = new LengthIndexedLine(hop.getGeometry()); LengthIndexedLine line = new LengthIndexedLine(hop.getGeometry());
return new PartialPatternHop(hop, (PatternStopVertex) hop.getFromVertex(), to, hop.getBeginStop(), toStop, line.getStartIndex(), line.project(to.getCoordinate()), 0); return new PartialPatternHop(hop, (PatternStopVertex) hop.getFromVertex(), to, hop.getBeginStop(), toStop, line.getStartIndex(), line.project(to.getCoordinate()), 0);
} }


public static PartialPatternHop endHop(PatternHop hop, PatternDepartVertex from, Stop fromStop) { public static PartialPatternHop endHop(FlexPatternHop hop, PatternDepartVertex from, Stop fromStop) {
LengthIndexedLine line = new LengthIndexedLine(hop.getGeometry()); LengthIndexedLine line = new LengthIndexedLine(hop.getGeometry());
return new PartialPatternHop(hop, from, (PatternStopVertex) hop.getToVertex(), fromStop, hop.getEndStop(), line.project(from.getCoordinate()), line.getEndIndex(), 0); return new PartialPatternHop(hop, from, (PatternStopVertex) hop.getToVertex(), fromStop, hop.getEndStop(), line.project(from.getCoordinate()), line.getEndIndex(), 0);
} }
Expand Down Expand Up @@ -237,7 +238,7 @@ public boolean hasAlightArea() {
return alightArea != null; return alightArea != null;
} }


public PatternHop getOriginalHop() { public FlexPatternHop getOriginalHop() {
return originalHop; return originalHop;
} }


Expand Down
Expand Up @@ -5,6 +5,7 @@
import org.opentripplanner.routing.core.RoutingRequest; import org.opentripplanner.routing.core.RoutingRequest;
import org.opentripplanner.routing.core.State; import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.core.StateEditor; import org.opentripplanner.routing.core.StateEditor;
import org.opentripplanner.routing.edgetype.FlexPatternHop;
import org.opentripplanner.routing.edgetype.PatternHop; import org.opentripplanner.routing.edgetype.PatternHop;
import org.opentripplanner.routing.edgetype.TemporaryEdge; import org.opentripplanner.routing.edgetype.TemporaryEdge;
import org.opentripplanner.routing.trippattern.TripTimes; import org.opentripplanner.routing.trippattern.TripTimes;
Expand All @@ -23,7 +24,7 @@ public class TemporaryDirectPatternHop extends TemporaryPartialPatternHop implem
*/ */
private int directTime; private int directTime;


public TemporaryDirectPatternHop(PatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop, LineString geometry, int time) { public TemporaryDirectPatternHop(FlexPatternHop hop, PatternStopVertex from, PatternStopVertex to, Stop fromStop, Stop toStop, LineString geometry, int time) {
super(hop, from, to, fromStop, toStop); super(hop, from, to, fromStop, toStop);
setGeometry(geometry); setGeometry(geometry);
this.directTime = time; this.directTime = time;
Expand Down

0 comments on commit f46c326

Please sign in to comment.