package uk.me.parabola.util; import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.util.Collection; import java.util.List; import uk.me.parabola.imgfmt.Utils; import uk.me.parabola.imgfmt.app.Area; import uk.me.parabola.imgfmt.app.Coord; import uk.me.parabola.log.Logger; import uk.me.parabola.mkgmap.reader.osm.Way; public class GpxCreator { private static final Logger log = Logger.getLogger(GpxCreator.class); public static String getGpxBaseName() { String tilePath = (log.threadTag() == null ? "unknown" : log.threadTag()); int tilenameStart = tilePath.lastIndexOf("/"); // check the case if the tiles are defined without path tilenameStart = (tilenameStart < 0 ? 0 : tilenameStart+1); int tilenameEnd = tilePath.lastIndexOf(".osm"); if (tilenameEnd < tilenameStart) { // the tiles do not end with .osm* // do not cut the file ending tilenameEnd = tilePath.length(); } return tilePath.substring(tilenameStart,tilenameEnd) + "/"; } private static void addTrkPoint(PrintWriter pw, int latitude, int longitude) { addGpxPoint(pw, "trkpt", latitude, longitude); } private static void addWptPoint(PrintWriter pw, int latitude, int longitude) { addGpxPoint(pw, "wpt", latitude, longitude); } private static void addTrkPoint(PrintWriter pw, Coord co) { addGpxPoint(pw, "trkpt", co); } private static void addWptPoint(PrintWriter pw, Coord co) { addGpxPoint(pw, "wpt", co); } private static void addGpxPoint(PrintWriter pw, String type, int latitude, int longitude) { pw.print("<"); pw.print(type); pw.print(" lat=\""); pw.print(Utils.toDegrees(latitude)); pw.print("\" lon=\""); pw.print(Utils.toDegrees(longitude)); pw.print("\"/>"); } private static void addGpxPoint(PrintWriter pw, String type, Coord co) { pw.print("<"); pw.print(type); pw.print(" lat=\""); pw.print(co.getLatDegrees()); pw.print("\" lon=\""); pw.print(co.getLonDegrees()); pw.print("\"/>"); } public static void createAreaGpx(String name, Area bbox) { GpxCreator.createGpx(name, bbox.toCoords()); } /** * Creates a gpx file for each way. The filename is the baseDir plus the id * of the way. * @param baseDir the base directory name * @param ways list of ways */ public static void createGpx(String baseDir, Collection<? extends Way> ways) { for (Way w : ways) { GpxCreator.createGpx(baseDir+w.getId(), w.getPoints()); } } public static void createGpx(String name, List<Coord> points) { for (int i = 0; i < 2; i++){ String fname = name + (i==0 ? "_mu":"_hp"); try { File f = new File(fname); if (f.getParentFile() != null) { f.getParentFile().mkdirs(); } PrintWriter pw = new PrintWriter(new FileWriter(fname + ".gpx")); pw.print("<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" creator=\"mkgmap\" "); pw.print("version=\"1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "); pw.print("xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\"> "); pw.print("<trk><name>"); pw.print(fname); pw.print("</name><trkseg>"); for (Coord c : points) { if (i == 0) addTrkPoint(pw, c.getLatitude(), c.getLongitude()); else addTrkPoint(pw, c); } pw.print("</trkseg></trk>"); pw.print("</gpx>"); pw.close(); } catch (Exception exp) { // only for debugging so just log log.warn("Could not create gpx file ", fname); } } } public static void createGpx(String name, List<Coord> polygonpoints, List<Coord> singlePoints) { for (int i = 0; i < 2; i++){ String fname = name + (i==0 ? "_mu":"_hp"); try { File f = new File(fname); f.getParentFile().mkdirs(); PrintWriter pw = new PrintWriter(new FileWriter(fname + ".gpx")); pw.print("<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" creator=\"mkgmap\" "); pw.print("version=\"1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "); pw.print("xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\"> "); if (singlePoints != null) { for (Coord c : singlePoints) { if (i == 0) addWptPoint(pw, c.getLatitude(), c.getLongitude()); else addWptPoint(pw, c); } } if (polygonpoints != null && polygonpoints.isEmpty() == false) { pw.print("<trk><name>"); pw.print(fname); pw.print("</name><trkseg>"); for (Coord c : polygonpoints) { if (i == 0) addTrkPoint(pw, c.getLatitude(), c.getLongitude()); else addTrkPoint(pw, c); } pw.print("</trkseg></trk>"); } pw.print("</gpx>"); pw.close(); } catch (Exception exp) { // only for debugging so just log log.warn("Could not create gpx file ", fname); } } } }