// Created by plusminus on 13:23:45 - 21.09.2008
package org.osmdroid.contributor.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Formatter;
import java.util.List;
import org.osmdroid.contributor.util.constants.OpenStreetMapContributorConstants;
/**
* Class capable of formatting a List of Points to the GPX 1.1 format.
*
* @author Nicolas Gramlich
*
*/
public class RecordedRouteGPXFormatter implements OpenStreetMapContributorConstants {
// ===========================================================
// Constants
// ===========================================================
private static final String XML_VERSION = "<?xml version=\"1.0\"?>";
private static final String GPX_VERSION = "1.1";
private static final String GPX_TAG = "<gpx version=\""
+ GPX_VERSION
+ "\" creator=\"%s\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.topografix.com/GPX/1/1\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">";
private static final String GPX_TAG_CLOSE = "</gpx>";
private static final String GPX_TAG_TIME = "<time>%s</time>";
private static final String GPX_TAG_TRACK = "<trk>";
private static final String GPX_TAG_TRACK_CLOSE = "</trk>";
private static final String GPX_TAG_TRACK_NAME = "<name>%s</name>";
private static final String GPX_TAG_TRACK_SEGMENT = "<trkseg>";
private static final String GPX_TAG_TRACK_SEGMENT_CLOSE = "</trkseg>";
public static final String GPX_TAG_TRACK_SEGMENT_POINT = "<trkpt lat=\"%f\" lon=\"%f\">";
public static final String GPX_TAG_TRACK_SEGMENT_POINT_CLOSE = "</trkpt>";
public static final String GPX_TAG_TRACK_SEGMENT_POINT_TIME = "<time>%s</time>";
public static final String GPX_TAG_TRACK_SEGMENT_POINT_SAT = "<sat>%d</sat>";
public static final String GPX_TAG_TRACK_SEGMENT_POINT_ELE = "<ele>%d</ele>";
private static final SimpleDateFormat formatterCompleteDateTime = new SimpleDateFormat(
"yyyyMMdd'_'HHmmss");
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
/**
* Creates a String in the following XML format:
*
* <PRE>
* <?xml version="1.0"?>
* <gpx version="1.1" creator="AndNav - http://www.andnav.org - Android Navigation System" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
* <time>2008-09-22T00:46:20Z</time>
* <trk>
* <name>plusminus--yyyyMMdd_HHmmss-yyyyMMdd_HHmmss</name>
* <trkseg>
* <trkpt lat="49.472767" lon="8.654174">
* <time>2008-09-22T00:46:20Z</time>
* </trkpt>
* <trkpt lat="49.472797" lon="8.654102">
* <time>2008-09-22T00:46:35Z</time>
* </trkpt>
* <trkpt lat="49.472802" lon="8.654185">
* <time>2008-09-22T00:46:50Z</time>
* </trkpt>
* </trkseg>
* </trk>
* </gpx>
* </PRE>
*
*/
public static String create(final List<RecordedGeoPoint> someRecords)
throws IllegalArgumentException {
if (someRecords == null)
throw new IllegalArgumentException("Records may not be null.");
if (someRecords.size() == 0)
throw new IllegalArgumentException("Records size == 0");
final StringBuilder sb = new StringBuilder();
final Formatter f = new Formatter(sb);
sb.append(XML_VERSION);
f.format(GPX_TAG, OSM_CREATOR_INFO);
f.format(GPX_TAG_TIME, Util.convertTimestampToUTCString(System.currentTimeMillis()));
sb.append(GPX_TAG_TRACK);
f.format(
GPX_TAG_TRACK_NAME,
OSM_USERNAME
+ "--"
+ formatterCompleteDateTime.format(new Date(someRecords.get(0)
.getTimeStamp()).getTime())
+ "-"
+ formatterCompleteDateTime.format(new Date(someRecords.get(
someRecords.size() - 1).getTimeStamp()).getTime()));
sb.append(GPX_TAG_TRACK_SEGMENT);
for (final RecordedGeoPoint rgp : someRecords) {
f.format(GPX_TAG_TRACK_SEGMENT_POINT, rgp.getLatitudeAsDouble(),
rgp.getLongitudeAsDouble());
f.format(GPX_TAG_TRACK_SEGMENT_POINT_TIME,
Util.convertTimestampToUTCString(rgp.getTimeStamp()));
if (rgp.mNumSatellites != NOT_SET)
f.format(GPX_TAG_TRACK_SEGMENT_POINT_SAT, rgp.mNumSatellites);
sb.append(GPX_TAG_TRACK_SEGMENT_POINT_CLOSE);
}
sb.append(GPX_TAG_TRACK_SEGMENT_CLOSE).append(GPX_TAG_TRACK_CLOSE).append(GPX_TAG_CLOSE);
return sb.toString();
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}