/**
*
*/
package at.dallermassl.josm.plugin.openvisible;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* @author cdaller
*
*/
public class OsmGpxBounds extends DefaultHandler {
private double minLat = 180.0;
private double maxLat = -180.0;
private double minLon = 90.0;
private double maxLon = -90.0;
public OsmGpxBounds() {
}
/**
* Parses the given input stream (gpx or osm file).
* @param in the stream to parse.
* @throws IOException if the file cannot be read.
* @throws SAXException if the file could not be parsed.
*/
public void parse(InputStream in) throws IOException, SAXException {
try {
SAXParserFactory.newInstance().newSAXParser().parse(in, this);
} catch (ParserConfigurationException e1) {
e1.printStackTrace(); // broken SAXException chaining
throw new SAXException(e1);
}
}
@Override
public void startElement(String ns, String lname, String qname, Attributes a) {
if (qname.equals("node") || qname.equals("trkpt")) {
double lat = Double.parseDouble(a.getValue("lat"));
double lon = Double.parseDouble(a.getValue("lon"));
minLat = Math.min(minLat, lat);
minLon = Math.min(minLon, lon);
maxLat = Math.max(maxLat, lat);
maxLon = Math.max(maxLon, lon);
}
}
/**
* Returns <code>true</code>, if the given coordinates intersect with the
* parsed min/max latitude longitude.
* @param minLat the minimum latitude.
* @param maxLat the maximum latitude.
* @param minLon the minimum longitude.
* @param maxLon the maximum longitude.
* @return <code>true</code> if the given rectangle intersects with the parsed min/max.
*/
public boolean intersects(double minLat, double maxLat, double minLon, double maxLon) {
double lat1 = Math.max(this.minLat, minLat);
double lon1 = Math.max(this.minLon, minLon);
double lat2 = Math.min(this.maxLat, maxLat);
double lon2 = Math.min(this.maxLon, maxLon);
return ((lat2-lat1) > 0) && ((lon2-lon1) > 0);
}
public static void main(String[] args) {
if(args.length < 5) {
printHelp();
return;
}
double minLat = Double.parseDouble(args[0]);
double maxLat = Double.parseDouble(args[1]);
double minLon = Double.parseDouble(args[2]);
double maxLon = Double.parseDouble(args[3]);
String[] files = new String[args.length - 4];
System.arraycopy(args, 4, files, 0, args.length - 4);
try {
File file;
for(String fileName : files) {
file = new File(fileName);
if(!file.isDirectory()
&& (file.getName().endsWith("gpx") || file.getName().endsWith("osm"))) {
OsmGpxBounds parser = new OsmGpxBounds();
parser.parse(new BufferedInputStream(new FileInputStream(file)));
if(parser.intersects(minLat, maxLat, minLon, maxLon)) {
System.out.println(file.getAbsolutePath()); // + "," + parser.minLat + "," + parser.maxLat + "," + parser.minLon + "," + parser.maxLon);
}
// System.out.println(parser.intersects(47.0555, 47.09, 15.406, 15.4737));
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
/**
*
*/
private static void printHelp() {
System.out.println(OsmGpxBounds.class.getName() + " <minLat> <maxLat> <minLon> <maxLon> <files+>");
}
}