]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/save/KmlExporter.java
Version 1, September 2006
[GpsPrune.git] / tim / prune / save / KmlExporter.java
1 package tim.prune.save;
2
3 import java.io.File;
4 import java.io.FileWriter;
5 import java.io.IOException;
6 import java.io.Writer;
7
8 import javax.swing.JFileChooser;
9 import javax.swing.JFrame;
10 import javax.swing.JOptionPane;
11 import javax.swing.filechooser.FileFilter;
12
13 import tim.prune.App;
14 import tim.prune.I18nManager;
15 import tim.prune.data.Coordinate;
16 import tim.prune.data.DataPoint;
17 import tim.prune.data.Field;
18 import tim.prune.data.Track;
19
20 /**
21  * Class to export track information
22  * into a specified Kml file
23  */
24 public class KmlExporter
25 {
26         private App _app = null;
27         private JFrame _parentFrame = null;
28         private Track _track = null;
29         private JFileChooser _fileChooser = null;
30
31
32         /**
33          * Constructor giving App object, frame and track
34          * @param inApp application object to inform of success
35          * @param inParentFrame parent frame
36          * @param inTrack track object to save
37          */
38         public KmlExporter(App inApp, JFrame inParentFrame, Track inTrack)
39         {
40                 _app = inApp;
41                 _parentFrame = inParentFrame;
42                 _track = inTrack;
43         }
44
45
46         /**
47          * Show the dialog to select options and export file
48          */
49         public boolean showDialog()
50         {
51                 boolean fileSaved = false;
52                 Object description = JOptionPane.showInputDialog(_parentFrame,
53                         I18nManager.getText("dialog.exportkml.text"),
54                         I18nManager.getText("dialog.exportkml.title"),
55                         JOptionPane.QUESTION_MESSAGE, null, null, "");
56                 if (description != null)
57                 {
58                         // OK pressed, so choose output file
59                         if (_fileChooser == null)
60                                 _fileChooser = new JFileChooser();
61                         _fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
62                         _fileChooser.setFileFilter(new FileFilter() {
63                                 public boolean accept(File f)
64                                 {
65                                         return (f != null && (f.isDirectory() || f.getName().toLowerCase().endsWith(".kml")));
66                                 }
67                                 public String getDescription()
68                                 {
69                                         return "KML files";
70                                 }
71                         });
72                         _fileChooser.setAcceptAllFileFilterUsed(false);
73                         // Allow choose again if an existing file is selected
74                         boolean chooseAgain = false;
75                         do
76                         {
77                                 chooseAgain = false;
78                                 if (_fileChooser.showSaveDialog(_parentFrame) == JFileChooser.APPROVE_OPTION)
79                                 {
80                                         // OK pressed and file chosen
81                                         File file = _fileChooser.getSelectedFile();
82                                         if (!file.getName().toLowerCase().endsWith(".kml"))
83                                         {
84                                                 file = new File(file.getAbsolutePath() + ".kml");
85                                         }
86                                         // Check if file exists - if so don't overwrite
87                                         if (file.exists())
88                                         {
89                                                 JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.save.fileexists"),
90                                                         I18nManager.getText("error.save.dialogtitle"), JOptionPane.ERROR_MESSAGE);
91                                                 chooseAgain = true;
92                                         }
93                                         else
94                                         {
95                                                 if (exportFile(file, description.toString()))
96                                                 {
97                                                         fileSaved = true;
98                                                 }
99                                                 else
100                                                 {
101                                                         chooseAgain = true;
102                                                 }
103                                         }
104                                 }
105                         } while (chooseAgain);
106                 }
107                 return fileSaved;
108         }
109
110
111         /**
112          * Export the track data to the specified file with description
113          * @param inFile File object to save to
114          * @param inDescription description to use, if any
115          */
116         private boolean exportFile(File inFile, String inDescription)
117         {
118                 try
119                 {
120                         FileWriter writer = new FileWriter(inFile);
121                         writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<kml xmlns=\"http://earth.google.com/kml/2.1\">\n<Folder>\n");
122                         writer.write("\t<name>");
123                         writer.write(inDescription);
124                         writer.write("</name>\n");
125
126                         int i = 0;
127                         DataPoint point = null;
128                         boolean hasTrackpoints = false;
129                         // Loop over waypoints
130                         int numPoints = _track.getNumPoints();
131                         for (i=0; i<numPoints; i++)
132                         {
133                                 point = _track.getPoint(i);
134                                 if (point.isWaypoint())
135                                 {
136                                         exportWaypoint(point, writer);
137                                 }
138                                 else
139                                 {
140                                         hasTrackpoints = true;
141                                 }
142                         }
143                         if (hasTrackpoints)
144                         {
145                                 writer.write("\t<Placemark>\n\t\t<name>track</name>\n\t\t<Style>\n\t\t\t<LineStyle>\n"
146                                         + "\t\t\t\t<color>cc0000cc</color>\n\t\t\t\t<width>4</width>\n\t\t\t</LineStyle>\n"
147                                         + "\t\t</Style>\n\t\t<LineString>\n\t\t\t<coordinates>");
148                                 // Loop over track points
149                                 for (i=0; i<numPoints; i++)
150                                 {
151                                         point = _track.getPoint(i);
152                                         if (!point.isWaypoint())
153                                         {
154                                                 exportTrackpoint(point, writer);
155                                         }
156                                 }
157                                 writer.write("\t\t\t</coordinates>\n\t\t</LineString>\n\t</Placemark>");
158                         }
159                         writer.write("</Folder>\n</kml>");
160                         writer.close();
161                         JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("dialog.save.ok1")
162                                  + " " + numPoints + " " + I18nManager.getText("dialog.save.ok2")
163                                  + inFile.getAbsolutePath(),
164                                 I18nManager.getText("dialog.save.oktitle"), JOptionPane.INFORMATION_MESSAGE);
165                         return true;
166                 }
167                 catch (IOException ioe)
168                 {
169                         JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.save.failed") + ioe.getMessage(),
170                                 I18nManager.getText("error.save.dialogtitle"), JOptionPane.ERROR_MESSAGE);
171                 }
172                 return false;
173         }
174
175
176         /**
177          * Export the specified waypoint into the file
178          * @param inPoint waypoint to export
179          * @param inWriter writer object
180          */
181         private void exportWaypoint(DataPoint inPoint, Writer inWriter) throws IOException
182         {
183                 inWriter.write("\t<Placemark>\n\t\t<name>");
184                 inWriter.write(inPoint.getFieldValue(Field.WAYPT_NAME).trim());
185                 inWriter.write("</name>\n");
186                 inWriter.write("\t\t<Point>\n\t\t\t<coordinates>");
187                 inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
188                 inWriter.write(',');
189                 inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
190                 inWriter.write(",0</coordinates>\n\t\t</Point>\n\t</Placemark>\n");
191         }
192
193
194         /**
195          * Export the specified trackpoint into the file
196          * @param inPoint trackpoint to export
197          * @param inWriter writer object
198          */
199         private void exportTrackpoint(DataPoint inPoint, Writer inWriter) throws IOException
200         {
201                 inWriter.write(inPoint.getLongitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
202                 inWriter.write(',');
203                 inWriter.write(inPoint.getLatitude().output(Coordinate.FORMAT_DEG_WITHOUT_CARDINAL));
204                 // Altitude not exported, locked to ground by Google Earth
205                 inWriter.write(",0\n");
206         }
207 }