2 * Copyright © 2010 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
18 package org.altusmetrum.altoslib_9;
23 class KMLWriter extends PrintWriter {
24 public PrintWriter printf(String format, Object ... arguments) {
25 return printf(Locale.ROOT, format, arguments);
28 public KMLWriter(File name) throws FileNotFoundException {
33 public class AltosKML implements AltosWriter {
37 int flight_state = -1;
38 AltosState prev = null;
39 double gps_start_altitude;
41 static final String[] kml_state_colors = {
42 "FF000000", // startup
51 "FFFFFFFF", // invalid
52 "FFFF0000", // stateless
55 static String state_color(int state) {
56 if (state < 0 || kml_state_colors.length <= state)
57 return kml_state_colors[AltosLib.ao_flight_invalid];
58 return kml_state_colors[state];
61 static final String kml_header_start =
62 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
63 "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n" +
65 " <name>AO Flight#%d S/N: %03d</name>\n" +
67 static final String kml_header_end =
71 static final String kml_style_start =
72 " <Style id=\"ao-flightstate-%s\">\n" +
73 " <LineStyle><color>%s</color><width>4</width></LineStyle>\n" +
77 static final String kml_style_end =
79 " </BalloonStyle>\n" +
82 static final String kml_placemark_start =
84 " <name>%s</name>\n" +
85 " <styleUrl>#ao-flightstate-%s</styleUrl>\n" +
87 " <tessellate>1</tessellate>\n" +
88 " <altitudeMode>absolute</altitudeMode>\n" +
91 static final String kml_coord_fmt =
92 " %.7f,%.7f,%.7f <!-- alt %12.7f time %12.7f sats %d -->\n";
94 static final String kml_placemark_end =
99 static final String kml_footer =
103 void start (AltosState record) {
104 out.printf(kml_header_start, record.flight, record.serial);
105 out.printf("Date: %04d-%02d-%02d\n",
106 record.gps.year, record.gps.month, record.gps.day);
107 out.printf("Time: %2d:%02d:%02d\n",
108 record.gps.hour, record.gps.minute, record.gps.second);
109 out.printf("%s", kml_header_end);
112 boolean started = false;
114 void state_start(AltosState state) {
115 String state_name = AltosLib.state_name(state.state());
116 String state_color = state_color(state.state());
117 out.printf(kml_style_start, state_name, state_color);
118 out.printf("\tState: %s\n", state_name);
119 out.printf("%s", kml_style_end);
120 out.printf(kml_placemark_start, state_name, state_name);
123 void state_end(AltosState state) {
124 out.printf("%s", kml_placemark_end);
127 void coord(AltosState state) {
128 AltosGPS gps = state.gps;
131 if (state.height() != AltosLib.MISSING)
132 altitude = state.height() + gps_start_altitude;
135 out.printf(kml_coord_fmt,
137 altitude, (double) gps.alt,
138 state.time, gps.nsat);
142 out.printf("%s", kml_footer);
145 public void close() {
157 public void write(AltosState state) {
158 AltosGPS gps = state.gps;
163 if (gps.lat == AltosLib.MISSING)
165 if (gps.lon == AltosLib.MISSING)
170 gps_start_altitude = gps.alt;
172 if (prev != null && prev.gps_sequence == state.gps_sequence)
174 if (state.state() != flight_state) {
175 flight_state = state.state();
186 public void write(AltosStateIterable states) {
187 for (AltosState state : states) {
188 if ((state.set & AltosState.set_gps) != 0)
193 public AltosKML(File in_name) throws FileNotFoundException {
195 out = new KMLWriter(name);
198 public AltosKML(String in_string) throws FileNotFoundException {
199 this(new File(in_string));