Subversion Repositories mkgmap

Rev

Rev 4850 | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | RSS feed

package uk.me.parabola.util;

import java.awt.Shape;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Arrays;
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());
        }

        /**
         * Create gpx file(s) for java Shape.
         * @param baseDir the base directory name
         * @param shape the shape to convert
         */

        public static void createShapeGpx(String baseDir, Shape shape) {
                // have to convert to area to make sure that clockwise/counterclockwise idea works for inner/outer
                java.awt.geom.Area area = shape instanceof java.awt.geom.Area ? (java.awt.geom.Area) shape
                                : new java.awt.geom.Area(shape);
                List<List<Coord>> shapes = Java2DConverter.areaToShapes(area);
                for (int i = 0; i < shapes.size(); i++) {
                        List<Coord> points = shapes.get(i);
                        String extName = baseDir + Integer.toString(i) + "_" + (Way.clockwise(points) ? "o" : "i");
                        GpxCreator.createGpx(extName, points);
                }
        }      

        /**
         * 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, Coord... singlePoints) {
                createGpx(name, polygonpoints, Arrays.asList(singlePoints));
        }

        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()) {
                                        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);
                        }
                }
        }
}