mirror of
https://gitlab.com/oeffi/public-transport-enabler.git
synced 2025-07-14 08:40:29 +00:00
EFA: Trip optimization for least duration, least changes or least walking.
This commit is contained in:
parent
5cc1956f99
commit
f4974bc8f2
19 changed files with 73 additions and 50 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue