package org.openstreetmap.josm.plugins.piclayer.layer.kml;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class KMLReader {
private List<KMLGroundOverlay> groundOverlays;
private File file;
public KMLReader(File file) {
this.file = file;
}
public void process() {
KMLHandler handler = new KMLHandler();
try {
XMLReader xr = XMLReaderFactory.createXMLReader();
xr.setContentHandler(handler);
xr.parse(new InputSource(new FileReader(file)));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
groundOverlays = handler.getResult();
}
public List<KMLGroundOverlay> getGroundOverlays() {
return groundOverlays;
}
}
class KMLHandler extends DefaultHandler {
private boolean inGroundOverlay = false;
private boolean inIcon = false;
private boolean inLatLonBox = false;
private String value;
private List<KMLGroundOverlay> result;
private KMLGroundOverlay overlay;
KMLHandler() {
result = new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("GroundOverlay".equals(localName)) {
inGroundOverlay = true;
overlay = new KMLGroundOverlay();
} else if (inGroundOverlay && "Icon".equals(localName)) {
inIcon = true;
} else if (inGroundOverlay && "LatLonBox".equals(localName)) {
inLatLonBox = true;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (inGroundOverlay && "name".equals(localName)) {
overlay.setName(value.trim());
} else if (inIcon && "href".equals(localName)) {
overlay.setFileName(value.trim());
} else if (inLatLonBox && "north".equals(localName)) {
overlay.setNorth(Double.valueOf(value.trim()));
} else if (inLatLonBox && "east".equals(localName)) {
overlay.setEast(Double.valueOf(value.trim()));
} else if (inLatLonBox && "south".equals(localName)) {
overlay.setSouth(Double.valueOf(value.trim()));
} else if (inLatLonBox && "west".equals(localName)) {
overlay.setWest(Double.valueOf(value.trim()));
} else if (inLatLonBox && "rotation".equals(localName)) {
overlay.setRotate(Double.valueOf(value.trim()));
} else if (inLatLonBox && "LatLonBox".equals(localName)) {
inLatLonBox = false;
} else if (inIcon && "Icon".equals(localName)) {
inIcon = false;
} else if (inGroundOverlay && "GroundOverlay".equals(localName)) {
inGroundOverlay = false;
result.add(overlay);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
value = new String(ch, start, length);
}
public List<KMLGroundOverlay> getResult() {
return result;
}
}