overhauled Poland

This commit is contained in:
Andreas Schildbach 2012-06-23 18:53:32 +02:00
parent 9382729adc
commit b468eb52ce
2 changed files with 83 additions and 29 deletions

View file

@ -537,9 +537,10 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
try try
{ {
// work around unparsable XML // work around unparsable XML
reader = new StringReplaceReader(new InputStreamReader(ParserUtils.scrapeInputStream(uri), ISO_8859_1), "Ringbahn ->", "Ringbahn ->"); reader = new StringReplaceReader(new InputStreamReader(ParserUtils.scrapeInputStream(uri), ISO_8859_1), " & ", " & ");
reader.replace("Ringbahn <-", "Ringbahn &lt;-"); reader.replace("Ringbahn ->", "Ringbahn -&gt;"); // Berlin
reader.replace(" & ", " &amp; "); reader.replace("Ringbahn <-", "Ringbahn &lt;-"); // Berlin
addCustomReplaces(reader);
// System.out.println(uri); // System.out.println(uri);
// ParserUtils.printFromReader(reader); // ParserUtils.printFromReader(reader);
@ -726,6 +727,10 @@ public abstract class AbstractHafasProvider extends AbstractNetworkProvider
} }
} }
protected void addCustomReplaces(final StringReplaceReader reader)
{
}
public QueryConnectionsResult queryConnections(Location from, Location via, Location to, final Date date, final boolean dep, public QueryConnectionsResult queryConnections(Location from, Location via, Location to, final Date date, final boolean dep,
final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException final int numConnections, final String products, final WalkSpeed walkSpeed, final Accessibility accessibility) throws IOException
{ {

View file

@ -27,6 +27,7 @@ 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.QueryDeparturesResult; import de.schildbach.pte.dto.QueryDeparturesResult;
import de.schildbach.pte.util.StringReplaceReader;
/** /**
* @author Andreas Schildbach * @author Andreas Schildbach
@ -34,11 +35,14 @@ import de.schildbach.pte.dto.QueryDeparturesResult;
public class PlProvider extends AbstractHafasProvider public class PlProvider extends AbstractHafasProvider
{ {
public static final NetworkId NETWORK_ID = NetworkId.PL; public static final NetworkId NETWORK_ID = NetworkId.PL;
private static final String API_BASE = "http://rozklad.sitkol.pl/bin/"; private static final String API_BASE = "http://rozklad-pkp.pl/bin/";
// http://rozklad.sitkol.pl/bin/
// http://h2g.sitkol.pl/bin/query.exe/en
public PlProvider() public PlProvider()
{ {
super(API_BASE + "query.exe/pn", 7, null, null, UTF_8); super(API_BASE + "query.exe/pn", 7, null, UTF_8, UTF_8);
} }
public NetworkId id() public NetworkId id()
@ -55,30 +59,54 @@ public class PlProvider extends AbstractHafasProvider
return false; return false;
} }
@Override
protected char intToProduct(final int value)
{
if (value == 1)
return 'I';
if (value == 2)
return 'I';
if (value == 4)
return 'R';
if (value == 8)
return 'S';
if (value == 16) // Bus
return 'B';
if (value == 32) // AST, SEV
return 'B';
if (value == 64)
return 'F';
throw new IllegalArgumentException("cannot handle: " + value);
}
@Override @Override
protected void setProductBits(final StringBuilder productBits, final char product) protected void setProductBits(final StringBuilder productBits, final char product)
{ {
if (product == 'I') if (product == 'I')
{ {
productBits.setCharAt(0, '1'); // Hochgeschwindigkeitszug productBits.setCharAt(0, '1'); // Kolej dużych prędkości
productBits.setCharAt(1, '1'); // EC/IC/EIC/Ex productBits.setCharAt(1, '1'); // EC/IC/EIC/Ex
} }
else if (product == 'R') else if (product == 'R')
{ {
productBits.setCharAt(2, '1'); // TLK/IR/D productBits.setCharAt(2, '1'); // TLK/IR/RE/D/Posp.
productBits.setCharAt(3, '1'); // Regionalverkehrszug
} }
else if (product == 'S' || product == 'T') else if (product == 'S')
{ {
productBits.setCharAt(5, '1'); // Stadtbahn productBits.setCharAt(3, '1'); // Regio/Osobowe
} }
else if (product == 'U') else if (product == 'U')
{ {
productBits.setCharAt(6, '1'); // U-Bahn productBits.setCharAt(6, '1'); // Metro
}
else if (product == 'T')
{
productBits.setCharAt(5, '1'); // Tramwaj
} }
else if (product == 'B' || product == 'P') else if (product == 'B' || product == 'P')
{ {
productBits.setCharAt(4, '1'); // Bus productBits.setCharAt(4, '1'); // Autobus
} }
else if (product == 'F' || product == 'C') else if (product == 'F' || product == 'C')
{ {
@ -107,9 +135,22 @@ public class PlProvider extends AbstractHafasProvider
public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException public NearbyStationsResult queryNearbyStations(final Location location, final int maxDistance, final int maxStations) throws IOException
{ {
if (location.type == LocationType.STATION && location.hasId()) final StringBuilder uri = new StringBuilder(API_BASE);
if (location.hasLocation())
{
uri.append("query.exe/pny");
uri.append("?performLocating=2&tpl=stop2json");
uri.append("&look_maxno=").append(maxStations != 0 ? maxStations : 200);
uri.append("&look_maxdist=").append(maxDistance != 0 ? maxDistance : 5000);
uri.append("&look_stopclass=").append(allProductsInt());
uri.append("&look_x=").append(location.lon);
uri.append("&look_y=").append(location.lat);
return jsonNearbyStations(uri.toString());
}
else if (location.type == LocationType.STATION && location.hasId())
{ {
final StringBuilder uri = new StringBuilder(API_BASE);
uri.append("stboard.exe/pn"); uri.append("stboard.exe/pn");
uri.append("?productsFilter=").append(allProductsString()); uri.append("?productsFilter=").append(allProductsString());
uri.append("&boardType=dep"); uri.append("&boardType=dep");
@ -117,8 +158,6 @@ public class PlProvider extends AbstractHafasProvider
uri.append("&sTI=1&start=yes&hcount=0"); uri.append("&sTI=1&start=yes&hcount=0");
uri.append("&L=vs_java3"); uri.append("&L=vs_java3");
// &inputTripelId=A%3d1%40O%3dCopenhagen%20Airport%40X%3d12646941%40Y%3d55629753%40U%3d86%40L%3d900000011%40B%3d1
return xmlNearbyStations(uri.toString()); return xmlNearbyStations(uri.toString());
} }
else else
@ -142,6 +181,17 @@ public class PlProvider extends AbstractHafasProvider
return xmlQueryDepartures(uri.toString(), stationId); return xmlQueryDepartures(uri.toString(), stationId);
} }
@Override
protected void addCustomReplaces(final StringReplaceReader reader)
{
reader.replace("dir=\"Sp ", " "); // Poland
reader.replace("dir=\"B ", " "); // Poland
reader.replace("dir=\"K ", " "); // Poland
reader.replace("dir=\"Eutingen i. G ", "dir=\"Eutingen\" "); // Poland
reader.replace("StargetLoc", "Süd\" targetLoc"); // Poland
reader.replace("platform=\"K ", " "); // Poland
}
public List<Location> autocompleteStations(final CharSequence constraint) throws IOException public List<Location> autocompleteStations(final CharSequence constraint) throws IOException
{ {
return xmlMLcReq(constraint); return xmlMLcReq(constraint);
@ -151,12 +201,8 @@ public class PlProvider extends AbstractHafasProvider
private static final Pattern P_NORMALIZE_LINE_NUMBER = Pattern.compile("\\d{2,5}"); private static final Pattern P_NORMALIZE_LINE_NUMBER = Pattern.compile("\\d{2,5}");
@Override @Override
protected Line parseLineWithoutType(String line) protected Line parseLineWithoutType(final String line)
{ {
// replace badly encoded character (stations 8530643 and 8530644)
if (line.equals("F\u0084hre"))
line = "Fähre";
final Matcher mRussia = P_NORMALIZE_LINE_RUSSIA.matcher(line); final Matcher mRussia = P_NORMALIZE_LINE_RUSSIA.matcher(line);
if (mRussia.matches()) if (mRussia.matches())
return newLine('R' + mRussia.group(1)); return newLine('R' + mRussia.group(1));
@ -172,23 +218,26 @@ public class PlProvider extends AbstractHafasProvider
{ {
final String ucType = type.toUpperCase(); final String ucType = type.toUpperCase();
if ("REG".equals(ucType))
return 'R';
if ("AR".equals(ucType)) // Arriva Polaczen if ("AR".equals(ucType)) // Arriva Polaczen
return 'R'; return 'R';
if ("N".equals(ucType)) // St. Pierre des Corps - Tours if ("N".equals(ucType))
return 'R';
if ("KW".equals(ucType)) // Koleje Wielkopolskie
return 'R';
if ("KS".equals(ucType)) // Koleje Śląskie
return 'R';
if ("E".equals(ucType))
return 'R';
if ("DB".equals(ucType))
return 'R'; return 'R';
if ("METRO".equals(ucType)) if ("FRE".equals(ucType))
return 'U'; return 'F';
final char t = super.normalizeType(type); final char t = super.normalizeType(type);
if (t != 0) if (t != 0)
return t; return t;
if ("E".equals(ucType))
return '?';
return 0; return 0;
} }
} }