X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fsave%2FKmlExporter.java;h=67ad261f62a5883583c2697ba4937dee7746aabf;hb=54b9d8bc8f0025ccf97a67d9dd217ef1f9cf082f;hp=11474a6c8e8fb37f911f53f3f79e51edebc5fcf4;hpb=5625a1abadb5f2ca5f017fe7dbda1d5141cb637b;p=GpsPrune.git diff --git a/tim/prune/save/KmlExporter.java b/tim/prune/save/KmlExporter.java index 11474a6..67ad261 100644 --- a/tim/prune/save/KmlExporter.java +++ b/tim/prune/save/KmlExporter.java @@ -25,33 +25,38 @@ import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JFileChooser; -import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JTextField; import javax.swing.SwingConstants; -import javax.swing.filechooser.FileFilter; +import tim.prune.App; +import tim.prune.Config; +import tim.prune.GenericFunction; import tim.prune.I18nManager; +import tim.prune.UpdateMessageBroker; +import tim.prune.data.Altitude; import tim.prune.data.Coordinate; import tim.prune.data.DataPoint; +import tim.prune.data.Field; import tim.prune.data.Track; import tim.prune.data.TrackInfo; import tim.prune.gui.ImageUtils; +import tim.prune.load.GenericFileFilter; /** * Class to export track information * into a specified Kml file */ -public class KmlExporter implements Runnable +public class KmlExporter extends GenericFunction implements Runnable { - private JFrame _parentFrame = null; private TrackInfo _trackInfo = null; private Track _track = null; private JDialog _dialog = null; private JTextField _descriptionField = null; + private JCheckBox _altitudesCheckbox = null; private JCheckBox _kmzCheckbox = null; private JCheckBox _exportImagesCheckbox = null; private JProgressBar _progressBar = null; @@ -66,27 +71,30 @@ public class KmlExporter implements Runnable /** - * Constructor giving frame and track - * @param inParentFrame parent frame - * @param inTrackInfo track info object to save + * Constructor + * @param inApp app object */ - public KmlExporter(JFrame inParentFrame, TrackInfo inTrackInfo) + public KmlExporter(App inApp) { - _parentFrame = inParentFrame; - _trackInfo = inTrackInfo; - _track = inTrackInfo.getTrack(); + super(inApp); + _trackInfo = inApp.getTrackInfo(); + _track = _trackInfo.getTrack(); } + /** Get name key */ + public String getNameKey() { + return "function.exportkml"; + } /** * Show the dialog to select options and export file */ - public void showDialog() + public void begin() { // Make dialog window including whether to compress to kmz (and include pictures) or not if (_dialog == null) { - _dialog = new JDialog(_parentFrame, I18nManager.getText("dialog.exportkml.title"), true); + _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true); _dialog.setLocationRelativeTo(_parentFrame); _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); _dialog.getContentPane().add(makeDialogComponents()); @@ -94,7 +102,7 @@ public class KmlExporter implements Runnable } enableCheckboxes(); _progressBar.setVisible(false); - _dialog.show(); + _dialog.setVisible(true); } @@ -116,6 +124,10 @@ public class KmlExporter implements Runnable descPanel.add(_descriptionField); mainPanel.add(descPanel); dialogPanel.add(mainPanel, BorderLayout.CENTER); + // Checkbox for altitude export + _altitudesCheckbox = new JCheckBox(I18nManager.getText("dialog.exportkml.altitude")); + _altitudesCheckbox.setHorizontalTextPosition(SwingConstants.LEFT); + mainPanel.add(_altitudesCheckbox); // Checkboxes for kmz export and image export _kmzCheckbox = new JCheckBox(I18nManager.getText("dialog.exportkml.kmz")); _kmzCheckbox.setHorizontalTextPosition(SwingConstants.LEFT); @@ -166,6 +178,8 @@ public class KmlExporter implements Runnable */ private void enableCheckboxes() { + boolean hasAltitudes = _track.hasData(Field.ALTITUDE); + if (!hasAltitudes) {_altitudesCheckbox.setSelected(false);} boolean hasPhotos = _trackInfo.getPhotoList() != null && _trackInfo.getPhotoList().getNumPhotos() > 0; _exportImagesCheckbox.setSelected(hasPhotos && _kmzCheckbox.isSelected()); _exportImagesCheckbox.setEnabled(hasPhotos && _kmzCheckbox.isSelected()); @@ -179,19 +193,14 @@ public class KmlExporter implements Runnable { // OK pressed, so choose output file if (_fileChooser == null) - {_fileChooser = new JFileChooser();} - _fileChooser.setDialogType(JFileChooser.SAVE_DIALOG); - _fileChooser.setFileFilter(new FileFilter() { - public boolean accept(File f) - { - return (f != null && (f.isDirectory() - || f.getName().toLowerCase().endsWith(".kml") || f.getName().toLowerCase().endsWith(".kmz"))); - } - public String getDescription() - { - return I18nManager.getText("dialog.exportkml.filetype"); - } - }); + { + _fileChooser = new JFileChooser(); + _fileChooser.setDialogType(JFileChooser.SAVE_DIALOG); + _fileChooser.setFileFilter(new GenericFileFilter("filetype.kmlkmz", new String[] {"kml", "kmz"})); + // start from directory in config which should be set + File configDir = Config.getWorkingDirectory(); + if (configDir != null) {_fileChooser.setCurrentDirectory(configDir);} + } String requiredExtension = null, otherExtension = null; if (_kmzCheckbox.isSelected()) { @@ -293,10 +302,12 @@ public class KmlExporter implements Runnable // close file writer.close(); - JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("dialog.save.ok1") - + " " + numPoints + " " + I18nManager.getText("dialog.save.ok2") - + " " + _exportFile.getAbsolutePath(), - I18nManager.getText("dialog.save.oktitle"), JOptionPane.INFORMATION_MESSAGE); + // Store directory in config for later + Config.setWorkingDirectory(_exportFile.getParentFile()); + // show confirmation + UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.save.ok1") + + " " + numPoints + " " + I18nManager.getText("confirm.save.ok2") + + " " + _exportFile.getAbsolutePath()); // export successful so need to close dialog and return _dialog.dispose(); return; @@ -326,7 +337,6 @@ public class KmlExporter implements Runnable private int exportData(OutputStreamWriter inWriter, boolean inExportImages) throws IOException { - // TODO: Look at segments of track, and split into separate lines in Kml if necessary inWriter.write("\n\n\n"); inWriter.write("\t"); if (_descriptionField != null && _descriptionField.getText() != null && !_descriptionField.getText().equals("")) @@ -339,6 +349,7 @@ public class KmlExporter implements Runnable } inWriter.write("\n"); + boolean exportAltitudes = _altitudesCheckbox.isSelected(); int i = 0; DataPoint point = null; boolean hasTrackpoints = false; @@ -352,7 +363,11 @@ public class KmlExporter implements Runnable // Make a blob for each waypoint if (point.isWaypoint()) { - exportWaypoint(point, inWriter); + exportWaypoint(point, inWriter, exportAltitudes); + } + else if (point.getPhoto() == null) + { + hasTrackpoints = true; } // Make a blob with description for each photo if (point.getPhoto() != null) @@ -363,29 +378,43 @@ public class KmlExporter implements Runnable writtenPhotoHeader = true; } photoNum++; - exportPhotoPoint(point, inWriter, inExportImages, photoNum); - } - else - { - hasTrackpoints = true; + exportPhotoPoint(point, inWriter, inExportImages, photoNum, exportAltitudes); } } // Make a line for the track, if there is one if (hasTrackpoints) { - inWriter.write("\t\n\t\ttrack\n\t\t\n\t\t\n\t\t\t"); + + "\t\t\t33cc0000\n" + + "\t\t\n\t\t\n"; + if (exportAltitudes) { + trackStart += "\t\t\t1\n\t\t\tabsolute\n"; + } + trackStart += "\t\t\t"; + String trackEnd = "\t\t\t\n\t\t\n\t"; + + // Start segment + inWriter.write(trackStart); // Loop over track points + boolean firstTrackpoint = true; for (i=0; i\n\t\t\n\t"); + // end segment + inWriter.write(trackEnd); } inWriter.write("\n"); return numPoints; @@ -396,18 +425,30 @@ public class KmlExporter implements Runnable * Export the specified waypoint into the file * @param inPoint waypoint to export * @param inWriter writer object + * @param inExportAltitude true to include altitude * @throws IOException on write failure */ - private void exportWaypoint(DataPoint inPoint, Writer inWriter) throws IOException + private void exportWaypoint(DataPoint inPoint, Writer inWriter, boolean inExportAltitude) throws IOException { inWriter.write("\t\n\t\t"); inWriter.write(inPoint.getWaypointName().trim()); inWriter.write("\n"); - inWriter.write("\t\t\n\t\t\t"); - inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); + inWriter.write("\t\t\n"); + if (inExportAltitude && inPoint.hasAltitude()) { + inWriter.write("\t\t\tabsolute\n"); + } + inWriter.write("\t\t\t"); + inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT)); inWriter.write(','); - inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); - inWriter.write(",0\n\t\t\n\t\n"); + inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT)); + inWriter.write(","); + if (inExportAltitude && inPoint.hasAltitude()) { + inWriter.write("" + inPoint.getAltitude().getStringValue(Altitude.Format.METRES)); + } + else { + inWriter.write("0"); + } + inWriter.write("\n\t\t\n\t\n"); } @@ -417,9 +458,11 @@ public class KmlExporter implements Runnable * @param inWriter writer object * @param inImageLink flag to set whether to export image links or not * @param inImageNumber number of image for filename + * @param inExportAltitude true to include altitude * @throws IOException on write failure */ - private void exportPhotoPoint(DataPoint inPoint, Writer inWriter, boolean inImageLink, int inImageNumber) + private void exportPhotoPoint(DataPoint inPoint, Writer inWriter, boolean inImageLink, + int inImageNumber, boolean inExportAltitude) throws IOException { inWriter.write("\t\n\t\t"); @@ -436,11 +479,22 @@ public class KmlExporter implements Runnable + "
Caption for the photo
]]>"); } inWriter.write("#camera_icon\n"); - inWriter.write("\t\t\n\t\t\t"); - inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); + inWriter.write("\t\t\n"); + if (inExportAltitude && inPoint.hasAltitude()) { + inWriter.write("\t\t\tabsolute\n"); + } + inWriter.write("\t\t\t"); + inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT)); inWriter.write(','); - inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); - inWriter.write(",0\n\t\t\n\t
\n"); + inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT)); + inWriter.write(","); + if (inExportAltitude && inPoint.hasAltitude()) { + inWriter.write("" + inPoint.getAltitude().getStringValue(Altitude.Format.METRES)); + } + else { + inWriter.write("0"); + } + inWriter.write("\n\t\t\n\t\n"); } @@ -448,14 +502,22 @@ public class KmlExporter implements Runnable * Export the specified trackpoint into the file * @param inPoint trackpoint to export * @param inWriter writer object + * @param inExportAltitude true to include altitude */ - private void exportTrackpoint(DataPoint inPoint, Writer inWriter) throws IOException + private void exportTrackpoint(DataPoint inPoint, Writer inWriter, boolean inExportAltitude) throws IOException { - inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); + inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT)); inWriter.write(','); - inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL)); - // Altitude not exported, locked to ground by Google Earth - inWriter.write(",0\n"); + inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DECIMAL_FORCE_POINT)); + // Altitude either absolute or locked to ground by Google Earth + inWriter.write(","); + if (inExportAltitude && inPoint.hasAltitude()) { + inWriter.write("" + inPoint.getAltitude().getStringValue(Altitude.Format.METRES)); + } + else { + inWriter.write("0"); + } + inWriter.write("\n"); } @@ -466,12 +528,12 @@ public class KmlExporter implements Runnable private void exportThumbnails(ZipOutputStream inZipStream) throws IOException { // set up image writer - Iterator writers = ImageIO.getImageWritersByFormatName("jpg"); + Iterator writers = ImageIO.getImageWritersByFormatName("jpg"); if (writers == null || !writers.hasNext()) { throw new IOException("no JPEG writer found"); } - ImageWriter imageWriter = (ImageWriter) writers.next(); + ImageWriter imageWriter = writers.next(); int numPoints = _track.getNumPoints(); DataPoint point = null;