/** * Parses a url pointing to a Google JSON object to a Route object. * * @return a Route object based on the JSON object. */ public Route parse() { // turn the stream into a string final String result = convertStreamToString(this.getInputStream()); // Create an empty route final Route route = new Route(); // Create an empty segment final Segment segment = new Segment(); try { // Tranform the string into a json object final JSONObject json = new JSONObject(result); // Get the route object final JSONObject jsonRoute = json.getJSONArray("routes").getJSONObject(0); // Get the leg, only one leg as we don't support waypoints final JSONObject leg = jsonRoute.getJSONArray("legs").getJSONObject(0); // Get the steps for this leg final JSONArray steps = leg.getJSONArray("steps"); // Number of steps for use in for loop final int numSteps = steps.length(); // Set the name of this route using the start & end addresses route.setName(leg.getString("start_address") + " to " + leg.getString("end_address")); // Get google's copyright notice (tos requirement) route.setCopyright(jsonRoute.getString("copyrights")); // Get the total length of the route. route.setLength(leg.getJSONObject("distance").getInt("value")); // Get any warnings provided (tos requirement) if (!jsonRoute.getJSONArray("warnings").isNull(0)) { route.setWarning(jsonRoute.getJSONArray("warnings").getString(0)); } /* * Loop through the steps, creating a segment for each one and * decoding any polylines found as we go to add to the route * object's map array. Using an explicit for loop because it is * faster! */ for (int i = 0; i < numSteps; i++) { // Get the individual step final JSONObject step = steps.getJSONObject(i); // Get the start position for this step and set it on the // segment final JSONObject start = step.getJSONObject("start_location"); final GeoPoint position = new GeoPoint( (int) (start.getDouble("lat") * 1E6), (int) (start.getDouble("lng") * 1E6)); segment.setPoint(position); // Set the length of this segment in metres final int length = step.getJSONObject("distance").getInt("value"); distance += length; segment.setLength(length); segment.setDistance(distance / 1000); // Strip html from google directions and set as turn instruction segment.setInstruction(step.getString("html_instructions").replaceAll("<(.*?)*>", "")); // Retrieve & decode this segment's polyline and add it to the // route. route.addPoints(decodePolyLine(step.getJSONObject("polyline").getString("points"))); // Push a copy of the segment to the route route.addSegment(segment.copy()); } } catch (JSONException e) { if (DEBUG.ON) { Log.e(e.getMessage(), "Google JSON Parser - " + feedUrl); } } return route; }