diff options
| author | Keith Packard <keithp@keithp.com> | 2014-05-22 18:46:58 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2014-05-22 18:46:58 -0700 | 
| commit | b60a3689910731d9bdb8a431a3dcc9e99f961b35 (patch) | |
| tree | b40fdb9c02fb4b79ffb76a12f55b93c56f0b4c39 /altoslib/AltosKML.java | |
| parent | 2625a464417c8475c66101757ca2c30cd6c74e0c (diff) | |
altoslib: Move CSV/KML output code to altoslib
It's sharable, so share it
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib/AltosKML.java')
| -rw-r--r-- | altoslib/AltosKML.java | 178 | 
1 files changed, 178 insertions, 0 deletions
| diff --git a/altoslib/AltosKML.java b/altoslib/AltosKML.java new file mode 100644 index 00000000..cc9a9f51 --- /dev/null +++ b/altoslib/AltosKML.java @@ -0,0 +1,178 @@ +/* + * Copyright © 2010 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altoslib_3; + +import java.io.*; + +public class AltosKML implements AltosWriter { + +	File			name; +	PrintStream		out; +	int			flight_state = -1; +	AltosState		prev = null; +	double			gps_start_altitude; + +	static final String[] kml_state_colors = { +		"FF000000", +		"FF000000", +		"FF000000", +		"FF0000FF", +		"FF4080FF", +		"FF00FFFF", +		"FFFF0000", +		"FF00FF00", +		"FF000000", +		"FFFFFFFF" +	}; + +	static final String kml_header_start = +		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + +		"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n" + +		"<Document>\n" + +		"  <name>AO Flight#%d S/N: %03d</name>\n" + +		"  <description>\n"; +	static final String kml_header_end = +		"  </description>\n" + +		"  <open>0</open>\n"; + +	static final String kml_style_start = +		"  <Style id=\"ao-flightstate-%s\">\n" + +		"    <LineStyle><color>%s</color><width>4</width></LineStyle>\n" + +		"    <BalloonStyle>\n" + +		"      <text>\n"; + +	static final String kml_style_end = +		"      </text>\n" + +		"    </BalloonStyle>\n" + +		"  </Style>\n"; + +	static final String kml_placemark_start = +		"  <Placemark>\n" + +		"    <name>%s</name>\n" + +		"    <styleUrl>#ao-flightstate-%s</styleUrl>\n" + +		"    <LineString>\n" + +		"      <tessellate>1</tessellate>\n" + +		"      <altitudeMode>absolute</altitudeMode>\n" + +		"      <coordinates>\n"; + +	static final String kml_coord_fmt = +	"        %.7f,%.7f,%.7f <!-- alt %12.7f time %12.7f sats %d -->\n"; + +	static final String kml_placemark_end = +		"      </coordinates>\n" + +		"    </LineString>\n" + +		"  </Placemark>\n"; + +	static final String kml_footer = +		"</Document>\n" + +		"</kml>\n"; + +	void start (AltosState record) { +		out.printf(kml_header_start, record.flight, record.serial); +		out.printf("Date:   %04d-%02d-%02d\n", +			   record.gps.year, record.gps.month, record.gps.day); +		out.printf("Time:     %2d:%02d:%02d\n", +			   record.gps.hour, record.gps.minute, record.gps.second); +		out.printf("%s", kml_header_end); +	} + +	boolean	started = false; + +	void state_start(AltosState state) { +		String	state_name = AltosLib.state_name(state.state); +		out.printf(kml_style_start, state_name, kml_state_colors[state.state]); +		out.printf("\tState: %s\n", state_name); +		out.printf("%s", kml_style_end); +		out.printf(kml_placemark_start, state_name, state_name); +	} + +	void state_end(AltosState state) { +		out.printf("%s", kml_placemark_end); +	} + +	void coord(AltosState state) { +		AltosGPS	gps = state.gps; +		double		altitude; + +		if (state.height() != AltosLib.MISSING) +			altitude = state.height() + gps_start_altitude; +		else +			altitude = gps.alt; +		out.printf(kml_coord_fmt, +			   gps.lon, gps.lat, +			   altitude, (double) gps.alt, +			   state.time, gps.nsat); +	} + +	void end() { +		out.printf("%s", kml_footer); +	} + +	public void close() { +		if (prev != null) { +			state_end(prev); +			end(); +			prev = null; +		} +	} + +	public void write(AltosState state) { +		AltosGPS	gps = state.gps; + +		if (gps == null) +			return; + +		if (gps.lat == AltosLib.MISSING) +			return; +		if (gps.lon == AltosLib.MISSING) +			return; +		if (!started) { +			start(state); +			started = true; +			gps_start_altitude = gps.alt; +		} +		if (prev != null && prev.gps_sequence == state.gps_sequence) +			return; +		if (state.state != flight_state) { +			flight_state = state.state; +			if (prev != null) { +				coord(state); +				state_end(prev); +			} +			state_start(state); +		} +		coord(state); +		prev = state; +	} + +	public void write(AltosStateIterable states) { +		for (AltosState state : states) { +			if ((state.set & AltosState.set_gps) != 0) +				write(state); +		} +	} + +	public AltosKML(File in_name) throws FileNotFoundException { +		name = in_name; +		out = new PrintStream(name); +	} + +	public AltosKML(String in_string) throws FileNotFoundException { +		this(new File(in_string)); +	} +} | 
