2017-02-21 1 views
0

Ich möchte mehrere Pfade von der Quelle zum Ziel anzeigen und habe den Parameter "alternatives=true" in meiner URL für die Direction API verwendet. Ich kann jedoch nicht mehrere Routen anzeigen. Ich glaube, ich habe Probleme in der Anzeige meiner Methode von onPostExecute(). Bitte adressiere mein Problem.Google Direction API zeigt nicht mehrere Pfade an

public void MapPoints(double SourceOne, double DestinationOne, double SourceTwo, double DestinationTwo){ 




     //LatLng origin = points.get(0); 
     //LatLng dest = points.get(1); 
     double SourceOneDraw = SourceOne; 
     double DestinationOneDraw = DestinationOne; 
     double SourceTwoDraw = SourceTwo; 
     double DestinationTwoDraw = DestinationTwo; 



     LatLng origin = new LatLng(SourceOneDraw,DestinationOneDraw); 
     LatLng dest = new LatLng(SourceTwoDraw,DestinationTwoDraw); 

     // Getting URL to the Google Directions API 
     String url = getDirectionsUrl(origin, dest); 

     DownloadTask downloadTask = new DownloadTask(); 

     // Start downloading json data from Google Directions API 
     downloadTask.execute(url); 
    } 



    private String getDirectionsUrl(LatLng origin,LatLng dest){ 

     // Origin of route 
     String str_origin = "origin="+origin.latitude+","+origin.longitude; 

     // Destination of route 
     String str_dest = "destination="+dest.latitude+","+dest.longitude; 

     // Sensor enabled 
     String sensor = "sensor=false"; 

     //Adding Alternative parameter 
     String alternative = "alternatives=true"; 

     // Building the parameters to the web service 
     String parameters = str_origin+"&"+str_dest+"&"+sensor+"&"+alternative; 

     // Output format 
     String output = "json"; 

     // Building the url to the web service 
     String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters; 


     return url; 
    } 

    //A method to download json data from url 
    private String downloadUrl(String strUrl) throws IOException{ 
     String data = ""; 
     InputStream iStream = null; 
     HttpURLConnection urlConnection = null; 
     try{ 
      URL url = new URL(strUrl); 

      // Creating an http connection to communicate with url 
      urlConnection = (HttpURLConnection) url.openConnection(); 

      // Connecting to url 
      urlConnection.connect(); 

      // Reading data from url 
      iStream = urlConnection.getInputStream(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

      StringBuffer sb = new StringBuffer(); 

      String line = ""; 
      while((line = br.readLine()) != null){ 
       sb.append(line); 
      } 

      data = sb.toString(); 

      br.close(); 

     }catch(Exception e){ 
      //Log.d("Exception while downloading url", e.toString()); 
      Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show(); 
     }finally{ 
      iStream.close(); 
      urlConnection.disconnect(); 
     } 
     return data; 
    } 

    // Fetches data from url passed 
    private class DownloadTask extends AsyncTask<String, Void, String> { 

     // Downloading data in non-ui thread 
     @Override 
     protected String doInBackground(String... url) { 

      // For storing data from web service 
      String data = ""; 

      try{ 
       // Fetching the data from web service 
       data = downloadUrl(url[0]); 
      }catch(Exception e){ 
       Log.d("Background Task",e.toString()); 
      } 
      return data; 
     } 

     // Executes in UI thread, after the execution of 
     // doInBackground() 
     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 

      ParserTask parserTask = new ParserTask(); 

      // Invokes the thread for parsing the JSON data 
      parserTask.execute(result); 
     } 
    } 
    // A class to parse the Google Places in JSON format 
    private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{ 

     // Parsing the data in non-ui thread 
     @Override 
     protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) { 

      JSONObject jObject; 
      List<List<HashMap<String, String>>> routes = null; 

      try{ 
       jObject = new JSONObject(jsonData[0]); 
       DirectionsJSONParser parser = new DirectionsJSONParser(); 

       // Starts parsing data 
       routes = parser.parse(jObject); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      return routes; 
     } 

     // Executes in UI thread, after the parsing process 
     @Override 
     protected void onPostExecute(List<List<HashMap<String, String>>> result) { 
      ArrayList<LatLng> points = null; 
      PolylineOptions lineOptions = null; 
      MarkerOptions markerOptions = new MarkerOptions(); 

      // Traversing through all the routes 
      for(int i=0;i<result.size();i++){ 
       points = new ArrayList<LatLng>(); 
       lineOptions = new PolylineOptions(); 

       // Fetching i-th route 
       List<HashMap<String, String>> path = result.get(i); 

       // Fetching all the points in i-th route 
       for(int j=0;j<path.size();j++){ 
        HashMap<String,String> point = path.get(j); 

        double lat = Double.parseDouble(point.get("lat")); 
        double lng = Double.parseDouble(point.get("lng")); 
        LatLng position = new LatLng(lat, lng); 

        points.add(position); 

       } 

       // Adding all the points in the route to LineOptions 
       lineOptions.addAll(points); 
       lineOptions.width(5); 
       lineOptions.color(Color.RED); 
      } 

      // Drawing polyline in the Google Map for the i-th route 
      mMap.addPolyline(lineOptions); 
     } 
    } 

Antwort

0

Blick auf Ihren Code, glaube ich, sehe ich das Problem. Sie haben eine for-Schleife, in dem Sie eine Schleife durch die Ergebnisse:

for(int i=0;i<result.size();i++) 

jedoch die Codezeile, die die Polylinie zeichnet sich nicht innerhalb dieser Schleife:

mMap.addPolyline(lineOptions); 

Bitte korrigieren Sie mich, wenn ich m falsch, aber es sieht so aus, als ob die obige Zeile nur einmal ausgeführt wird, da sie nicht in der Schleife ist. Dies würde dazu führen, dass nur ein Pfad auf der Karte gezeichnet wird. Wenn Sie versuchen, diese Codezeile innerhalb der for-Schleife zu verschieben, erhalten Sie mehrere Pfade auf der Karte? Die gesamte Funktion würde so aussehen:

+0

Vielen Dank, dass dies funktioniert: D jetzt bekomme ich alternative Routen angezeigt. –

Verwandte Themen