/**
* *****************************************************************************
* Copyright 2013 Johannes Mitlmeier
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
* ****************************************************************************
*/
package de.fub.agg2graph.input;
import de.fub.agg2graph.structs.GPSPoint;
import de.fub.agg2graph.structs.GPSSegment;
import de.fub.agg2graph.structs.GPSTrack;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
/**
* Extract data structures ({@link GPSTrack}s, {@link GPSSegment}s,
* {@link GPSPoint}s) from a gpx file.
*
* @author Johannes Mitlmeier
*
*/
public class GPXPointReaderHandler extends DefaultHandler {
private static final Logger LOG = Logger.getLogger("agg2graph");
private List<GPSTrack> tracks;
private List<GPSSegment> segments;
private List<GPSPoint> points;
public GPXPointReaderHandler() {
this.tracks = new ArrayList<GPSTrack>();
this.segments = new ArrayList<GPSSegment>();
this.points = new ArrayList<GPSPoint>();
}
@Override
public void startDocument() {
LOG.finer("startDocument");
}
@Override
public void endDocument() {
LOG.finer("endDocument");
}
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
if ("trk".equals(qName)) {
tracks.add(new GPSTrack());
}
if ("trkseg".equals(qName)) {
GPSSegment segment = new GPSSegment();
if (!tracks.isEmpty()) {
tracks.get(tracks.size() - 1).add(segment);
}
segments.add(segment);
} else if ("trkpt".equals(qName)) {
GPSPoint point = new GPSPoint();
for (int i = 0; i < atts.getLength(); i++) {
if ("lon".equals(atts.getQName(i))) {
point.setLon(Float.parseFloat(atts.getValue(i)));
} else if ("lat".equals(atts.getQName(i))) {
point.setLat(Float.parseFloat(atts.getValue(i)));
} else if ("time".equals(atts.getQName(i))) {
try {
XMLGregorianCalendar newXMLGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(atts.getValue(i));
point.setTimestamp(newXMLGregorianCalendar.toGregorianCalendar().getTime());
} catch (DatatypeConfigurationException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
}
points.add(point);
if (!segments.isEmpty()) {
segments.get(segments.size() - 1).add(point);
}
}
}
public List<GPSPoint> getPoints() {
return points;
}
public List<GPSSegment> getSegments() {
return segments;
}
public List<GPSTrack> getTracks() {
return tracks;
}
}