EFA: Trip optimization for least duration, least changes or least walking.

This commit is contained in:
Andreas Schildbach 2015-05-20 13:33:35 +02:00
parent 5cc1956f99
commit f4974bc8f2
19 changed files with 73 additions and 50 deletions

View file

@ -46,6 +46,8 @@ import javax.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
@ -114,6 +116,8 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
private final XmlPullParserFactory parserFactory;
private static final Logger log = LoggerFactory.getLogger(AbstractEfaProvider.class);
@SuppressWarnings("serial")
private static class Context implements QueryTripsContext
{
@ -1999,7 +2003,7 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
}
protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date time,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{
final StringBuilder uri = new StringBuilder();
@ -2023,6 +2027,16 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
uri.append("&ptOptionsActive=1"); // enable public transport options
uri.append("&itOptionsActive=1"); // enable individual transport options
if (optimize == Optimize.LEAST_DURATION)
uri.append("&routeType=LEASTTIME");
else if (optimize == Optimize.LEAST_CHANGES)
uri.append("&routeType=LEASTINTERCHANGE");
else if (optimize == Optimize.LEAST_WALKING)
uri.append("&routeType=LEASTWALKING");
else if (optimize != null)
log.info("Cannot handle " + optimize + ", ignoring.");
uri.append("&changeSpeed=").append(WALKSPEED_MAP.get(walkSpeed));
if (accessibility == Accessibility.BARRIER_FREE)
@ -2105,11 +2119,11 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
}
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options);
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
final StringBuilder uri = new StringBuilder(tripEndpoint);
if (!httpPost)
@ -2141,11 +2155,11 @@ public abstract class AbstractEfaProvider extends AbstractNetworkProvider
}
protected QueryTripsResult queryTripsMobile(final Location from, final @Nullable Location via, final Location to, final Date date,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options);
final String parameters = xsltTripRequestParameters(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
final StringBuilder uri = new StringBuilder(tripEndpoint);
if (!httpPost)

View file

@ -756,8 +756,8 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
}
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
return queryTripsBinary(from, via, to, date, dep, products, walkSpeed, accessibility, options);
}

View file

@ -992,8 +992,8 @@ public abstract class AbstractNavitiaProvider extends AbstractNetworkProvider
}
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
final ResultHeader resultHeader = new ResultHeader(network, SERVER_PRODUCT, SERVER_VERSION, 0, null);

View file

@ -640,8 +640,8 @@ public abstract class AbstractTsiProvider extends AbstractNetworkProvider
}
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
final ResultHeader header = new ResultHeader(network, SERVER_PRODUCT);
final List<Location> possibleFroms, possibleTos, possibleVias;

View file

@ -139,11 +139,11 @@ public class BayernProvider extends AbstractEfaProvider
@Override
protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date time,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, walkSpeed, accessibility,
options));
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, optimize, walkSpeed,
accessibility, options));
if (products != null)
{
@ -165,10 +165,10 @@ public class BayernProvider extends AbstractEfaProvider
@Override
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
return queryTripsMobile(from, via, to, date, dep, products, walkSpeed, accessibility, options);
return queryTripsMobile(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
}
@Override

View file

@ -86,8 +86,8 @@ public class EireannProvider extends AbstractHafasProvider
@Override
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
}

View file

@ -304,8 +304,8 @@ public class InvgProvider extends AbstractHafasProvider
@Override
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
}

View file

@ -54,6 +54,11 @@ public interface NetworkProvider
TRIPS
}
public enum Optimize
{
LEAST_DURATION, LEAST_CHANGES, LEAST_WALKING
}
public enum WalkSpeed
{
SLOW, NORMAL, FAST
@ -138,6 +143,8 @@ public interface NetworkProvider
* date is departure date? {@code true} for departure, {@code false} for arrival
* @param products
* products to take into account, or {@code null} for the provider default
* @param optimize
* optimize trip for one aspect, e.g. duration
* @param walkSpeed
* walking ability, or {@code null} for the provider default
* @param accessibility
@ -148,7 +155,8 @@ public interface NetworkProvider
* @throws IOException
*/
QueryTripsResult queryTrips(Location from, @Nullable Location via, Location to, Date date, boolean dep, @Nullable Set<Product> products,
@Nullable WalkSpeed walkSpeed, @Nullable Accessibility accessibility, @Nullable Set<Option> options) throws IOException;
@Nullable Optimize optimize, @Nullable WalkSpeed walkSpeed, @Nullable Accessibility accessibility, @Nullable Set<Option> options)
throws IOException;
/**
* Query more trips (e.g. earlier or later)

View file

@ -127,8 +127,8 @@ public class NriProvider extends AbstractHafasProvider
@Override
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
}

View file

@ -103,10 +103,10 @@ public class NvbwProvider extends AbstractEfaProvider
@Override
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
return queryTripsMobile(from, via, to, date, dep, products, walkSpeed, accessibility, options);
return queryTripsMobile(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options);
}
@Override

View file

@ -282,8 +282,8 @@ public class SeptaProvider extends AbstractHafasProvider
@Override
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, final Date date, final boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
final @Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options) throws IOException
{
return queryTripsXml(from, via, to, date, dep, products, walkSpeed, accessibility, options);
}

View file

@ -50,11 +50,11 @@ public class SydneyProvider extends AbstractEfaProvider
@Override
protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date time,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, walkSpeed, accessibility,
options));
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, optimize, walkSpeed,
accessibility, options));
if (products != null)
{

View file

@ -60,9 +60,10 @@ public class VgnProvider extends AbstractEfaProvider
@Override
protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date date,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{
return super.xsltTripRequestParameters(from, via, to, date, dep, products, walkSpeed, accessibility, options) + "&itdLPxx_showTariffLevel=1";
return super.xsltTripRequestParameters(from, via, to, date, dep, products, optimize, walkSpeed, accessibility, options)
+ "&itdLPxx_showTariffLevel=1";
}
}

View file

@ -52,11 +52,11 @@ public class VorProvider extends AbstractEfaProvider
@Override
protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date time,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, walkSpeed, accessibility,
options));
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, optimize, walkSpeed,
accessibility, options));
if (products != null)
{

View file

@ -55,11 +55,11 @@ public class VrrProvider extends AbstractEfaProvider
@Override
protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date time,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, walkSpeed, accessibility,
options));
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, optimize, walkSpeed,
accessibility, options));
if (products != null)
{

View file

@ -694,8 +694,8 @@ public class VrsProvider extends AbstractNetworkProvider
// accessibility not supported.
// options not supported.
public QueryTripsResult queryTrips(final Location from, final @Nullable Location via, final Location to, Date date, boolean dep,
final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility,
@Nullable Set<Option> options) throws IOException
final @Nullable Set<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, @Nullable Set<Option> options) throws IOException
{
// The EXACT_POINTS feature generates an about 50% bigger API response, probably well compressible.
final boolean EXACT_POINTS = true;
@ -1021,11 +1021,11 @@ public class VrsProvider extends AbstractNetworkProvider
Context ctx = (Context) context;
if (later)
{
return queryTrips(ctx.from, ctx.via, ctx.to, ctx.getLastDeparture(), true, ctx.products, null, null, null);
return queryTrips(ctx.from, ctx.via, ctx.to, ctx.getLastDeparture(), true, ctx.products, null, null, null, null);
}
else
{
return queryTrips(ctx.from, ctx.via, ctx.to, ctx.getFirstArrival(), false, ctx.products, null, null, null);
return queryTrips(ctx.from, ctx.via, ctx.to, ctx.getFirstArrival(), false, ctx.products, null, null, null, null);
}
}

View file

@ -49,11 +49,11 @@ public class WienProvider extends AbstractEfaProvider
@Override
protected String xsltTripRequestParameters(final Location from, final @Nullable Location via, final Location to, final Date time,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable WalkSpeed walkSpeed,
final boolean dep, final @Nullable Collection<Product> products, final @Nullable Optimize optimize, final @Nullable WalkSpeed walkSpeed,
final @Nullable Accessibility accessibility, final @Nullable Set<Option> options)
{
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, walkSpeed, accessibility,
options));
final StringBuilder uri = new StringBuilder(super.xsltTripRequestParameters(from, via, to, time, dep, products, optimize, walkSpeed,
accessibility, options));
if (products != null)
{

View file

@ -132,7 +132,7 @@ public abstract class AbstractProviderLiveTest
final boolean dep, final @Nullable Set<Product> products, final @Nullable WalkSpeed walkSpeed, final @Nullable Accessibility accessibility)
throws IOException
{
return provider.queryTrips(from, via, to, date, dep, products, walkSpeed, accessibility, null);
return provider.queryTrips(from, via, to, date, dep, products, null, walkSpeed, accessibility, null);
}
protected final QueryTripsResult queryMoreTrips(final QueryTripsContext context, final boolean later) throws IOException

View file

@ -53,6 +53,6 @@ public class TripController
{
final Location fromLocation = new Location(fromType, fromId, null, from);
final Location toLocation = new Location(toType, toId, null, to);
return provider.queryTrips(fromLocation, null, toLocation, new Date(), true, Product.ALL, WalkSpeed.NORMAL, Accessibility.NEUTRAL, null);
return provider.queryTrips(fromLocation, null, toLocation, new Date(), true, Product.ALL, null, WalkSpeed.NORMAL, Accessibility.NEUTRAL, null);
}
}