package osm.jp.api; import java.net.*; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.io.*; /** * Java HTTP クライアントサンプル - HttpURLConnection 版 - * * @author 68user http://X68000.q-e-d.net/~68user/ */ public class HttpPOST { //public static String host = "http://api06.dev.openstreetmap.org"; //public static String host = "http://api.openstreetmap.org"; public static String host = "http://overpass-api.de"; public static void main(String[] args) throws MalformedURLException, ProtocolException, IOException { double minlat = 35.13d; double maxlat = 35.66d; double minlon = 138.99d; double maxlon = 139.79d; getCapabilities(new File("output.xml"), "highway", "bus_stop", minlat, maxlat, minlon, maxlon); getCapabilities(new File("output.xml"), "highway", "disused:bus_stop", minlat, maxlat, minlon, maxlon); getCapabilities(new File("output.xml"), "amenity", "bus_station", minlat, maxlat, minlon, maxlon); getCapabilities(new File("output.xml"), "public_transport", "platform", minlat, maxlat, minlon, maxlon); getCapabilities(new File("output.xml"), "public_transport", "stop_position", minlat, maxlat, minlon, maxlon); } public static void getCapabilities(File oFile, String key, String value, double minLat, double maxLat, double minLon, double maxLon) throws MalformedURLException, ProtocolException, IOException { if (oFile.isFile()) { oFile.delete(); } BufferedWriter hw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(oFile), "UTF-8")); getCapabilities(hw, key, value, minLat, maxLat, minLon, maxLon); hw.close(); } public static void getCapabilities(BufferedWriter hw, String key, String value, double minLat, double maxLat, double minLon, double maxLon) throws MalformedURLException, ProtocolException, IOException { System.out.println(host + "/api/interpreter"); URL url = new URL(host + "/api/interpreter"); int responsecode = 0; do { HttpURLConnection urlconn = (HttpURLConnection)url.openConnection(); urlconn.setRequestMethod("POST"); urlconn.setDoOutput(true); // POSTのデータを後ろに付ける urlconn.setInstanceFollowRedirects(false); // 勝手にリダイレクトさせない urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3"); urlconn.setRequestProperty("Content-Type","text/xml;charset=utf-8"); urlconn.connect(); // 送信 PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(urlconn.getOutputStream(), "utf-8"))); outputWriter(pw, "<osm-script timeout=\"900\" element-limit=\"1073741824\">"); outputWriter(pw, " <union>"); outputWriter(pw, " <query type=\"node\">"); outputWriter(pw, " <has-kv k=\""+ key +"\" v=\""+ value +"\"/>"); outputWriter(pw, " <bbox-query s=\"" + minLon + "\" n=\"" + maxLon + "\" w=\"" + minLat + "\" e=\"" + maxLat + "\"/>"); outputWriter(pw, " </query>"); outputWriter(pw, " </union>"); outputWriter(pw, " <print/>"); outputWriter(pw, "</osm-script>"); pw.close(); // closeで送信完了 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) {} responsecode = urlconn.getResponseCode(); System.out.println("レスポンスコード[" + responsecode + "] " + "レスポンスメッセージ[" + urlconn.getResponseMessage() + "]"); Map<String,List<String>> headers = urlconn.getHeaderFields(); for (Map.Entry<String, List<String>> bar : headers.entrySet()) { System.out.print("\t" + bar.getKey() +"\t: "); // キーを取得 List<String> vals = bar.getValue(); // 値を取得 for(String str : vals) { System.out.print("["+ str +"],"); } System.out.println(); } if ((responsecode == 429) || (responsecode == 504) || (responsecode == 500)) { // レスポンスコード[429] レスポンスメッセージ[Too Many Requests] // レスポンスコード[500] レスポンスメッセージ[Internal server error] // レスポンスコード[504] レスポンスメッセージ[Gateway Timeout] try { TimeUnit.MINUTES.sleep(5); } catch (InterruptedException e) {} } else { System.out.println("\n---- ボディ ----"); BufferedReader reader = new BufferedReader(new InputStreamReader(urlconn.getInputStream(), "UTF-8")); while (true) { String line = reader.readLine(); if (line == null) { break; } hw.write(line); hw.newLine(); } reader.close(); } urlconn.disconnect(); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) {} } while ((responsecode == 429) || (responsecode == 504)); } public static void outputWriter(PrintWriter pw, String text) { System.out.println("\t" + text); pw.print(text); } }