2017-07-25 52 views
-1

我试图从我的本地立交API获取OSM数据。有四个步骤来获取OSM数据。java给字符串运行进程exe

  1. 运行的二进制文件/srv/osm3s/bin/osm3s_query
  2. 一旦osm3s_query运行时,你会看到这条消息encoding remark: Please enter your query and terminate it with CTRL+D.
  3. 输入查询<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/>
  4. 按CTRL +d并获得OSM结果

我的代码如下:

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

你有进程的输入流。你也可以得到输出流。 – Moira

+0

您应该向输出流写入您的查询。 – minus

+0

根据'Process'的Javadoc:“从1.5开始,ProcessBuilder.start()是创建Process的首选方法。” – slim

回答

0
OutputStreamWriter output = proc.getOutputStream(); 
output.write(yourQuery); 
output.write(4); // that's ctrl-d 
output.flush(); 
+0

谢谢!有用! – user2775128

0

首先 - 这是一个非常脆弱的方式来与立交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


对于运行过程中,写入其标准输入和标准输出的阅读,因为Java 1.5中,最好使用ProcessBuilder创建的一般情况下,你Process

一旦你有一个过程,你可以使用getInputStream()getOutputSteam()getErrorStream()来获得相关的流(在构建器,如果你喜欢,你可以去标准错误到标准输出)。

在读取和写入这些流时可能会陷入死锁 - 在很多情况下,您需要使用非阻塞IO类或创建单独的读写线程。

+0

感谢您的回答。由于某些特殊原因,不允许通过HTTP进行查询。我接受了你的建议'ProcessBuilder.start()'和'getOutputSteam()'。 – user2775128

相关问题