mirror of
https://gitlab.com/oeffi/public-transport-enabler.git
synced 2025-07-08 15:18:48 +00:00
map for connection details
git-svn-id: https://public-transport-enabler.googlecode.com/svn/trunk@507 0924bc21-9374-b0fa-ee44-9ff1593b38f0
This commit is contained in:
parent
19410bd60f
commit
f534dae100
8 changed files with 148 additions and 27 deletions
|
@ -46,6 +46,7 @@ import de.schildbach.pte.dto.Line;
|
||||||
import de.schildbach.pte.dto.Location;
|
import de.schildbach.pte.dto.Location;
|
||||||
import de.schildbach.pte.dto.LocationType;
|
import de.schildbach.pte.dto.LocationType;
|
||||||
import de.schildbach.pte.dto.NearbyStationsResult;
|
import de.schildbach.pte.dto.NearbyStationsResult;
|
||||||
|
import de.schildbach.pte.dto.Point;
|
||||||
import de.schildbach.pte.dto.QueryConnectionsResult;
|
import de.schildbach.pte.dto.QueryConnectionsResult;
|
||||||
import de.schildbach.pte.dto.QueryConnectionsResult.Status;
|
import de.schildbach.pte.dto.QueryConnectionsResult.Status;
|
||||||
import de.schildbach.pte.dto.QueryDeparturesResult;
|
import de.schildbach.pte.dto.QueryDeparturesResult;
|
||||||
|
@ -1311,19 +1312,28 @@ public abstract class AbstractEfaProvider implements NetworkProvider
|
||||||
{
|
{
|
||||||
final int min = (int) (arrivalTime.getTimeInMillis() - departureTime.getTimeInMillis()) / 1000 / 60;
|
final int min = (int) (arrivalTime.getTimeInMillis() - departureTime.getTimeInMillis()) / 1000 / 60;
|
||||||
|
|
||||||
|
XmlPullUtil.enter(pp, "itdMeansOfTransport");
|
||||||
|
XmlPullUtil.exit(pp, "itdMeansOfTransport");
|
||||||
|
|
||||||
|
if (XmlPullUtil.test(pp, "itdStopSeq"))
|
||||||
|
XmlPullUtil.next(pp);
|
||||||
|
|
||||||
|
List<Point> path = null;
|
||||||
|
if (XmlPullUtil.test(pp, "itdPathCoordinates"))
|
||||||
|
path = processItdPathCoordinates(pp);
|
||||||
|
|
||||||
if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway)
|
if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway)
|
||||||
{
|
{
|
||||||
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
||||||
|
if (path != null && lastFootway.path != null)
|
||||||
|
path.addAll(0, lastFootway.path);
|
||||||
parts.add(new Connection.Footway(lastFootway.min + min, lastFootway.departureId, lastFootway.departure, arrivalId,
|
parts.add(new Connection.Footway(lastFootway.min + min, lastFootway.departureId, lastFootway.departure, arrivalId,
|
||||||
arrival));
|
arrival, path));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parts.add(new Connection.Footway(min, departureId, departure, arrivalId, arrival));
|
parts.add(new Connection.Footway(min, departureId, departure, arrivalId, arrival, path));
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlPullUtil.enter(pp, "itdMeansOfTransport");
|
|
||||||
XmlPullUtil.exit(pp, "itdMeansOfTransport");
|
|
||||||
}
|
}
|
||||||
else if ("gesicherter Anschluss".equals(productName) || "nicht umsteigen".equals(productName)) // type97
|
else if ("gesicherter Anschluss".equals(productName) || "nicht umsteigen".equals(productName)) // type97
|
||||||
{
|
{
|
||||||
|
@ -1387,8 +1397,12 @@ public abstract class AbstractEfaProvider implements NetworkProvider
|
||||||
intermediateStops.remove(intermediateStops.size() - 1);
|
intermediateStops.remove(intermediateStops.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Point> path = null;
|
||||||
|
if (XmlPullUtil.test(pp, "itdPathCoordinates"))
|
||||||
|
path = processItdPathCoordinates(pp);
|
||||||
|
|
||||||
parts.add(new Connection.Trip(line, destination, departureTime.getTime(), departurePosition, departureId, departure,
|
parts.add(new Connection.Trip(line, destination, departureTime.getTime(), departurePosition, departureId, departure,
|
||||||
arrivalTime.getTime(), arrivalPosition, arrivalId, arrival, intermediateStops));
|
arrivalTime.getTime(), arrivalPosition, arrivalId, arrival, intermediateStops, path));
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlPullUtil.exit(pp, "itdPartialRoute");
|
XmlPullUtil.exit(pp, "itdPartialRoute");
|
||||||
|
@ -1453,6 +1467,39 @@ public abstract class AbstractEfaProvider implements NetworkProvider
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<Point> processItdPathCoordinates(final XmlPullParser pp) throws XmlPullParserException, IOException
|
||||||
|
{
|
||||||
|
final List<Point> path = new LinkedList<Point>();
|
||||||
|
|
||||||
|
XmlPullUtil.enter(pp, "itdPathCoordinates");
|
||||||
|
|
||||||
|
XmlPullUtil.enter(pp, "coordEllipsoid");
|
||||||
|
final String ellipsoid = pp.getText();
|
||||||
|
XmlPullUtil.exit(pp, "coordEllipsoid");
|
||||||
|
|
||||||
|
if (!"WGS84".equals(ellipsoid))
|
||||||
|
throw new IllegalStateException("unknown ellipsoid: " + ellipsoid);
|
||||||
|
|
||||||
|
XmlPullUtil.enter(pp, "coordType");
|
||||||
|
final String type = pp.getText();
|
||||||
|
XmlPullUtil.exit(pp, "coordType");
|
||||||
|
|
||||||
|
if (!"GEO_DECIMAL".equals(type))
|
||||||
|
throw new IllegalStateException("unknown type: " + type);
|
||||||
|
|
||||||
|
XmlPullUtil.enter(pp, "itdCoordinateString");
|
||||||
|
for (final String coordStr : pp.getText().split(" "))
|
||||||
|
{
|
||||||
|
final String[] coordsStr = coordStr.split(",");
|
||||||
|
path.add(new Point(Integer.parseInt(coordsStr[1]), Integer.parseInt(coordsStr[0])));
|
||||||
|
}
|
||||||
|
XmlPullUtil.exit(pp, "itdCoordinateString");
|
||||||
|
|
||||||
|
XmlPullUtil.exit(pp, "itdPathCoordinates");
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
private Fare processItdGenericTicketGroup(final XmlPullParser pp, final String net, final Currency currency) throws XmlPullParserException,
|
private Fare processItdGenericTicketGroup(final XmlPullParser pp, final String net, final Currency currency) throws XmlPullParserException,
|
||||||
IOException
|
IOException
|
||||||
{
|
{
|
||||||
|
|
|
@ -448,7 +448,7 @@ public abstract class AbstractHafasProvider implements NetworkProvider
|
||||||
if (min == 0 || line != null)
|
if (min == 0 || line != null)
|
||||||
{
|
{
|
||||||
parts.add(new Connection.Trip(line, destination, departureTime, departurePos, sectionDeparture.id, sectionDeparture.name,
|
parts.add(new Connection.Trip(line, destination, departureTime, departurePos, sectionDeparture.id, sectionDeparture.name,
|
||||||
arrivalTime, arrivalPos, sectionArrival.id, sectionArrival.name, null));
|
arrivalTime, arrivalPos, sectionArrival.id, sectionArrival.name, null, null));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -456,11 +456,12 @@ public abstract class AbstractHafasProvider implements NetworkProvider
|
||||||
{
|
{
|
||||||
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
||||||
parts.add(new Connection.Footway(lastFootway.min + min, lastFootway.departureId, lastFootway.departure,
|
parts.add(new Connection.Footway(lastFootway.min + min, lastFootway.departureId, lastFootway.departure,
|
||||||
sectionArrival.id, sectionArrival.name));
|
sectionArrival.id, sectionArrival.name, null));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parts.add(new Connection.Footway(min, sectionDeparture.id, sectionDeparture.name, sectionArrival.id, sectionArrival.name));
|
parts.add(new Connection.Footway(min, sectionDeparture.id, sectionDeparture.name, sectionArrival.id, sectionArrival.name,
|
||||||
|
null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -368,7 +368,7 @@ public final class BahnProvider extends AbstractHafasProvider
|
||||||
final Date departureDateTime = ParserUtils.joinDateTime(departureDate, departureTime);
|
final Date departureDateTime = ParserUtils.joinDateTime(departureDate, departureTime);
|
||||||
final Date arrivalDateTime = ParserUtils.joinDateTime(arrivalDate, arrivalTime);
|
final Date arrivalDateTime = ParserUtils.joinDateTime(arrivalDate, arrivalTime);
|
||||||
lastTrip = new Connection.Trip(line, null, departureDateTime, departurePosition, 0, departure, arrivalDateTime,
|
lastTrip = new Connection.Trip(line, null, departureDateTime, departurePosition, 0, departure, arrivalDateTime,
|
||||||
arrivalPosition, 0, arrival, null);
|
arrivalPosition, 0, arrival, null, null);
|
||||||
parts.add(lastTrip);
|
parts.add(lastTrip);
|
||||||
|
|
||||||
if (firstDepartureTime == null)
|
if (firstDepartureTime == null)
|
||||||
|
@ -386,11 +386,11 @@ public final class BahnProvider extends AbstractHafasProvider
|
||||||
if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway)
|
if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway)
|
||||||
{
|
{
|
||||||
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
||||||
parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival));
|
parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival, null));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival));
|
parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
lastArrival = arrival;
|
lastArrival = arrival;
|
||||||
|
@ -399,7 +399,7 @@ public final class BahnProvider extends AbstractHafasProvider
|
||||||
{
|
{
|
||||||
final String arrival = ParserUtils.resolveEntities(mDetFine.group(12));
|
final String arrival = ParserUtils.resolveEntities(mDetFine.group(12));
|
||||||
|
|
||||||
parts.add(new Connection.Footway(0, 0, departure, 0, arrival));
|
parts.add(new Connection.Footway(0, 0, departure, 0, arrival, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -525,7 +525,7 @@ public final class BvgProvider extends AbstractHafasProvider
|
||||||
final String arrival = ParserUtils.resolveEntities(mDetFine.group(10));
|
final String arrival = ParserUtils.resolveEntities(mDetFine.group(10));
|
||||||
|
|
||||||
parts.add(new Connection.Trip(line, destination, departureTime, departurePosition, departureId, departure, arrivalTime,
|
parts.add(new Connection.Trip(line, destination, departureTime, departurePosition, departureId, departure, arrivalTime,
|
||||||
arrivalPosition, arrivalId, arrival, null));
|
arrivalPosition, arrivalId, arrival, null, null));
|
||||||
|
|
||||||
if (firstDepartureTime == null)
|
if (firstDepartureTime == null)
|
||||||
firstDepartureTime = departureTime;
|
firstDepartureTime = departureTime;
|
||||||
|
@ -549,12 +549,12 @@ public final class BvgProvider extends AbstractHafasProvider
|
||||||
{
|
{
|
||||||
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
||||||
parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), lastFootway.departureId, lastFootway.departure,
|
parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), lastFootway.departureId, lastFootway.departure,
|
||||||
arrivalId, arrival, arrivalLat, arrivalLon));
|
arrivalId, arrival, arrivalLat, arrivalLon, null));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parts.add(new Connection.Footway(Integer.parseInt(min), departureId, departure, arrivalId, arrival, arrivalLat,
|
parts.add(new Connection.Footway(Integer.parseInt(min), departureId, departure, arrivalId, arrival, arrivalLat,
|
||||||
arrivalLon));
|
arrivalLon, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
lastArrival = arrival;
|
lastArrival = arrival;
|
||||||
|
|
|
@ -464,14 +464,14 @@ public class OebbProvider extends AbstractHafasProvider
|
||||||
ParserUtils.resolveEntities(mDetFine.group(13))) : null;
|
ParserUtils.resolveEntities(mDetFine.group(13))) : null;
|
||||||
|
|
||||||
final Connection.Trip trip = new Connection.Trip(line, destination, detailsDepartureDateTime, departurePosition,
|
final Connection.Trip trip = new Connection.Trip(line, destination, detailsDepartureDateTime, departurePosition,
|
||||||
departureId, departure, detailsArrivalDateTime, arrivalPosition, arrivalId, arrival, null);
|
departureId, departure, detailsArrivalDateTime, arrivalPosition, arrivalId, arrival, null, null);
|
||||||
connection.parts.add(trip);
|
connection.parts.add(trip);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
final int min = (int) (detailsArrivalDateTime.getTime() - detailsDepartureDateTime.getTime()) / 1000 / 60;
|
final int min = (int) (detailsArrivalDateTime.getTime() - detailsDepartureDateTime.getTime()) / 1000 / 60;
|
||||||
|
|
||||||
final Connection.Footway footway = new Connection.Footway(min, departureId, departure, arrivalId, arrival);
|
final Connection.Footway footway = new Connection.Footway(min, departureId, departure, arrivalId, arrival, null);
|
||||||
connection.parts.add(footway);
|
connection.parts.add(footway);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -372,7 +372,7 @@ public class RmvProvider extends AbstractHafasProvider
|
||||||
final String arrivalPosition = ParserUtils.resolveEntities(mDetFine.group(6));
|
final String arrivalPosition = ParserUtils.resolveEntities(mDetFine.group(6));
|
||||||
|
|
||||||
lastTrip = new Connection.Trip(line, destination, departureTime, departurePosition, 0, departure, arrivalTime,
|
lastTrip = new Connection.Trip(line, destination, departureTime, departurePosition, 0, departure, arrivalTime,
|
||||||
arrivalPosition, 0, arrival, null);
|
arrivalPosition, 0, arrival, null, null);
|
||||||
parts.add(lastTrip);
|
parts.add(lastTrip);
|
||||||
|
|
||||||
if (firstDepartureTime == null)
|
if (firstDepartureTime == null)
|
||||||
|
@ -385,11 +385,11 @@ public class RmvProvider extends AbstractHafasProvider
|
||||||
if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway)
|
if (parts.size() > 0 && parts.get(parts.size() - 1) instanceof Connection.Footway)
|
||||||
{
|
{
|
||||||
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
final Connection.Footway lastFootway = (Connection.Footway) parts.remove(parts.size() - 1);
|
||||||
parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival));
|
parts.add(new Connection.Footway(lastFootway.min + Integer.parseInt(min), 0, lastFootway.departure, 0, arrival, null));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival));
|
parts.add(new Connection.Footway(Integer.parseInt(min), 0, departure, 0, arrival, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,11 +77,17 @@ public final class Connection implements Serializable
|
||||||
return id.hashCode();
|
return id.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static interface Part extends Serializable
|
public static class Part implements Serializable
|
||||||
{
|
{
|
||||||
|
public final List<Point> path;
|
||||||
|
|
||||||
|
public Part(final List<Point> path)
|
||||||
|
{
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final static class Trip implements Part
|
public final static class Trip extends Part
|
||||||
{
|
{
|
||||||
public final String line;
|
public final String line;
|
||||||
public final Location destination;
|
public final Location destination;
|
||||||
|
@ -97,8 +103,10 @@ public final class Connection implements Serializable
|
||||||
|
|
||||||
public Trip(final String line, final Location destination, final Date departureTime, final String departurePosition, final int departureId,
|
public Trip(final String line, final Location destination, final Date departureTime, final String departurePosition, final int departureId,
|
||||||
final String departure, final Date arrivalTime, final String arrivalPosition, final int arrivalId, final String arrival,
|
final String departure, final Date arrivalTime, final String arrivalPosition, final int arrivalId, final String arrival,
|
||||||
final List<Stop> intermediateStops)
|
final List<Stop> intermediateStops, final List<Point> path)
|
||||||
{
|
{
|
||||||
|
super(path);
|
||||||
|
|
||||||
this.line = line;
|
this.line = line;
|
||||||
this.destination = destination;
|
this.destination = destination;
|
||||||
this.departureTime = departureTime;
|
this.departureTime = departureTime;
|
||||||
|
@ -130,7 +138,7 @@ public final class Connection implements Serializable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final static class Footway implements Part
|
public final static class Footway extends Part
|
||||||
{
|
{
|
||||||
public final int min;
|
public final int min;
|
||||||
public final int departureId;
|
public final int departureId;
|
||||||
|
@ -140,8 +148,10 @@ public final class Connection implements Serializable
|
||||||
public final int arrivalLat, arrivalLon;
|
public final int arrivalLat, arrivalLon;
|
||||||
|
|
||||||
public Footway(final int min, final int departureId, final String departure, final int arrivalId, final String arrival, final int arrivalLat,
|
public Footway(final int min, final int departureId, final String departure, final int arrivalId, final String arrival, final int arrivalLat,
|
||||||
final int arrivalLon)
|
final int arrivalLon, final List<Point> path)
|
||||||
{
|
{
|
||||||
|
super(path);
|
||||||
|
|
||||||
this.min = min;
|
this.min = min;
|
||||||
this.departureId = departureId;
|
this.departureId = departureId;
|
||||||
this.departure = departure;
|
this.departure = departure;
|
||||||
|
@ -151,8 +161,10 @@ public final class Connection implements Serializable
|
||||||
this.arrivalLon = arrivalLon;
|
this.arrivalLon = arrivalLon;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Footway(final int min, final int departureId, final String departure, final int arrivalId, final String arrival)
|
public Footway(final int min, final int departureId, final String departure, final int arrivalId, final String arrival, final List<Point> path)
|
||||||
{
|
{
|
||||||
|
super(path);
|
||||||
|
|
||||||
this.min = min;
|
this.min = min;
|
||||||
this.departureId = departureId;
|
this.departureId = departureId;
|
||||||
this.departure = departure;
|
this.departure = departure;
|
||||||
|
|
61
src/de/schildbach/pte/dto/Point.java
Normal file
61
src/de/schildbach/pte/dto/Point.java
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2010 the original author or authors.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.schildbach.pte.dto;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Andreas Schildbach
|
||||||
|
*/
|
||||||
|
public final class Point implements Serializable
|
||||||
|
{
|
||||||
|
public final int lat, lon;
|
||||||
|
|
||||||
|
public Point(final int lat, final int lon)
|
||||||
|
{
|
||||||
|
this.lat = lat;
|
||||||
|
this.lon = lon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return "[" + lat + "/" + lon + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(final Object o)
|
||||||
|
{
|
||||||
|
if (o == this)
|
||||||
|
return true;
|
||||||
|
if (!(o instanceof Point))
|
||||||
|
return false;
|
||||||
|
final Point other = (Point) o;
|
||||||
|
if (this.lat != other.lat)
|
||||||
|
return false;
|
||||||
|
if (this.lon != other.lon)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return lat + 27 * lon;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue