我有这种方法在Java中完美运行:
public static void generateData(double lat, double lon) throws IOException {
double southLat = lat - 0.02;
double northLat = lat + 0.03;
double westLon = lon - 0.1;
double eastLon = lon + 0.1;
String urlParameters = "<osm-script output=\"xml\" timeout=\"25\">"
+ " <!-- gather results -->"
+ "<union>"
+ " <query type=\"node\">"
+ " <has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
+
" <bbox-query s=\""
+ southLat
+ "\" w=\""
+ westLon
+ "\" n=\"52.45517254183315\" e=\""
+ eastLon
+ "\"/>"
+ "</query>"
+ " <query type=\"way\">"
+ "<has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
+
" <bbox-query s=\""
+ southLat
+ "\" w=\""
+ westLon
+ "\" n=\"52.45517254183315\" e=\""
+ eastLon
+ "\"/>"
+ " </query>"
+ " </union>"
+ " <union>"
+ " <item/>"
+ " <recurse type=\"down\"/>"
+ " </union>"
+ " <print mode=\"meta\" order=\"quadtile\"/>" +
"</osm-script>";
URL url = new URL("http://overpass-api.de/api/interpreter");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(
conn.getOutputStream());
writer.write(urlParameters);
writer.flush();
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
File file = new File("route.xml");
BufferedWriter output = new BufferedWriter(new FileWriter(file));
while ((line = reader.readLine()) != null) {
output.write(line);
output.newLine();
System.out.println(line);
}
writer.close();
reader.close();
output.close();
}
当我运行它时,会创建一个名为route.xml的xml文件并保存到我的文件系统中。我可以打开它,它按照我的预期形成。
我试图在Android应用程序中使用它。上述方法不起作用,因为它返回服务器代码400(格式错误)。我浏览了一下stackoverflow并将代码调整到下面的android:
public void generateData(double lat, double lon) throws IOException {
double southLat = lat - 0.02;
double northLat = lat + 0.03;
double westLon = lon - 0.1;
double eastLon = lon + 0.1;
String urlParameters = "<osm-script output=\"xml\" timeout=\"25\">"
+ " <!-- gather results -->"
+ "<union>"
+ " <query type=\"node\">"
+ " <has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
+
" <bbox-query s=\""
+ southLat
+ "\" w=\""
+ westLon
+ "\" n=\"52.45517254183315\" e=\""
+ eastLon
+ "\"/>"
+ "</query>"
+ " <query type=\"way\">"
+ "<has-kv k=\"highway\" regv=\"(trunk|primary|secondary|tertiary|trunk|residential)\"/>"
+
" <bbox-query s=\""
+ southLat
+ "\" w=\""
+ westLon
+ "\" n=\"52.45517254183315\" e=\""
+ eastLon
+ "\"/>"
+ " </query>"
+ " </union>"
+ " <union>"
+ " <item/>"
+ " <recurse type=\"down\"/>"
+ " </union>"
+ " <print mode=\"meta\" order=\"quadtile\"/>" +
"</osm-script>";
URL url = new URL("http://overpass-api.de/api/interpreter");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(false);
conn.connect();
int status = conn.getResponseCode();
Log.e("ERROR CODE", ""+status);
OutputStreamWriter writer = new OutputStreamWriter(
conn.getOutputStream());
// http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device
writer.write(urlParameters);
Log.e("Download", "started writing");
writer.flush();
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
Log.e("Download", "got the stream ");
File file = new File(getApplication().getApplicationContext()
.getFilesDir(), "route.xml");
Log.e("Download", "Created a file to save");
BufferedWriter output = new BufferedWriter(new FileWriter(file));
while ((line = reader.readLine()) != null) {
output.write(line);
output.newLine();
System.out.println(line);
}
writer.close();
reader.close();
output.close();
System.out.println("reckon i wrote to file.");
}
这将从服务器返回400响应代码。我不明白这一点,因为我不明白如果它在android之外工作会如何变形。
我真的很感激任何帮助。
编辑:在android上运行时的堆栈跟踪是:
> `12-29 22:36:41.779: W/System.err(18702): java.net.ProtocolException: This protocol does not support input
12-29 22:36:41.781: W/System.err(18702): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:187)
12-29 22:36:41.781: W/System.err(18702): at com.running.mattboyle.runnertoolbox.RunningMap.generateData(RunningMap.java:215)
12-29 22:36:41.782: W/System.err(18702): at com.running.mattboyle.runnertoolbox.RunningMap$1.run(RunningMap.java:121)
12-29 22:36:41.782: W/System.err(18702): at java.lang.Thread.run(Thread.java:818)
`