在谷歌地图V2中显示多条路线

时间:2014-05-28 16:26:50

标签: android google-maps

我正在使用此类在地图上显示路线。问题是它只显示一条路线。我想要做的是在地图上显示多个备用路线。即使服务器响应有多条路由,它也只会解析第一条路由并显示它。我应该做些什么更改来显示Google服务器返回的所有路由。这是我的课程。

package com.maps.bestway;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;

public class map extends Activity {
GoogleMap map;
 ArrayList<LatLng> markerPoints;
TextView tvDistanceDuration;
 @SuppressLint("NewApi")
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  tvDistanceDuration = (TextView) findViewById(R.id.tv_distance_time);

  // Initialising
  markerPoints = new ArrayList<LatLng>();


  map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
    .getMap();
  // map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
  // map.setMapType(GoogleMap.MAP_TYPE_NONE);
  map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
  // map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
  // map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);

//Enable MyLocation Button in the Map
  map.setMyLocationEnabled(true);

  //Checks whether the map is drawing traffic data
  //map.isTrafficEnabled();

  // Setting onclick event listener for the map
  map.setOnMapClickListener(new OnMapClickListener() {

      public void onMapClick(LatLng point) {

          // Already two locations
          if(markerPoints.size()>1){
              markerPoints.clear();
              map.clear();
          }

         // Adding new item to the ArrayList
          markerPoints.add(point);

          // Creating MarkerOptions
          MarkerOptions options = new MarkerOptions();

          // Setting the position of the marker
          options.position(point);

          /**
          * For the start location, the color of marker is GREEN and
          * for the end location, the color of marker is RED.
          */
          if(markerPoints.size()==1){
                      options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
          }else if(markerPoints.size()==2){
                  options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
          }

          // Add new marker to the Google Map Android API V2
          map.addMarker(options);

          // Checks, whether start and end locations are captured
          if(markerPoints.size() >= 2){
              LatLng origin = markerPoints.get(0);
              LatLng dest = markerPoints.get(1);

              // 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";

  //unit type 
  String unit = "units=metric";

  //add multipathes

  String pathes = "alternatives=true";

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

  // 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());
  }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
  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
  protected void onPostExecute(List<List<HashMap<String, String>>> result) {
      ArrayList<LatLng> points = null;
      PolylineOptions lineOptions = null;
      MarkerOptions markerOptions = new MarkerOptions();
      String distance = "";
      String duration = "";

      if(result.size()<1){
          Toast.makeText(getBaseContext(), "No Points", Toast.LENGTH_SHORT).show();
          return;
      }

      // 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);

             if(j==0){    // Get distance from the list
                  distance = (String)point.get("distance");
                  continue;
              }else if(j==1){ // Get duration from the list
                  duration = (String)point.get("duration");
                  continue;
              }

              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(4);
          lineOptions.color(Color.CYAN);
      }

      tvDistanceDuration.setText("Distance:"+distance + ", Duration:"+duration);

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

}

1 个答案:

答案 0 :(得分:0)

我抛弃了这段代码,问题是我在 onPostExecute 函数的 for 括号中放错了地方,这是正确的代码:

protected void onPostExecute(List<List<HashMap<String, String>>> result) {
  ArrayList<LatLng> points = null;
  PolylineOptions lineOptions = null;
  MarkerOptions markerOptions = new MarkerOptions();
  String distance = "";
  String duration = "";

  if(result.size()<1){
      Toast.makeText(getBaseContext(), "No Points", Toast.LENGTH_SHORT).show();
      return;
  }

  // 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);

         if(j==0){    // Get distance from the list
              distance = (String)point.get("distance");
              continue;
          }else if(j==1){ // Get duration from the list
              duration = (String)point.get("duration");
              continue;
          }

          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(4);
      lineOptions.color(Color.CYAN);


  tvDistanceDuration.setText("Distance:"+distance + ", Duration:"+duration);

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