1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
package tim.prune.save.xml;
import java.io.IOException;
import java.io.OutputStreamWriter;
import tim.prune.config.ColourUtils;
import tim.prune.data.Coordinate;
import tim.prune.data.DataPoint;
import tim.prune.data.Timestamp;
import tim.prune.data.Track;
import tim.prune.data.TrackInfo;
import tim.prune.data.UnitSetLibrary;
/** KmlWriter for version 2.2 */
public class KmlWriter22 extends KmlWriter
{
public KmlWriter22(TrackInfo inTrackInfo, KmlExportOptions inOptions, ProgressUpdater inUpdater) {
super(inTrackInfo, inOptions, inUpdater);
}
/** Xml 2.2 header with gx extension */
protected void writeXmlHeader(OutputStreamWriter inWriter) throws IOException
{
inWriter.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<kml xmlns=\"http://earth.google.com/kml/2.2\" xmlns:gx=\"http://www.google.com/kml/ext/2.2\">\n");
}
/**
* Write out the track using Google's KML Extensions such as gx:Track
* @param inWriter writer object to write to
* @param inAbsoluteAltitudes true to use absolute altitudes, false to clamp to ground
* @param inSelStart start index of selection, or -1 if whole track
* @param inSelEnd end index of selection, or -1 if whole track
* @return number of track points written
*/
protected int writeTrack(OutputStreamWriter inWriter, boolean inAbsoluteAltitudes,
int inSelStart, int inSelEnd)
throws IOException
{
int numSaved = 0;
// 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>cc" + reverseRGB(ColourUtils.makeHexCode(_exportOptions.getTrackColour())) + "</color>\n"
+ "\t\t\t\t<width>4</width>\n\t\t\t</LineStyle>\n"
+ "\t\t</Style>\n\t\t<gx:Track>\n";
if (inAbsoluteAltitudes) {
trackStart += "\t\t\t<extrude>1</extrude>\n\t\t\t<altitudeMode>absolute</altitudeMode>\n";
}
else {
trackStart += "\t\t\t<altitudeMode>clampToGround</altitudeMode>\n";
}
String trackEnd = "\n\t\t</gx:Track>\n\t</Placemark>\n";
boolean justSelection = _exportOptions.getExportJustSelection();
// Start segment
inWriter.write(trackStart);
StringBuilder whenList = new StringBuilder();
StringBuilder coordList = new StringBuilder();
// Loop over track points
final Track track = _trackInfo.getTrack();
boolean firstTrackpoint = true;
final int numPoints = track.getNumPoints();
for (int i=0; i<numPoints; i++)
{
DataPoint point = track.getPoint(i);
boolean writeCurrentPoint = !justSelection || (i>=inSelStart && i<=inSelEnd);
if (!point.isWaypoint() && writeCurrentPoint)
{
// start new track segment if necessary
if (point.getSegmentStart() && !firstTrackpoint)
{
inWriter.write(whenList.toString());
inWriter.write('\n');
inWriter.write(coordList.toString());
inWriter.write('\n');
inWriter.write(trackEnd);
whenList.setLength(0); coordList.setLength(0);
inWriter.write(trackStart);
}
if (point.getPhoto() == null)
{
// Add timestamp (if any) to the list
whenList.append("<when>");
if (point.hasTimestamp()) {
whenList.append(point.getTimestamp().getText(Timestamp.Format.ISO8601, null));
}
whenList.append("</when>\n");
// Add coordinates to the list
coordList.append("<gx:coord>");
coordList.append(point.getLongitude().output(Coordinate.Format.DECIMAL_FORCE_POINT)).append(' ');
coordList.append(point.getLatitude().output(Coordinate.Format.DECIMAL_FORCE_POINT)).append(' ');
if (point.hasAltitude()) {
coordList.append(point.getAltitude().getStringValue(UnitSetLibrary.UNITS_METRES));
}
else {
coordList.append('0');
}
coordList.append("</gx:coord>\n");
numSaved++;
firstTrackpoint = false;
}
}
}
// end segment
inWriter.write(whenList.toString());
inWriter.write('\n');
inWriter.write(coordList.toString());
inWriter.write('\n');
inWriter.write(trackEnd);
return numSaved;
}
}
|