package com.robert.maps.applib.kml.XMLparser; import java.util.Date; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.robert.maps.applib.kml.PoiManager; import com.robert.maps.applib.kml.Track; import com.robert.maps.applib.utils.Ut; public class GpxTrackParser extends DefaultHandler { private StringBuilder builder; private PoiManager mPoiManager; private Track mTrack; private String mTrackName = "Track"; private Date mTrackTime = new Date(); private static final String TRK = "trk"; private static final String LAT = "lat"; private static final String LON = "lon"; private static final String NAME = "name"; private static final String CMT = "cmt"; private static final String DESC = "desc"; private static final String POINT = "trkpt"; private static final String ELE = "ele"; private static final String TIME = "time"; private static final String EMPTY = ""; public GpxTrackParser(PoiManager poiManager) { super(); builder = new StringBuilder(); mPoiManager = poiManager; mTrack = null; } @Override public void characters(char[] ch, int start, int length) throws SAXException { builder. append(ch, start, length); super.characters(ch, start, length); } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { builder.delete(0, builder.length()); if(localName.equalsIgnoreCase(TRK)) { mTrack = new Track(); mTrack.Date = mTrackTime; } else if(localName.equalsIgnoreCase(POINT)){ mTrack.AddTrackPoint(); mTrack.LastTrackPoint.lat = Double.parseDouble(attributes.getValue(LAT)); mTrack.LastTrackPoint.lon = Double.parseDouble(attributes.getValue(LON)); } super.startElement(uri, localName, name, attributes); } @Override public void endElement(String uri, String localName, String name) throws SAXException { if(localName.equalsIgnoreCase(TRK)){ if(mTrack.Name.equalsIgnoreCase(EMPTY)) mTrack.Name = mTrackName; mTrack.CalculateStat(); mPoiManager.updateTrack(mTrack); } else if(localName.equalsIgnoreCase(NAME)) { if(mTrack != null) mTrack.Name = builder.toString().trim(); else mTrackName = builder.toString().trim(); } else if(localName.equalsIgnoreCase(CMT)) { if(mTrack != null) mTrack.Descr = builder.toString().trim(); } else if(localName.equalsIgnoreCase(DESC)) { if(mTrack != null && mTrack.Descr.equals(EMPTY)) mTrack.Descr = builder.toString().trim(); } else if (localName.equalsIgnoreCase(ELE)) { if(mTrack.LastTrackPoint != null && !builder.toString().equalsIgnoreCase(EMPTY)) mTrack.LastTrackPoint.alt = Double.parseDouble(builder.toString().trim()); } else if (localName.equalsIgnoreCase(TIME)) { if(mTrack != null) { if(mTrack.LastTrackPoint != null && !builder.toString().equalsIgnoreCase(EMPTY)) mTrack.LastTrackPoint.date = Ut.ParseDate(builder.toString().trim()); } else { mTrackTime = Ut.ParseDate(builder.toString().trim()); } } super.endElement(uri, localName, name); } }