--- dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/osrm/OSRMHelper.java 2015/09/29 09:29:13 2731 +++ dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/osrm/OSRMHelper.java 2015/09/29 18:01:33 2735 @@ -1,20 +1,23 @@ package dk.daoas.fulddaekning.osrm; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; -import java.util.logging.Level; -import java.util.logging.Logger; - - -import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.nio.client.CloseableHttpPipeliningClient; import org.apache.http.impl.nio.client.HttpAsyncClients; import org.apache.http.util.EntityUtils; @@ -23,35 +26,35 @@ import dk.daoas.fulddaekning.Adresse; import dk.daoas.fulddaekning.HttpUtil; -import dk.daoas.fulddaekning.LookupWorker; + public class OSRMHelper { - + final static Logger logger = Logger.getLogger( OSRMHelper.class.toString() ); - + Gson gson = new Gson(); - + final String host = "10.30.2.61"; final int port = 5000; final String base_url = "http://" + host + ":" + port; public Adresse getNearestViaTable(Adresse a1, Collection haystack) { - + Adresse bedsteAdresse = null; - + Adresse hayArray[] = new Adresse[ haystack.size() ]; haystack.toArray(hayArray); - + StringBuilder sb = new StringBuilder(); sb.append(base_url); sb.append("/table?loc=").append(a1.latitude).append(",").append(a1.longitude); - + for(int i = 0; i haystack) { + int bedsteAfstand = Integer.MAX_VALUE; + Adresse bedsteAdresse = null; - + try (CloseableHttpClient httpclient = HttpClients.createDefault()) { + + String loc1 = a1.latitude + "," + a1.longitude; + + + for(Adresse a2: haystack) { + String loc2 = a2.latitude + "," + a2.longitude; + + String uri = base_url + "/viaroute?loc=" + loc1 + "&loc=" + loc2 + "&geometry=false&instructions=false&alt=false"; + + HttpGet httpget = new HttpGet(uri); + + ResponseHandler responseHandler = new ResponseHandler() { + + @Override + public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException { + int status = response.getStatusLine().getStatusCode(); + + if (status >= 200 && status < 300) { + HttpEntity entity = response.getEntity(); + return entity != null ? EntityUtils.toString(entity) : null; + } else { + throw new ClientProtocolException("Unexpected response status: " + status); + } + } + + }; + String responseBody = httpclient.execute(httpget, responseHandler); + + OSRMResponse res = gson.fromJson(responseBody, OSRMResponse.class); + + + + if (res.status != 0) { + System.out.println("OSRM Returned " + res.status + "/" + res.status_message ); + continue; + } + + + if (res.route_summary.total_distance < bedsteAfstand) { + bedsteAfstand = res.route_summary.total_distance; + bedsteAdresse = a2; + } + + } + + } catch (Exception e) { + logger.log(Level.SEVERE, "Lookup failed", e); + } + return bedsteAdresse; } + public Adresse getNearestPipeline(Adresse a1, Collection haystack) { - + int bedsteAfstand = Integer.MAX_VALUE; Adresse bedsteAdresse = null; @@ -90,61 +151,58 @@ haystack.toArray(hayArray); - try (CloseableHttpPipeliningClient httpclient = HttpAsyncClients.createPipelining(); ) { - httpclient.start(); + try (CloseableHttpPipeliningClient httpclient = HttpAsyncClients.createPipelining(); ) { + httpclient.start(); - HttpHost targetHost = new HttpHost(host, port); + HttpHost targetHost = new HttpHost(host, port); - System.out.println("1>" + targetHost.toString() ); - System.out.println("2>" + targetHost.toURI() ); + System.out.println("1>" + targetHost.toString() ); + System.out.println("2>" + targetHost.toURI() ); - List requests = new ArrayList(); + List requests = new ArrayList(); - String loc1 = a1.latitude + "," + a1.longitude; + String loc1 = a1.latitude + "," + a1.longitude; - //for (int i=0; i> future = httpclient.execute(targetHost, requests, null); - List responses = future.get(); - HttpResponse respArr[] = new HttpResponse[ responses.size() ]; - responses.toArray( respArr ); + Future> future = httpclient.execute(targetHost, requests, null); + List responses = future.get(); - for (int i=0; i haystack) { int bedsteAfstand = Integer.MAX_VALUE; Adresse bedsteAdresse = null; - + Iterator it = haystack.iterator(); while (it.hasNext()) { Adresse a2 = it.next(); - + try { OSRMResponse res = getRoute(a1, a2); @@ -165,8 +223,8 @@ System.out.println("OSRM Returned " + res.status + "/" + res.status_message ); continue; } - - + + if (res.route_summary.total_distance < bedsteAfstand) { bedsteAfstand = res.route_summary.total_distance; bedsteAdresse = a2; @@ -175,23 +233,23 @@ System.out.println( e.getMessage() ); System.exit(1); } - + } - + return bedsteAdresse; } - + public OSRMResponse getRoute(Adresse a1, Adresse a2) throws IOException { - + String loc1 = a1.latitude + "," + a1.longitude; String loc2 = a2.latitude + "," + a2.longitude; - + String params = "loc=" + loc1 + "&loc=" + loc2 + "&geometry=false&instructions=false&alt=false"; - + String url = base_url + "/viaroute?" + params; - + String txtResponse = HttpUtil.getContentString(url, 500, "UTF-8"); - + return gson.fromJson(txtResponse, OSRMResponse.class); } }