package com.robert.maps.applib.kml.XMLparser;
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;
public class KmlTrackParser extends DefaultHandler {
private StringBuilder builder;
private PoiManager mPoiManager;
private Track mTrack;
private String [] mStrArray;
private String [] mStrArray2;
private boolean mItIsTrack;
private static final String Placemark = "Placemark";
private static final String LineString = "LineString";
private static final String NAME = "name";
private static final String coordinates = "coordinates";
private static final String description = "description";
public KmlTrackParser(PoiManager poiManager) {
super();
builder = new StringBuilder();
mPoiManager = poiManager;
mTrack = new Track();
mItIsTrack = false;
}
@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(Placemark)){
mTrack = new Track();
mItIsTrack = false;
}
super.startElement(uri, localName, name, attributes);
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
if(localName.equalsIgnoreCase(Placemark)){
if(mItIsTrack){
if(mTrack.Name.equalsIgnoreCase(""))
mTrack.Name = "Track";
mTrack.CalculateStat();
mPoiManager.updateTrack(mTrack);
}
} else if(localName.equalsIgnoreCase(NAME)) {
if(mTrack != null)
mTrack.Name = builder.toString().trim();
} else if(localName.equalsIgnoreCase(description)) {
if(mTrack != null)
mTrack.Descr = builder.toString().trim();
} else if(localName.equalsIgnoreCase(coordinates)) {
mStrArray = builder.toString().trim().split("\n");
if(mStrArray.length < 2)
mStrArray = builder.toString().trim().split(" ");
for(int i = 0; i < mStrArray.length; i++){
if(!mStrArray[i].trim().equals("")){
mStrArray2 = mStrArray[i].trim().split(",");
if(mTrack != null) {
mTrack.AddTrackPoint();
mTrack.LastTrackPoint.lat = Double.parseDouble(mStrArray2[1]);
mTrack.LastTrackPoint.lon = Double.parseDouble(mStrArray2[0]);
if(mStrArray2.length > 2)
try {
mTrack.LastTrackPoint.alt = Double.parseDouble(mStrArray2[2]);
} catch (NumberFormatException e) {
try {
mTrack.LastTrackPoint.alt = (double)Integer.parseInt(mStrArray2[2]);
} catch (NumberFormatException e1) {
e1.printStackTrace();
}
}
}
}
}
} else if(localName.equalsIgnoreCase(LineString)) {
mItIsTrack = true;
}
super.endElement(uri, localName, name);
}
}