diff --git a/brouter-core/src/main/java/btools/router/Formatter.java b/brouter-core/src/main/java/btools/router/Formatter.java index b9c3276..09bdb1d 100644 --- a/brouter-core/src/main/java/btools/router/Formatter.java +++ b/brouter-core/src/main/java/btools/router/Formatter.java @@ -8,10 +8,6 @@ import java.util.Locale; import java.util.TimeZone; public abstract class Formatter { - private static final int OUTPUT_FORMAT_GPX = 0; - private static final int OUTPUT_FORMAT_KML = 1; - private static final int OUTPUT_FORMAT_JSON = 2; - private static final int OUTPUT_FORMAT_CSV = 3; static final String MESSAGES_HEADER = "Longitude\tLatitude\tElevation\tDistance\tCostPerKm\tElevCost\tTurnCost\tNodeCost\tInitialCost\tWayTags\tNodeTags\tTime\tEnergy"; diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index d070256..9ccff98 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -7,33 +7,20 @@ package btools.router; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.StringWriter; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; -import java.util.Locale; import java.util.Map; -import java.util.TimeZone; import btools.mapaccess.MatchedWaypoint; import btools.mapaccess.OsmPos; import btools.util.CompactLongMap; import btools.util.FrozenLongMap; -import btools.util.StringUtils; public final class OsmTrack { final public static String version = "1.7.3"; @@ -395,751 +382,8 @@ public final class OsmTrack { public int plainAscend; public int cost; public int energy; - - /** - * writes the track in gpx-format to a file - * - * @param filename the filename to write to - */ - public void writeGpx(String filename) throws Exception { - BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); - formatAsGpx(bw); - bw.close(); - } - - public String formatAsGpx() { - try { - StringWriter sw = new StringWriter(8192); - BufferedWriter bw = new BufferedWriter(sw); - formatAsGpx(bw); - bw.close(); - return sw.toString(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public String formatAsGpx(BufferedWriter sb) throws IOException { - int turnInstructionMode = voiceHints != null ? voiceHints.turnInstructionMode : 0; - - sb.append("\n"); - if (turnInstructionMode != 9) { - for (int i = messageList.size() - 1; i >= 0; i--) { - String message = messageList.get(i); - if (i < messageList.size() - 1) - message = "(alt-index " + i + ": " + message + " )"; - if (message != null) - sb.append("\n"); - } - } - - if (turnInstructionMode == 4) { // comment style - sb.append("\n"); - sb.append("\n"); - sb.append("\n"); - } - sb.append("\n"); - } else { - sb.append(" creator=\"BRouter-" + version + "\" version=\"1.1\">\n"); - } - if (turnInstructionMode == 9) { - sb.append(" \n"); - sb.append(" ").append(name).append("\n"); - sb.append(" \n"); - sb.append(" ").append(messageList.get(0)).append("\n"); - if (params != null && params.size() > 0) { - sb.append(" e : params.entrySet()) { - if (i++ != 0) sb.append("&"); - sb.append(e.getKey()).append("=").append(e.getValue()); - } - sb.append("]]>\n"); - } - sb.append(" \n"); - sb.append(" \n"); - } - if (turnInstructionMode == 3 || turnInstructionMode == 8) { // osmand style, cruiser - float lastRteTime = 0; - - sb.append(" \n"); - - float rteTime = getVoiceHintTime(0); - StringBuffer first = new StringBuffer(); - // define start point - { - first.append(" \n") - .append(" start\n \n"); - if (rteTime != lastRteTime) { // add timing only if available - double t = rteTime - lastRteTime; - first.append(" \n"); - lastRteTime = rteTime; - } - first.append(" 0\n \n \n"); - } - if (turnInstructionMode == 8) { - if (matchedWaypoints.get(0).direct && voiceHints.list.get(0).indexInTrack == 0) { - // has a voice hint do nothing, voice hint will do - } else { - sb.append(first.toString()); - } - } else { - sb.append(first.toString()); - } - - for (int i = 0; i < voiceHints.list.size(); i++) { - VoiceHint hint = voiceHints.list.get(i); - sb.append(" \n") - .append(" ") - .append(turnInstructionMode == 3 ? hint.getMessageString() : hint.getCruiserMessageString()) - .append("\n \n"); - - rteTime = getVoiceHintTime(i + 1); - - if (rteTime != lastRteTime) { // add timing only if available - double t = rteTime - lastRteTime; - sb.append(" \n"); - lastRteTime = rteTime; - } - sb.append(" ") - .append(turnInstructionMode == 3 ? hint.getCommandString() : hint.getCruiserCommandString()) - .append("\n ").append("" + (int) hint.angle) - .append("\n ").append("" + hint.indexInTrack).append("\n \n \n"); - } - sb.append(" \n") - .append(" destination\n \n"); - sb.append(" \n"); - sb.append(" ").append("" + (nodes.size() - 1)).append("\n \n \n"); - - sb.append("\n"); - } - - if (turnInstructionMode == 7) { // old locus style - float lastRteTime = getVoiceHintTime(0); - - for (int i = 0; i < voiceHints.list.size(); i++) { - VoiceHint hint = voiceHints.list.get(i); - sb.append(" ") - .append(hint.selev == Short.MIN_VALUE ? "" : "" + (hint.selev / 4.) + "") - .append("").append(hint.getMessageString()).append("") - .append("").append("" + hint.distanceToNext).append(""); - float rteTime = getVoiceHintTime(i + 1); - if (rteTime != lastRteTime) { // add timing only if available - double t = rteTime - lastRteTime; - double speed = hint.distanceToNext / t; - sb.append("").append("" + t).append("") - .append("").append("" + speed).append(""); - lastRteTime = rteTime; - } - sb.append("").append("" + hint.getLocusAction()).append("") - .append("\n"); - } - } - if (turnInstructionMode == 5) { // gpsies style - for (VoiceHint hint : voiceHints.list) { - sb.append(" ") - .append("").append(hint.getMessageString()).append("") - .append("").append(hint.getSymbolString().toLowerCase()).append("") - .append("").append(hint.getSymbolString()).append("") - .append("\n"); - } - } - - if (turnInstructionMode == 6) { // orux style - for (VoiceHint hint : voiceHints.list) { - sb.append(" ") - .append(hint.selev == Short.MIN_VALUE ? "" : "" + (hint.selev / 4.) + "") - .append("\n" + - " \n" + - " ").append("" + hint.getOruxAction()) - .append("\n" + - " \n" + - " \n" + - " \n"); - } - } - - for (int i = 0; i <= pois.size() - 1; i++) { - OsmNodeNamed poi = pois.get(i); - sb.append(" \n") - .append(" ").append(StringUtils.escapeXml10(poi.name)).append("\n") - .append(" \n"); - } - - if (exportWaypoints) { - for (int i = 0; i <= matchedWaypoints.size() - 1; i++) { - MatchedWaypoint wt = matchedWaypoints.get(i); - sb.append(" \n") - .append(" ").append(StringUtils.escapeXml10(wt.name)).append("\n"); - if (i == 0) { - sb.append(" from\n"); - } else if (i == matchedWaypoints.size() - 1) { - sb.append(" to\n"); - } else { - sb.append(" via\n"); - } - sb.append(" \n"); - } - } - sb.append(" \n"); - if (turnInstructionMode == 9 - || turnInstructionMode == 2 - || turnInstructionMode == 8 - || turnInstructionMode == 4) { // Locus, comment, cruise, brouter style - sb.append(" ").append(name).append("\n"); - sb.append(" ").append(voiceHints.getTransportMode()).append("\n"); - } else { - sb.append(" ").append(name).append("\n"); - } - - if (turnInstructionMode == 7) { - sb.append(" \n"); - sb.append(" ").append("" + voiceHints.getLocusRouteType()).append("\n"); - sb.append(" 1\n"); - sb.append(" \n"); - } - - - // all points - sb.append(" \n"); - String lastway = ""; - boolean bNextDirect = false; - OsmPathElement nn = null; - String aSpeed; - - for (int idx = 0; idx < nodes.size(); idx++) { - OsmPathElement n = nodes.get(idx); - String sele = n.getSElev() == Short.MIN_VALUE ? "" : "" + n.getElev() + ""; - VoiceHint hint = getVoiceHint(idx); - MatchedWaypoint mwpt = getMatchedWaypoint(idx); - - if (showTime) { - sele += ""; - } - if (turnInstructionMode == 8) { - if (mwpt != null && - !mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { - sele += "" + mwpt.name + ""; - } - } - boolean bNeedHeader = false; - if (turnInstructionMode == 9) { // trkpt/sym style - - if (hint != null) { - - if (mwpt != null && - !mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { - sele += "" + mwpt.name + ""; - } - sele += "" + hint.getCruiserMessageString() + ""; - sele += "" + hint.getCommandString(hint.cmd) + ""; - if (mwpt != null) { - sele += "Via"; - } - sele += ""; - if (showspeed) { - double speed = 0; - if (nn != null) { - int dist = n.calcDistance(nn); - float dt = n.getTime() - nn.getTime(); - if (dt != 0.f) { - speed = ((3.6f * dist) / dt + 0.5); - } - } - sele += "" + (((int) (speed * 10)) / 10.f) + ""; - } - - sele += "" + hint.getCommandString() + ";" + (int) (hint.distanceToNext) + "," + hint.formatGeometry() + ""; - if (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway)) { - sele += "" + n.message.wayKeyValues + ""; - lastway = n.message.wayKeyValues; - } - if (n.message != null && n.message.nodeKeyValues != null) { - sele += "" + n.message.nodeKeyValues + ""; - } - sele += ""; - - } - if (idx == 0 && hint == null) { - if (mwpt != null && mwpt.direct) { - sele += "beeline"; - } else { - sele += "start"; - } - sele += "Via"; - - } else if (idx == nodes.size() - 1 && hint == null) { - - sele += "end"; - sele += "Via"; - - } else { - if (mwpt != null && hint == null) { - if (mwpt.direct) { - // bNextDirect = true; - sele += "beeline"; - } else { - sele += "" + mwpt.name + ""; - } - sele += "Via"; - bNextDirect = false; - } - } - - - if (hint == null) { - bNeedHeader = (showspeed || (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway))) || - (n.message != null && n.message.nodeKeyValues != null); - if (bNeedHeader) { - sele += ""; - if (showspeed) { - double speed = 0; - if (nn != null) { - int dist = n.calcDistance(nn); - float dt = n.getTime() - nn.getTime(); - if (dt != 0.f) { - speed = ((3.6f * dist) / dt + 0.5); - } - } - sele += "" + (((int) (speed * 10)) / 10.f) + ""; - } - if (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway)) { - sele += "" + n.message.wayKeyValues + ""; - lastway = n.message.wayKeyValues; - } - if (n.message != null && n.message.nodeKeyValues != null) { - sele += "" + n.message.nodeKeyValues + ""; - } - sele += ""; - } - } - } - - if (turnInstructionMode == 2) { // locus style new - if (hint != null) { - if (mwpt != null) { - if (!mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { - sele += "" + mwpt.name + ""; - } - if (mwpt.direct && bNextDirect) { - sele += "" + hint.getLocusSymbolString() + "pass_placeShaping"; - // bNextDirect = false; - } else if (mwpt.direct) { - if (idx == 0) - sele += "pass_placeVia"; - else - sele += "pass_placeShaping"; - bNextDirect = true; - } else if (bNextDirect) { - sele += "beeline" + hint.getLocusSymbolString() + "Shaping"; - bNextDirect = false; - } else { - sele += "" + hint.getLocusSymbolString() + "Via"; - } - } else { - sele += "" + hint.getLocusSymbolString() + ""; - } - } else { - if (idx == 0 && hint == null) { - - int pos = sele.indexOf(""; - if (mwpt != null && mwpt.direct) { - bNextDirect = true; - } - sele += "pass_place"; - sele += "Via"; - - } else if (idx == nodes.size() - 1 && hint == null) { - - int pos = sele.indexOf(""; - if (bNextDirect) { - sele += "beeline"; - } - sele += "pass_place"; - sele += "Via"; - - } else { - if (mwpt != null) { - if (!mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { - sele += "" + mwpt.name + ""; - } - if (mwpt.direct && bNextDirect) { - sele += "beelinepass_placeShaping"; - } else if (mwpt.direct) { - if (idx == 0) - sele += "pass_placeVia"; - else - sele += "pass_placeShaping"; - bNextDirect = true; - } else if (bNextDirect) { - sele += "beelinepass_placeShaping"; - bNextDirect = false; - } else if (mwpt.name.startsWith("via") || - mwpt.name.startsWith("from") || - mwpt.name.startsWith("to")) { - if (bNextDirect) { - sele += "beelinepass_placeShaping"; - } else { - sele += "pass_placeVia"; - } - bNextDirect = false; - } else { - sele += "" + mwpt.name + ""; - sele += "pass_placeVia"; - } - } - } - } - } - sb.append(" ").append(sele).append("\n"); - - nn = n; - } - - sb.append(" \n"); - sb.append(" \n"); - sb.append("\n"); - - return sb.toString(); - } - - static public String formatAsGpxWaypoint(OsmNodeNamed n) { - try { - StringWriter sw = new StringWriter(8192); - BufferedWriter bw = new BufferedWriter(sw); - formatGpxHeader(bw); - formatWaypointGpx(bw, n); - formatGpxFooter(bw); - bw.close(); - sw.close(); - return sw.toString(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - static public void formatGpxHeader(BufferedWriter sb) throws IOException { - sb.append("\n"); - sb.append("\n"); - } - - static public void formatGpxFooter(BufferedWriter sb) throws IOException { - sb.append("\n"); - } - - static public void formatWaypointGpx(BufferedWriter sb, OsmNodeNamed n) throws IOException { - sb.append(" "); - if (n.getSElev() != Short.MIN_VALUE) { - sb.append("").append("" + n.getElev()).append(""); - } - if (n.name != null) { - sb.append("").append(StringUtils.escapeXml10(n.name)).append(""); - } - if (n.nodeDescription != null) { - sb.append("").append("hat desc").append(""); - } - sb.append("\n"); - } - - public void writeKml(String filename) throws Exception { - BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); - - bw.write(formatAsKml()); - bw.close(); - } - - public String formatAsKml() { - StringBuilder sb = new StringBuilder(8192); - - sb.append("\n"); - - sb.append("\n"); - sb.append(" \n"); - sb.append(" KML Samples\n"); - sb.append(" 1\n"); - sb.append(" 3.497064\n"); - sb.append(" 872\n"); - sb.append(" To enable simple instructions add: 'instructions=1' as parameter to the URL\n"); - sb.append(" \n"); - sb.append(" Paths\n"); - sb.append(" 0\n"); - sb.append(" Examples of paths.\n"); - sb.append(" \n"); - sb.append(" Tessellated\n"); - sb.append(" 0\n"); - sb.append(" tag has a value of 1, the line will contour to the underlying terrain]]>\n"); - sb.append(" \n"); - sb.append(" 1\n"); - sb.append(" "); - - for (OsmPathElement n : nodes) { - sb.append(formatILon(n.getILon())).append(",").append(formatILat(n.getILat())).append("\n"); - } - - sb.append(" \n"); - sb.append(" \n"); - sb.append(" \n"); - sb.append(" \n"); - if (exportWaypoints || !pois.isEmpty()) { - if (!pois.isEmpty()) { - sb.append(" \n"); - sb.append(" poi\n"); - for (int i = 0; i < pois.size(); i++) { - OsmNodeNamed poi = pois.get(i); - createPlaceMark(sb, poi.name, poi.ilat, poi.ilon); - } - sb.append(" \n"); - } - - if (exportWaypoints) { - int size = matchedWaypoints.size(); - createFolder(sb, "start", matchedWaypoints.subList(0, 1)); - if (matchedWaypoints.size() > 2) { - createFolder(sb, "via", matchedWaypoints.subList(1, size - 1)); - } - createFolder(sb, "end", matchedWaypoints.subList(size - 1, size)); - } - } - sb.append(" \n"); - sb.append("\n"); - - return sb.toString(); - } - - private void createFolder(StringBuilder sb, String type, List waypoints) { - sb.append(" \n"); - sb.append(" " + type + "\n"); - for (int i = 0; i < waypoints.size(); i++) { - MatchedWaypoint wp = waypoints.get(i); - createPlaceMark(sb, wp.name, wp.waypoint.ilat, wp.waypoint.ilon); - } - sb.append(" \n"); - } - - private void createPlaceMark(StringBuilder sb, String name, int ilat, int ilon) { - sb.append(" \n"); - sb.append(" " + StringUtils.escapeXml10(name) + "\n"); - sb.append(" \n"); - sb.append(" " + formatILon(ilon) + "," + formatILat(ilat) + "\n"); - sb.append(" \n"); - sb.append(" \n"); - } - public List iternity; - public void writeJson(String filename) throws Exception { - BufferedWriter bw = new BufferedWriter(new FileWriter(filename)); - - bw.write(formatAsGeoJson()); - bw.close(); - } - - - public String formatAsGeoJson() { - int turnInstructionMode = voiceHints != null ? voiceHints.turnInstructionMode : 0; - - StringBuilder sb = new StringBuilder(8192); - - sb.append("{\n"); - sb.append(" \"type\": \"FeatureCollection\",\n"); - sb.append(" \"features\": [\n"); - sb.append(" {\n"); - sb.append(" \"type\": \"Feature\",\n"); - sb.append(" \"properties\": {\n"); - sb.append(" \"creator\": \"BRouter-" + version + "\",\n"); - sb.append(" \"name\": \"").append(name).append("\",\n"); - sb.append(" \"track-length\": \"").append(distance).append("\",\n"); - sb.append(" \"filtered ascend\": \"").append(ascend).append("\",\n"); - sb.append(" \"plain-ascend\": \"").append(plainAscend).append("\",\n"); - sb.append(" \"total-time\": \"").append(getTotalSeconds()).append("\",\n"); - sb.append(" \"total-energy\": \"").append(energy).append("\",\n"); - sb.append(" \"cost\": \"").append(cost).append("\",\n"); - if (voiceHints != null && !voiceHints.list.isEmpty()) { - sb.append(" \"voicehints\": [\n"); - for (VoiceHint hint : voiceHints.list) { - sb.append(" ["); - sb.append(hint.indexInTrack); - sb.append(',').append(hint.getJsonCommandIndex()); - sb.append(',').append(hint.getExitNumber()); - sb.append(',').append(hint.distanceToNext); - sb.append(',').append((int) hint.angle); - - // not always include geometry because longer and only needed for comment style - if (turnInstructionMode == 4) { // comment style - sb.append(",\"").append(hint.formatGeometry()).append("\""); - } - - sb.append("],\n"); - } - sb.deleteCharAt(sb.lastIndexOf(",")); - sb.append(" ],\n"); - } - if (showSpeedProfile) { // set in profile - List sp = aggregateSpeedProfile(); - if (sp.size() > 0) { - sb.append(" \"speedprofile\": [\n"); - for (int i = sp.size() - 1; i >= 0; i--) { - sb.append(" [").append(sp.get(i)).append(i > 0 ? "],\n" : "]\n"); - } - sb.append(" ],\n"); - } - } - // ... traditional message list - { - sb.append(" \"messages\": [\n"); - sb.append(" [\"").append(MESSAGES_HEADER.replaceAll("\t", "\", \"")).append("\"],\n"); - for (String m : aggregateMessages()) { - sb.append(" [\"").append(m.replaceAll("\t", "\", \"")).append("\"],\n"); - } - sb.deleteCharAt(sb.lastIndexOf(",")); - sb.append(" ],\n"); - } - - if (getTotalSeconds() > 0) { - sb.append(" \"times\": ["); - DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getInstance(Locale.ENGLISH); - decimalFormat.applyPattern("0.###"); - for (OsmPathElement n : nodes) { - sb.append(decimalFormat.format(n.getTime())).append(","); - } - sb.deleteCharAt(sb.lastIndexOf(",")); - sb.append("]\n"); - } else { - sb.deleteCharAt(sb.lastIndexOf(",")); - } - - sb.append(" },\n"); - - if (iternity != null) { - sb.append(" \"iternity\": [\n"); - for (String s : iternity) { - sb.append(" \"").append(s).append("\",\n"); - } - sb.deleteCharAt(sb.lastIndexOf(",")); - sb.append(" ],\n"); - } - sb.append(" \"geometry\": {\n"); - sb.append(" \"type\": \"LineString\",\n"); - sb.append(" \"coordinates\": [\n"); - - OsmPathElement nn = null; - for (OsmPathElement n : nodes) { - String sele = n.getSElev() == Short.MIN_VALUE ? "" : ", " + n.getElev(); - if (showspeed) { // hack: show speed instead of elevation - double speed = 0; - if (nn != null) { - int dist = n.calcDistance(nn); - float dt = n.getTime() - nn.getTime(); - if (dt != 0.f) { - speed = ((3.6f * dist) / dt + 0.5); - } - } - sele = ", " + (((int) (speed * 10)) / 10.f); - } - sb.append(" [").append(formatILon(n.getILon())).append(", ").append(formatILat(n.getILat())) - .append(sele).append("],\n"); - nn = n; - } - sb.deleteCharAt(sb.lastIndexOf(",")); - - sb.append(" ]\n"); - sb.append(" }\n"); - if (exportWaypoints || !pois.isEmpty()) { - sb.append(" },\n"); - for (int i = 0; i <= pois.size() - 1; i++) { - OsmNodeNamed poi = pois.get(i); - addFeature(sb, "poi", poi.name, poi.ilat, poi.ilon); - if (i < matchedWaypoints.size() - 1) { - sb.append(","); - } - sb.append(" \n"); - } - if (exportWaypoints) { - for (int i = 0; i <= matchedWaypoints.size() - 1; i++) { - String type; - if (i == 0) { - type = "from"; - } else if (i == matchedWaypoints.size() - 1) { - type = "to"; - } else { - type = "via"; - } - - MatchedWaypoint wp = matchedWaypoints.get(i); - addFeature(sb, type, wp.name, wp.waypoint.ilat, wp.waypoint.ilon); - if (i < matchedWaypoints.size() - 1) { - sb.append(","); - } - sb.append(" \n"); - } - } - } else { - sb.append(" }\n"); - } - sb.append(" ]\n"); - sb.append("}\n"); - - return sb.toString(); - } - - private void addFeature(StringBuilder sb, String type, String name, int ilat, int ilon) { - sb.append(" {\n"); - sb.append(" \"type\": \"Feature\",\n"); - sb.append(" \"properties\": {\n"); - sb.append(" \"name\": \"" + StringUtils.escapeJson(name) + "\",\n"); - sb.append(" \"type\": \"" + type + "\"\n"); - sb.append(" },\n"); - sb.append(" \"geometry\": {\n"); - sb.append(" \"type\": \"Point\",\n"); - sb.append(" \"coordinates\": [\n"); - sb.append(" " + formatILon(ilon) + ",\n"); - sb.append(" " + formatILat(ilat) + "\n"); - sb.append(" ]\n"); - sb.append(" }\n"); - sb.append(" }"); - } - public VoiceHint getVoiceHint(int i) { if (voiceHints == null) return null; for (VoiceHint hint : voiceHints.list) { @@ -1173,123 +417,6 @@ public final class OsmTrack { return (int) (s + 0.5); } - public String getFormattedTime() { - return format1(getTotalSeconds() / 60.) + "m"; - } - - public String getFormattedTime2() { - int seconds = (int) (getTotalSeconds() + 0.5); - int hours = seconds / 3600; - int minutes = (seconds - hours * 3600) / 60; - seconds = seconds - hours * 3600 - minutes * 60; - String time = ""; - if (hours != 0) - time = "" + hours + "h "; - if (minutes != 0) - time = time + minutes + "m "; - if (seconds != 0) - time = time + seconds + "s"; - return time; - } - - SimpleDateFormat TIMESTAMP_FORMAT; - - public String getFormattedTime3(float time) { - if (TIMESTAMP_FORMAT == null) { - TIMESTAMP_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); - TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); - } - // yyyy-mm-ddThh:mm:ss.SSSZ - Date d = new Date((long) (time * 1000f)); - return TIMESTAMP_FORMAT.format(d); - } - - public String getFormattedEnergy() { - return format1(energy / 3600000.) + "kwh"; - } - - private static String formatILon(int ilon) { - return formatPos(ilon - 180000000); - } - - private static String formatILat(int ilat) { - return formatPos(ilat - 90000000); - } - - private static String formatPos(int p) { - boolean negative = p < 0; - if (negative) - p = -p; - char[] ac = new char[12]; - int i = 11; - while (p != 0 || i > 3) { - ac[i--] = (char) ('0' + (p % 10)); - p /= 10; - if (i == 5) - ac[i--] = '.'; - } - if (negative) - ac[i--] = '-'; - return new String(ac, i + 1, 11 - i); - } - - private String format1(double n) { - String s = "" + (long) (n * 10 + 0.5); - int len = s.length(); - return s.substring(0, len - 1) + "." + s.charAt(len - 1); - } - - public void dumpMessages(String filename, RoutingContext rc) throws Exception { - BufferedWriter bw = filename == null ? null : new BufferedWriter(new FileWriter(filename)); - writeMessages(bw, rc); - } - - public void writeMessages(BufferedWriter bw, RoutingContext rc) throws Exception { - dumpLine(bw, MESSAGES_HEADER); - for (String m : aggregateMessages()) { - dumpLine(bw, m); - } - if (bw != null) - bw.close(); - } - - private void dumpLine(BufferedWriter bw, String s) throws Exception { - if (bw == null) { - System.out.println(s); - } else { - bw.write(s); - bw.write("\n"); - } - } - - public void readGpx(String filename) throws Exception { - File f = new File(filename); - if (!f.exists()) - return; - BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f))); - - for (; ; ) { - String line = br.readLine(); - if (line == null) - break; - - int idx0 = line.indexOf("= 0) { - idx0 += 12; - int idx1 = line.indexOf('"', idx0); - int ilon = (int) ((Double.parseDouble(line.substring(idx0, idx1)) + 180.) * 1000000. + 0.5); - int idx2 = line.indexOf(" lat=\""); - if (idx2 < 0) - continue; - idx2 += 6; - int idx3 = line.indexOf('"', idx2); - int ilat = (int) ((Double.parseDouble(line.substring(idx2, idx3)) + 90.) * 1000000. + 0.5); - nodes.add(OsmPathElement.create(ilon, ilat, (short) 0, null, false)); - } - } - br.close(); - } - public boolean equalsTrack(OsmTrack t) { if (nodes.size() != t.nodes.size()) return false;