Thursday, 31 October 2013

Google Maps Directions Using Json

  1.     Location Route Directions Google Mapv2

OnMapLongClick:::

public void onMapLongClick(LatLng point) {
// TODO Auto-generated method stub
  count++;
points=point.toString();

lat =point.latitude;
lon=point.longitude;
  endLocation = point;
Log.i("points", points);
  if(count==1)
{
mMap.addMarker(new MarkerOptions().position(new LatLng(lat, lon))
       .title(endLocation.toString()));
}
else
{
mMap.clear();
  mMap.addMarker(new MarkerOptions().position(new LatLng(lat, lon))
       .title(endLocation.toString()));
Log.i("Endlocation points", points);
}
String url = getDirectionsUrl(startLocation, endLocation);

Log.v("My Updated Current Location", startLocation.toString());

showProgressDialog();

DownloadTask downloadTask = new DownloadTask();

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


private void showProgressDialog() {
// TODO Auto-generated method stub


if (myDialog == null)
        {
        myDialog = new ProgressDialog(MainActivity.this);
        myDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
       myDialog.setMessage("Please wait as we retieve the details of your route");
        }
       
        myDialog.show();
}
  private String getDirectionsUrl(LatLng origin,LatLng dest){

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

// Destination of route
String str_dest = "destination="+endLocation.latitude+","+endLocation.longitude;
// Sensor enabled
String sensor = "sensor=false";

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

// Output format
String output = "json";

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

 Log.d("url", url);

return 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    
  @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(10);
  lineOptions.color(Color.DKGRAY);
 
 
  }
 
  // Drawing polyline in the Google Map for the i-th route
  mMap.addPolyline(lineOptions);
 
  if (myDialog != null) myDialog.dismiss();
  }
}
}


Json.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.android.gms.maps.model.LatLng;
public class DirectionsJSONParser {

/** Receives a JSONObject and returns a list of lists containing latitude and longitude */
@SuppressWarnings("unchecked")
public List<List<HashMap<String,String>>> parse(JSONObject jObject){

List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>() ;
JSONArray jRoutes = null;
JSONArray jLegs = null;
JSONArray jSteps = null;

try {

jRoutes = jObject.getJSONArray("routes");

/** Traversing all routes */
for(int i=0;i<jRoutes.length();i++){
jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
@SuppressWarnings("rawtypes")
List path = new ArrayList<HashMap<String, String>>();

/** Traversing all legs */
for(int j=0;j<jLegs.length();j++){
jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");

/** Traversing all steps */
for(int k=0;k<jSteps.length();k++){
String polyline = "";
polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
List<LatLng> list = decodePoly(polyline);

/** Traversing all points */
for(int l=0;l<list.size();l++){
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );
path.add(hm);
}
}
routes.add(path);
}
}

} catch (JSONException e) {
e.printStackTrace();
}catch (Exception e){
}


return routes;
}


/**
* Method to decode polyline points
* Courtesy : http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
* */
    private List<LatLng> decodePoly(String encoded) {

        List<LatLng> poly = new ArrayList<LatLng>();
        int index = 0, len = encoded.length();
        int lat = 0, lng = 0;

        while (index < len) {
            int b, shift = 0, result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lat += dlat;

            shift = 0;
            result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng;

            LatLng p = new LatLng((((double) lat / 1E5)),
                    (((double) lng / 1E5)));
            poly.add(p);
        }

        return poly;
    }
}