我试图从我的本地立交桥API获取OSM数据。获取OSM数据有四个步骤。
/srv/osm3s/bin/osm3s_query
encoding remark: Please enter your query and terminate it with CTRL+D.
<query type="node"><bbox-query n="51.0" s="50.9" w="6.9" e="7.0"/><has-kv k="amenity" v="pub"/></query><print/>
我的代码如下:
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("/srv/osm3s/bin/osm3s_query");
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ( (line = br.readLine()) != null)
System.out.println(line);
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
在显示消息encoding remark: Please enter your query and terminate it with CTRL+D.
后,该过程将在第2步挂起。我不知道如何给进程提供查询字符串。
有人有想法吗?
答案 0 :(得分:0)
OutputStreamWriter output = proc.getOutputStream();
output.write(yourQuery);
output.write(4); // that's ctrl-d
output.flush();
答案 1 :(得分:0)
首先 - 这是一种与Overpass API交互的非常脆弱的方式。由于Overpass是一个XML-over-HTTP API,并且Java有许多XML和HTTP库,因此在本机Java中有很多方法可以做到这一点。 OpenStreetMap提供了示例 - 例如http://wiki.openstreetmap.org/wiki/Java_Access_Example
这比调用外部命令更容易,也更强大。
还有更高级别的Java库:http://wiki.openstreetmap.org/wiki/Frameworks
对于运行进程,写入stdin并从stdout读取的一般情况,从Java 1.5开始,最好使用npm
来创建ProcessBuilder
。
完成流程后,您可以使用Process
,getInputStream()
和getOutputSteam()
来获取相关的流(在构建器中,如果您愿意,可以让stderr转到stdout )。
在读取和编写这些流时可能会陷入死锁 - 在许多情况下,您需要使用非阻塞IO类或创建单独的线程来进行读写。