Last active
February 17, 2021 20:12
-
-
Save saeedsh92/eaf249741e02c60bc0faf9ab6196925c to your computer and use it in GitHub Desktop.
ParserTask
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class DirectionsJSONParser { | |
/** Receives a JSONObject and returns a list of lists containing latitude and longitude */ | |
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"); | |
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 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 decodePoly(String encoded) { | |
List poly = new ArrayList(); | |
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"; | |
String mode = "mode=driving"; | |
// Building the parameters to the web service | |
String parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + mode + "&key=" + getString(R.string.google_maps_key); | |
// 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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
routes = parser.parse(jObject); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return routes; | |
} | |
@Override | |
protected void onPostExecute(List<List<HashMap<String, String>>> result) { | |
ArrayList points = null; | |
PolylineOptions lineOptions = null; | |
MarkerOptions markerOptions = new MarkerOptions(); | |
for (int i = 0; i < result.size(); i++) { | |
points = new ArrayList(); | |
lineOptions = new PolylineOptions(); | |
List<HashMap<String, String>> path = result.get(i); | |
for (int j = 0; j < path.size(); j++) { | |
HashMap point = path.get(j); | |
double lat = Double.parseDouble(String.valueOf(point.get("lat"))); | |
double lng = Double.parseDouble(String.valueOf(point.get("lng"))); | |
LatLng position = new LatLng(lat, lng); | |
points.add(position); | |
} | |
lineOptions.addAll(points); | |
lineOptions.width(12); | |
lineOptions.color(Color.RED); | |
lineOptions.geodesic(true); | |
} | |
// Drawing polyline in the Google Map for the i-th route | |
polyline = mMap.addPolyline(lineOptions); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment