import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
-import javax.swing.filechooser.FileFilter;
+import tim.prune.Config;
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
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;
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);
*/
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());
{
// 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())
{
// 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;
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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<kml xmlns=\"http://earth.google.com/kml/2.1\">\n<Folder>\n");
inWriter.write("\t<name>");
if (_descriptionField != null && _descriptionField.getText() != null && !_descriptionField.getText().equals(""))
}
inWriter.write("</name>\n");
+ boolean exportAltitudes = _altitudesCheckbox.isSelected();
int i = 0;
DataPoint point = null;
boolean hasTrackpoints = false;
// 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)
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<Placemark>\n\t\t<name>track</name>\n\t\t<Style>\n\t\t\t<LineStyle>\n"
+ // Set up strings for start and end of track segment
+ String trackStart = "\t<Placemark>\n\t\t<name>track</name>\n\t\t<Style>\n\t\t\t<LineStyle>\n"
+ "\t\t\t\t<color>cc0000cc</color>\n\t\t\t\t<width>4</width>\n\t\t\t</LineStyle>\n"
- + "\t\t</Style>\n\t\t<LineString>\n\t\t\t<coordinates>");
+ + "\t\t\t<PolyStyle><color>33cc0000</color></PolyStyle>\n"
+ + "\t\t</Style>\n\t\t<LineString>\n";
+ if (exportAltitudes) {
+ trackStart += "\t\t\t<extrude>1</extrude>\n\t\t\t<altitudeMode>absolute</altitudeMode>\n";
+ }
+ trackStart += "\t\t\t<coordinates>";
+ String trackEnd = "\t\t\t</coordinates>\n\t\t</LineString>\n\t</Placemark>";
+
+ // Start segment
+ inWriter.write(trackStart);
// Loop over track points
+ boolean firstTrackpoint = true;
for (i=0; i<numPoints; i++)
{
point = _track.getPoint(i);
- if (!point.isWaypoint())
+ // start new track segment if necessary
+ if (point.getSegmentStart() && !firstTrackpoint) {
+ inWriter.write(trackEnd);
+ inWriter.write(trackStart);
+ }
+ if (!point.isWaypoint() && point.getPhoto() == null)
{
- exportTrackpoint(point, inWriter);
+ exportTrackpoint(point, inWriter, exportAltitudes);
+ firstTrackpoint = false;
}
}
- inWriter.write("\t\t\t</coordinates>\n\t\t</LineString>\n\t</Placemark>");
+ // end segment
+ inWriter.write(trackEnd);
}
inWriter.write("</Folder>\n</kml>");
return numPoints;
* 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<Placemark>\n\t\t<name>");
inWriter.write(inPoint.getWaypointName().trim());
inWriter.write("</name>\n");
- inWriter.write("\t\t<Point>\n\t\t\t<coordinates>");
+ inWriter.write("\t\t<Point>\n");
+ if (inExportAltitude && inPoint.hasAltitude()) {
+ inWriter.write("\t\t\t<altitudeMode>absolute</altitudeMode>\n");
+ }
+ inWriter.write("\t\t\t<coordinates>");
inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
inWriter.write(',');
inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
- inWriter.write(",0</coordinates>\n\t\t</Point>\n\t</Placemark>\n");
+ inWriter.write(",");
+ if (inExportAltitude && inPoint.hasAltitude()) {
+ inWriter.write("" + inPoint.getAltitude().getStringValue(Altitude.FORMAT_METRES));
+ }
+ else {
+ inWriter.write("0");
+ }
+ inWriter.write("</coordinates>\n\t\t</Point>\n\t</Placemark>\n");
}
* @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<Placemark>\n\t\t<name>");
+ "<tr><td><center>Caption for the photo</center></td></tr></table>]]></description>");
}
inWriter.write("<styleUrl>#camera_icon</styleUrl>\n");
- inWriter.write("\t\t<Point>\n\t\t\t<coordinates>");
+ inWriter.write("\t\t<Point>\n");
+ if (inExportAltitude && inPoint.hasAltitude()) {
+ inWriter.write("\t\t\t<altitudeMode>absolute</altitudeMode>\n");
+ }
+ inWriter.write("\t\t\t<coordinates>");
inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
inWriter.write(',');
inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
- inWriter.write(",0</coordinates>\n\t\t</Point>\n\t</Placemark>\n");
+ inWriter.write(",");
+ if (inExportAltitude && inPoint.hasAltitude()) {
+ inWriter.write("" + inPoint.getAltitude().getStringValue(Altitude.FORMAT_METRES));
+ }
+ else {
+ inWriter.write("0");
+ }
+ inWriter.write("</coordinates>\n\t\t</Point>\n\t</Placemark>\n");
}
* 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(',');
inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
- // Altitude not exported, locked to ground by Google Earth
- inWriter.write(",0\n");
+ // 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");
}