/[projects]/dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/osrm/OSRMHelper.java
ViewVC logotype

Diff of /dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/osrm/OSRMHelper.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2730 by torben, Tue Sep 29 09:17:03 2015 UTC revision 2744 by torben, Wed Oct 7 19:32:00 2015 UTC
# Line 1  Line 1 
1  package dk.daoas.fulddaekning.osrm;  package dk.daoas.fulddaekning.osrm;
2    
3  import java.io.IOException;  import java.io.IOException;
4    import java.util.ArrayList;
5  import java.util.Collection;  import java.util.Collection;
6  import java.util.Iterator;  import java.util.Iterator;
 import java.util.logging.Level;  
 import java.util.logging.Logger;  
   
   
 import java.util.ArrayList;  
7  import java.util.List;  import java.util.List;
8  import java.util.concurrent.Future;  import java.util.concurrent.Future;
9    import java.util.logging.Level;
10    import java.util.logging.Logger;
11    
12    import org.apache.http.HttpEntity;
13  import org.apache.http.HttpHost;  import org.apache.http.HttpHost;
14  import org.apache.http.HttpRequest;  import org.apache.http.HttpRequest;
15  import org.apache.http.HttpResponse;  import org.apache.http.HttpResponse;
16    import org.apache.http.client.ClientProtocolException;
17    import org.apache.http.client.ResponseHandler;
18  import org.apache.http.client.methods.HttpGet;  import org.apache.http.client.methods.HttpGet;
19    import org.apache.http.impl.client.CloseableHttpClient;
20    import org.apache.http.impl.client.HttpClients;
21  import org.apache.http.impl.nio.client.CloseableHttpPipeliningClient;  import org.apache.http.impl.nio.client.CloseableHttpPipeliningClient;
22  import org.apache.http.impl.nio.client.HttpAsyncClients;  import org.apache.http.impl.nio.client.HttpAsyncClients;
23  import org.apache.http.util.EntityUtils;  import org.apache.http.util.EntityUtils;
# Line 23  import com.google.gson.Gson; Line 26  import com.google.gson.Gson;
26    
27  import dk.daoas.fulddaekning.Adresse;  import dk.daoas.fulddaekning.Adresse;
28  import dk.daoas.fulddaekning.HttpUtil;  import dk.daoas.fulddaekning.HttpUtil;
29  import dk.daoas.fulddaekning.LookupWorker;  
30    /*
31    import dk.thoerup.osrmbinding.OSRMBinding;
32    import dk.thoerup.osrmbinding.ViarouteResult;
33    */
34    
35  public class OSRMHelper {  public class OSRMHelper {
36                    
37            private static final boolean ENABLE_OSRM = false;
38    
39    
40          final static Logger logger = Logger.getLogger( OSRMHelper.class.toString() );          final static Logger logger = Logger.getLogger( OSRMHelper.class.toString() );
41            
42          Gson gson = new Gson();          Gson gson = new Gson();
           
43    
44          final String host = "10.30.2.61";          //static OSRMBinding binding = null;
45    
46            final String host = "127.0.0.1";
47          final int port = 5000;          final int port = 5000;
48          final String base_url = "http://" + host + ":" + port;          final String base_url = "http://" + host + ":" + port;
49    /*
50            private static synchronized void initOsrm() {
51                    if (binding == null) {
52                            binding = new OSRMBinding("/home/openstreetmap/denmark-latest.osrm");
53                    }
54            }
55    */
56    
57            public Adresse getNearestTableHttp(Adresse a1, Collection<Adresse> haystack) {
58    
         public Adresse getNearestViaTable(Adresse a1, Collection<Adresse> haystack) {  
                   
59                  Adresse bedsteAdresse = null;                  Adresse bedsteAdresse = null;
60                    
61                  Adresse hayArray[] = new Adresse[ haystack.size() ];                  Adresse hayArray[] = new Adresse[ haystack.size() ];
62                  haystack.toArray(hayArray);                  haystack.toArray(hayArray);
63                    
64                  StringBuilder sb = new StringBuilder();                  StringBuilder sb = new StringBuilder();
65                  sb.append(base_url);                  sb.append(base_url);
66                  sb.append("/table?loc=").append(a1.latitude).append(",").append(a1.longitude);                  sb.append("/table?loc=").append(a1.latitude).append(",").append(a1.longitude);
67                    
68                  for(int i = 0; i<hayArray.length; i++) {                  for(int i = 0; i<hayArray.length; i++) {
69                          Adresse a = hayArray[i];                          Adresse a = hayArray[i];
70                          sb.append("&loc=").append( a.latitude ).append(",").append(a.longitude);                          sb.append("&loc=").append( a.latitude ).append(",").append(a.longitude);
71                  }                  }
72                    
73                  try {                  try {
74                          String txtResponse = HttpUtil.getContentString(sb.toString(), 500, "UTF-8");                          String txtResponse = HttpUtil.getContentString(sb.toString(), 500, "UTF-8");
75                          OSRMDistanceTable table = gson.fromJson(txtResponse, OSRMDistanceTable.class);                          OSRMDistanceTable table = gson.fromJson(txtResponse, OSRMDistanceTable.class);
# Line 59  public class OSRMHelper { Line 77  public class OSRMHelper {
77                                  logger.info("OSRM failed with message: " + table.status_message);                                  logger.info("OSRM failed with message: " + table.status_message);
78                                  return null;                                  return null;
79                          }                          }
80                            
81                          int bedsteTid = Integer.MAX_VALUE;                          int bedsteTid = Integer.MAX_VALUE;
82                            
83                          for (int i = 1; i<table.distance_table.length; i++) {                          for (int i = 1; i<table.distance_table.length; i++) {
84                                  if (table.distance_table[0][i] < bedsteTid) {                                  if (table.distance_table[0][i] < bedsteTid) {
85                                          bedsteTid = table.distance_table[0][i];                                          bedsteTid = table.distance_table[0][i];
# Line 74  public class OSRMHelper { Line 92  public class OSRMHelper {
92                          logger.log(Level.SEVERE, "Lookup failed", e);                          logger.log(Level.SEVERE, "Lookup failed", e);
93                          System.exit(1);                                          System.exit(1);                
94                  }                  }
95                    
96                  //return gson.fromJson(txtResponse, OSRMResponse.class);                  //return gson.fromJson(txtResponse, OSRMResponse.class);
97                    
98                    
99                  return bedsteAdresse;                  return bedsteAdresse;
100          }          }
101    /*
102            public Adresse getNearestTableJni(Adresse a1, Collection<Adresse> haystack) {
103                    if (binding == null) {
104                            initOsrm();
105                    }
106    
         public Adresse getNearestPipeline(Adresse a1, Collection<Adresse> haystack) {  
                   
                 int bedsteAfstand = Integer.MAX_VALUE;  
107                  Adresse bedsteAdresse = null;                  Adresse bedsteAdresse = null;
108    
109                  Adresse hayArray[] = new Adresse[ haystack.size() ];                  Adresse hayArray[] = new Adresse[ haystack.size() ];
110                  haystack.toArray(hayArray);                  haystack.toArray(hayArray);
111    
112                    dk.thoerup.osrmbinding.Geopoint points[] = new dk.thoerup.osrmbinding.Geopoint[ hayArray.length + 1 ];
113                    points[0] = new dk.thoerup.osrmbinding.Geopoint( a1.latitude, a1.longitude);
114    
         try (CloseableHttpPipeliningClient httpclient = HttpAsyncClients.createPipelining(); ) {  
             httpclient.start();  
   
             HttpHost targetHost = new HttpHost(host, port);  
   
                 System.out.println("1>" + targetHost.toString() );  
                 System.out.println("2>" + targetHost.toURI() );  
115    
116                  List<HttpRequest> requests = new ArrayList<HttpRequest>();                  for(int i = 0; i<hayArray.length; i++) {
117                            Adresse a = hayArray[i];
118                        String loc1 = a1.latitude + "," + a1.longitude;                          int idx = i+1;
119                            points[idx] = new dk.thoerup.osrmbinding.Geopoint(a.latitude, a.longitude);
120                    }
121    
122                  //for (int i=0; i<hayArray.length; i++) {                  try {
123                  for (int i=0; i<2; i++) {                          float distance_table[][] = binding.table( points );
                         Adresse a2 = hayArray[i];  
                           String loc2 = a2.latitude + "," + a2.longitude;  
124    
125                            String uri = "/viaroute?loc=" + loc1 + "&loc=" + loc2 + "&geometry=false&instructions=false&alt=false";                          int bedsteTid = Integer.MAX_VALUE;
                         System.out.println( uri );  
126    
127                          requests.add( new HttpGet(uri) );                          for (int i = 1; i<distance_table.length; i++) {
128                                    if (distance_table[0][i] < bedsteTid) {
129                                            bedsteTid = (int) distance_table[0][i];
130                                            int idx = i-1;
131                                            bedsteAdresse = hayArray[idx];
132                                    }
133                            }
134    
135                    } catch (Exception e) {
136                            logger.log(Level.SEVERE, "Lookup failed", e);
137                            System.exit(1);                
138                  }                  }
139    
140                    return bedsteAdresse;
141            }*/
142            
143            public Adresse getNearestViarouteHttp(Adresse a1, Collection<Adresse> haystack) {
144                    int bedsteAfstand = Integer.MAX_VALUE;
145                    Adresse bedsteAdresse = null;
146                    
147                    try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
148                            
149                            String loc1 = a1.latitude + "," + a1.longitude;
150    
151              Future<List<HttpResponse>> future = httpclient.execute(targetHost, requests, null);                          
152              List<HttpResponse> responses = future.get();                          for(Adresse a2: haystack) {
153                                    String loc2 = a2.latitude + "," + a2.longitude;
154    
155                  HttpResponse respArr[] = new HttpResponse[ responses.size() ];                                  String uri = base_url + "/viaroute?loc=" + loc1 + "&loc=" + loc2 + "&geometry=false&instructions=false&alt=false";
156                  responses.toArray( respArr );                                  
157                                    HttpGet httpget = new HttpGet(uri);
158                                    
159                                    ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
160    
161                  for (int i=0; i<respArr.length; i++) {                          @Override
162                          String jsonBody = EntityUtils.toString( respArr[i].getEntity() );                          public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {
163                          OSRMResponse res = gson.fromJson(jsonBody, OSRMResponse.class);                              int status = response.getStatusLine().getStatusCode();
164                                
165                                if (status >= 200 && status < 300) {
166                                    HttpEntity entity = response.getEntity();
167                                    return entity != null ? EntityUtils.toString(entity) : null;
168                                } else {
169                                    throw new ClientProtocolException("Unexpected response status: " + status);
170                                }
171                            }
172    
173                        };
174                        String responseBody = httpclient.execute(httpget, responseHandler);
175                        
176                                    OSRMResponse res = gson.fromJson(responseBody, OSRMResponse.class);
177    
178                              if (res.route_summary.total_distance < bedsteAfstand) {                                  
179                                          bedsteAfstand = res.route_summary.total_distance;                      
180                                          bedsteAdresse = hayArray[i];                      if (res.status != 0) {
181                                }                                          System.out.println("OSRM Returned " + res.status + "/" + res.status_message );
182                                            continue;
183                                    }
184    
185                  }                                  if (res.route_summary.total_distance == 0) {
186                                            continue;
187                                    }
188    
189    
190              System.out.println(responses);                                  if (res.route_summary.total_distance < bedsteAfstand) {
191                                            bedsteAfstand = res.route_summary.total_distance;
192                                            bedsteAdresse = a2;
193                                    }
194    
195          } catch(Exception e) {                                  if (bedsteAfstand < 200) { //vejdistance er tæt nok på
196                                            return bedsteAdresse;
197                                    }
198                        
199                            }
200                            
201                    } catch (Exception e) {
202                          logger.log(Level.SEVERE, "Lookup failed", e);                          logger.log(Level.SEVERE, "Lookup failed", e);
203                    }
         }  
   
204    
205                  return bedsteAdresse;                  return bedsteAdresse;
206          }          }
207    
208            /*      
209          /*          public Adresse getNearestViarouteJni(Adresse a1, Collection<Adresse> haystack) {
210           * Denne virker men table opslaget er 10 gange hurtigere  
211           *                  if (binding == null) {
212           */                          initOsrm();
213          @Deprecated                  }
214          public Adresse getNearest(Adresse a1, Collection<Adresse> haystack) {  
215    
216                  int bedsteAfstand = Integer.MAX_VALUE;                  int bedsteAfstand = Integer.MAX_VALUE;
217                  Adresse bedsteAdresse = null;                  Adresse bedsteAdresse = null;
218                                    
                 Iterator<Adresse> it = haystack.iterator();  
                 while (it.hasNext()) {  
                         Adresse a2 = it.next();  
219                                                    
220                          try {                          for(Adresse a2: haystack) {
221                                  OSRMResponse res = getRoute(a1, a2);  
222                                                        ViarouteResult res = binding.viaRoute(a1.latitude, a1.longitude, a2.latitude, a2.longitude);
223                                    
224                                  if (res.route_summary.total_distance < bedsteAfstand) {                      
225                                          bedsteAfstand = res.route_summary.total_distance;                      if (res.status != 0) {
226                                            System.out.println("OSRM Returned " + res.status  );
227                                            continue;
228                                    }
229    
230                                    if (res.totalDistance == 0) {
231                                            continue;
232                                    }
233    
234    
235                                    if (res.totalDistance < bedsteAfstand) {
236                                            bedsteAfstand = res.totalDistance;
237                                          bedsteAdresse = a2;                                          bedsteAdresse = a2;
238                                  }                                  }
239                          } catch (IOException e) {  
240                                  System.out.println( e.getMessage() );                                  if (bedsteAfstand < 200) { //vejdistance er tæt nok på
241                                  System.exit(1);                                          return bedsteAdresse;
242                          }                                  }
243                                
244                  }                          }                      
245                    
246                  return bedsteAdresse;                  return bedsteAdresse;
247          }          }*/
           
         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);  
         }  
248  }  }
249    
250    

Legend:
Removed from v.2730  
changed lines
  Added in v.2744

  ViewVC Help
Powered by ViewVC 1.1.20