From 9d93d25a84fe7f0fa45b0942ef55f4eefc3991f7 Mon Sep 17 00:00:00 2001 From: Manuel Fuhr Date: Sat, 7 May 2022 08:27:22 +0200 Subject: [PATCH] Remove abstract CoordinateReader --- .../btools/routingapp/CoordinateReader.java | 211 ++++++++++++++---- .../routingapp/CoordinateReaderInternal.java | 186 --------------- 2 files changed, 173 insertions(+), 224 deletions(-) delete mode 100644 brouter-routing-app/src/main/java/btools/routingapp/CoordinateReaderInternal.java diff --git a/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReader.java b/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReader.java index 5809e70..468b910 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReader.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReader.java @@ -1,5 +1,17 @@ package btools.routingapp; +import android.graphics.Point; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -9,43 +21,181 @@ import java.util.Set; import java.util.TreeMap; import btools.router.OsmNodeNamed; +import btools.router.OsmNogoPolygon; /** * Read coordinates from a gpx-file */ -public abstract class CoordinateReader { +public class CoordinateReader { + protected static String[] posnames + = new String[]{"from", "via1", "via2", "via3", "via4", "via5", "via6", "via7", "via8", "via9", "to"}; + private final String internalDir; public List waypoints; public List nogopoints; public String basedir; public String rootdir; public String tracksdir; - - private boolean nogosOnly; - - private Map> allpointsMap; public List allpoints; - + private boolean nogosOnly; + private Map> allpointsMap; private HashMap pointmap; - protected static String[] posnames - = new String[]{"from", "via1", "via2", "via3", "via4", "via5", "via6", "via7", "via8", "via9", "to"}; - public CoordinateReader(String basedir) { this.basedir = basedir; + internalDir = basedir + "/brouter/import"; + tracksdir = "/brouter/import/tracks"; + rootdir = "/brouter/import"; } - public abstract long getTimeStamp() throws Exception; + public static CoordinateReader obtainValidReader(String basedir) throws IOException { + return obtainValidReader(basedir, false); + } - public abstract int getTurnInstructionMode(); + public static CoordinateReader obtainValidReader(String basedir, boolean nogosOnly) throws IOException { + CoordinateReader cor = new CoordinateReader(basedir); + cor.nogosOnly = nogosOnly; + cor.readFromTo(); + return cor; + } + + public int getTurnInstructionMode() { + return 4; // comment style + } + + /* + * read the from and to position from a gpx-file + * (with hardcoded name for now) + */ + public void readPointmap() throws IOException { + if (!_readPointmap(internalDir + "/favourites_bak.gpx")) { + _readPointmap(internalDir + "/favourites.gpx"); + } + + _readNogoLines(basedir + tracksdir); + } + + private boolean _readPointmap(String filename) throws IOException { + BufferedReader br; + try { + br = new BufferedReader( + new InputStreamReader( + new FileInputStream(filename))); + } catch (FileNotFoundException e) { + // ignore until it's reading error + return false; + } + OsmNodeNamed n = null; + + for (; ; ) { + String line = br.readLine(); + if (line == null) break; + + int idx0 = line.indexOf(" lat=\""); + int idx10 = line.indexOf(""); + if (idx0 >= 0) { + n = new OsmNodeNamed(); + idx0 += 6; + int idx1 = line.indexOf('"', idx0); + n.ilat = (int) ((Double.parseDouble(line.substring(idx0, idx1)) + 90.) * 1000000. + 0.5); + int idx2 = line.indexOf(" lon=\""); + if (idx2 < 0) continue; + idx2 += 6; + int idx3 = line.indexOf('"', idx2); + n.ilon = (int) ((Double.parseDouble(line.substring(idx2, idx3)) + 180.) * 1000000. + 0.5); + if (idx3 < 0) continue; + } + if (n != null && idx10 >= 0) { + idx10 += 6; + int idx11 = line.indexOf("", idx10); + if (idx11 >= 0) { + n.name = line.substring(idx10, idx11).trim(); + checkAddPoint("(one-for-all)", n); + } + } + } + br.close(); + return true; + } + + private void _readNogoLines(String dirname) { + File dir = new File(dirname); + + if (dir.exists() && dir.isDirectory()) { + for (final File file : dir.listFiles()) { + final String name = file.getName(); + if (name.startsWith("nogo") && name.endsWith(".gpx")) { + try { + _readNogoLine(file); + } catch (Exception ignored) { + } + } + } + } + } + + private void _readNogoLine(File file) throws Exception { + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(false); + XmlPullParser xpp = factory.newPullParser(); + + xpp.setInput(new FileReader(file)); + + List tmpPts = new ArrayList<>(); + int eventType = xpp.getEventType(); + int numSeg = 0; + while (eventType != XmlPullParser.END_DOCUMENT) { + switch (eventType) { + case XmlPullParser.START_TAG: { + if (xpp.getName().equals("trkpt") || xpp.getName().equals("rtept")) { + final String lon = xpp.getAttributeValue(null, "lon"); + final String lat = xpp.getAttributeValue(null, "lat"); + if (lon != null && lat != null) { + tmpPts.add(new Point( + (int) ((Double.parseDouble(lon) + 180.) * 1000000. + 0.5), + (int) ((Double.parseDouble(lat) + 90.) * 1000000. + 0.5))); + } + } + break; + } + case XmlPullParser.END_TAG: { + if (xpp.getName().equals("trkseg") || xpp.getName().equals("rte")) { // rte has no segment + OsmNogoPolygon nogo; + if (tmpPts.size() > 0) { + if (tmpPts.get(0).x == tmpPts.get(tmpPts.size() - 1).x && + tmpPts.get(0).y == tmpPts.get(tmpPts.size() - 1).y) { + nogo = new OsmNogoPolygon(true); + } else { + nogo = new OsmNogoPolygon(false); + } + for (Point p : tmpPts) { + nogo.addVertex(p.x, p.y); + } + nogo.calcBoundingCircle(); + final String name = file.getName(); + nogo.name = name.substring(0, name.length() - 4); + if (numSeg > 0) { + nogo.name += Integer.toString(numSeg + 1); + } + numSeg++; + checkAddPoint("(one-for-all)", nogo); + } + tmpPts.clear(); + } + break; + } + } + eventType = xpp.next(); + } + } public void readAllPoints() throws Exception { - allpointsMap = new TreeMap>(); + allpointsMap = new TreeMap<>(); readFromTo(); - allpoints = new ArrayList(); - Set names = new HashSet(); + allpoints = new ArrayList<>(); + Set names = new HashSet<>(); for (String category : allpointsMap.keySet()) { Map cat = allpointsMap.get(category); - if (cat.size() < 101) { + if (cat != null && cat.size() < 101) { for (OsmNodeNamed wp : cat.values()) { if (names.add(wp.name)) { allpoints.add(wp); @@ -62,14 +212,13 @@ public abstract class CoordinateReader { /* * read the from, to and via-positions from a gpx-file */ - public void readFromTo() throws Exception { - pointmap = new HashMap(); - waypoints = new ArrayList(); - nogopoints = new ArrayList(); + public void readFromTo() throws IOException { + pointmap = new HashMap<>(); + waypoints = new ArrayList<>(); + nogopoints = new ArrayList<>(); readPointmap(); boolean fromToMissing = false; - for (int i = 0; i < posnames.length; i++) { - String name = posnames[i]; + for (String name : posnames) { OsmNodeNamed n = pointmap.get(name); if (n != null) { waypoints.add(n); @@ -86,7 +235,7 @@ public abstract class CoordinateReader { if (category == null) category = ""; Map cat = allpointsMap.get(category); if (cat == null) { - cat = new TreeMap(); + cat = new TreeMap<>(); allpointsMap.put(category, cat); } if (cat.size() < 101) { @@ -96,8 +245,8 @@ public abstract class CoordinateReader { } boolean isKnown = false; - for (int i = 0; i < posnames.length; i++) { - if (posnames[i].equals(n.name)) { + for (String posname : posnames) { + if (posname.equals(n.name)) { isKnown = true; break; } @@ -116,18 +265,4 @@ public abstract class CoordinateReader { } } - - protected abstract void readPointmap() throws Exception; - - - public static CoordinateReader obtainValidReader(String basedir) throws Exception { - return obtainValidReader(basedir, false); - } - - public static CoordinateReader obtainValidReader(String basedir, boolean nogosOnly) throws Exception { - CoordinateReader cor = new CoordinateReaderInternal(basedir); - cor.nogosOnly = nogosOnly; - cor.readFromTo(); - return cor; - } } diff --git a/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReaderInternal.java b/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReaderInternal.java deleted file mode 100644 index ccae01d..0000000 --- a/brouter-routing-app/src/main/java/btools/routingapp/CoordinateReaderInternal.java +++ /dev/null @@ -1,186 +0,0 @@ -package btools.routingapp; - -import android.graphics.Point; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserFactory; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; - -import btools.router.OsmNodeNamed; -import btools.router.OsmNogoPolygon; - -/** - * Read coordinates from a gpx-file - */ -public class CoordinateReaderInternal extends CoordinateReader { - private String internalDir; - - public CoordinateReaderInternal(String basedir) { - this(basedir, false); - } - - public CoordinateReaderInternal(String basedir, boolean shortPath) { - super(basedir); - if (shortPath) { - internalDir = basedir; - tracksdir = "/tracks"; - rootdir = ""; - } else { - internalDir = basedir + "/brouter/import"; - tracksdir = "/brouter/import/tracks"; - rootdir = "/brouter/import"; - } - } - - @Override - public long getTimeStamp() throws Exception { - long t1 = new File(internalDir + "/favourites_bak.gpx").lastModified(); - long t2 = new File(internalDir + "/favourites.gpx").lastModified(); - return t1 > t2 ? t1 : t2; - } - - @Override - public int getTurnInstructionMode() { - return 4; // comment style - } - - /* - * read the from and to position from a gpx-file - * (with hardcoded name for now) - */ - @Override - public void readPointmap() throws Exception { - if (!_readPointmap(internalDir + "/favourites_bak.gpx")) { - _readPointmap(internalDir + "/favourites.gpx"); - } - - try { - _readNogoLines(basedir + tracksdir); - } catch (IOException ioe) { - } - } - - private boolean _readPointmap(String filename) throws Exception { - BufferedReader br = null; - try { - br = new BufferedReader( - new InputStreamReader( - new FileInputStream(filename))); - } catch (FileNotFoundException e) { - // ignore until it's reading error - return false; - } - OsmNodeNamed n = null; - - for (; ; ) { - String line = br.readLine(); - if (line == null) break; - - int idx0 = line.indexOf(" lat=\""); - int idx10 = line.indexOf(""); - if (idx0 >= 0) { - n = new OsmNodeNamed(); - idx0 += 6; - int idx1 = line.indexOf('"', idx0); - n.ilat = (int) ((Double.parseDouble(line.substring(idx0, idx1)) + 90.) * 1000000. + 0.5); - int idx2 = line.indexOf(" lon=\""); - if (idx2 < 0) continue; - idx2 += 6; - int idx3 = line.indexOf('"', idx2); - n.ilon = (int) ((Double.parseDouble(line.substring(idx2, idx3)) + 180.) * 1000000. + 0.5); - if (idx3 < 0) continue; - } - if (n != null && idx10 >= 0) { - idx10 += 6; - int idx11 = line.indexOf("", idx10); - if (idx11 >= 0) { - n.name = line.substring(idx10, idx11).trim(); - checkAddPoint("(one-for-all)", n); - } - } - } - br.close(); - return true; - } - - private void _readNogoLines(String dirname) throws IOException { - - File dir = new File(dirname); - - if (dir.exists() && dir.isDirectory()) { - for (final File file : dir.listFiles()) { - final String name = file.getName(); - if (name.startsWith("nogo") && name.endsWith(".gpx")) { - try { - _readNogoLine(file); - } catch (Exception e) { - } - } - } - } - } - - private void _readNogoLine(File file) throws Exception { - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - factory.setNamespaceAware(false); - XmlPullParser xpp = factory.newPullParser(); - - xpp.setInput(new FileReader(file)); - - List tmpPts = new ArrayList(); - int eventType = xpp.getEventType(); - int numSeg = 0; - while (eventType != XmlPullParser.END_DOCUMENT) { - switch (eventType) { - case XmlPullParser.START_TAG: { - if (xpp.getName().equals("trkpt") || xpp.getName().equals("rtept")) { - final String lon = xpp.getAttributeValue(null, "lon"); - final String lat = xpp.getAttributeValue(null, "lat"); - if (lon != null && lat != null) { - tmpPts.add(new Point( - (int) ((Double.parseDouble(lon) + 180.) * 1000000. + 0.5), - (int) ((Double.parseDouble(lat) + 90.) * 1000000. + 0.5))); - } - } - break; - } - case XmlPullParser.END_TAG: { - if (xpp.getName().equals("trkseg") || xpp.getName().equals("rte")) { // rte has no segment - OsmNogoPolygon nogo = null; - if (tmpPts.size() >= 0) { - if (tmpPts.get(0).x == tmpPts.get(tmpPts.size() - 1).x && - tmpPts.get(0).y == tmpPts.get(tmpPts.size() - 1).y) { - nogo = new OsmNogoPolygon(true); - } else { - nogo = new OsmNogoPolygon(false); - } - for (Point p : tmpPts) { - nogo.addVertex(p.x, p.y); - } - nogo.calcBoundingCircle(); - final String name = file.getName(); - nogo.name = name.substring(0, name.length() - 4); - if (numSeg > 0) { - nogo.name += Integer.toString(numSeg + 1); - } - numSeg++; - checkAddPoint("(one-for-all)", nogo); - } - tmpPts.clear(); - } - break; - } - } - eventType = xpp.next(); - } - } -}