package org.osm2world.core.osm.creation; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import org.openstreetmap.osmosis.core.misc.v0_6.EmptyReader; import org.openstreetmap.osmosis.core.task.v0_6.RunnableSource; import org.openstreetmap.osmosis.core.task.v0_6.Sink; import org.openstreetmap.osmosis.xml.common.CompressionMethod; import org.osm2world.core.map_data.creation.LatLon; public class OverpassReader extends OsmosisReader { public static final String DEFAULT_API_URL = "http://www.overpass-api.de/api/interpreter"; /** fetches data within a bounding box from Overpass API */ public OverpassReader(LatLon min, LatLon max) { this(DEFAULT_API_URL, min, max); } /** fetches data within a bounding box from any Overpass API instance */ public OverpassReader(String apiURL, LatLon min, LatLon max) { this(apiURL, "[bbox:"+min.lat+","+min.lon+","+max.lat+","+max.lon+"];(node;rel(bn)->.x;way;node(w)->.x;rel(bw););out meta;"); } /** fetches data from Overpass API according to an arbitrary query * @throws IOException */ public OverpassReader(String queryString) { this(DEFAULT_API_URL, queryString); } /** fetches data from any Overpass API instance according to an arbitrary query. * @throws IOException */ public OverpassReader(String apiURL, String queryString) { super(new OverpassSource(apiURL, queryString)); } /** * source component for an Osmosis pipeline that reads data from Overpass API */ private static class OverpassSource implements RunnableSource { private final String apiURL; private final String queryString; private Sink sink; public OverpassSource(String apiURL, String queryString) { this.apiURL = apiURL; this.queryString = queryString; } @Override public void setSink(Sink sink) { this.sink = sink; } @Override public void run() { try { URL url = new URL(apiURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); DataOutputStream printout = new DataOutputStream(connection.getOutputStream()); printout.writeBytes("data=" + URLEncoder.encode(queryString, "utf-8")); printout.flush(); printout.close(); InputStream inputStream = connection.getInputStream(); XmlStreamReader xmlReader = new XmlStreamReader(inputStream, true, CompressionMethod.None); xmlReader.setSink(sink); xmlReader.run(); inputStream.close(); } catch (IOException e) { System.err.println("could not get input data from Overpass API." + "\nQuery: " + queryString + "\nCause: "); e.printStackTrace(); EmptyReader emptyReader = new EmptyReader(); emptyReader.setSink(sink); emptyReader.run(); } } } }