コード例 #1
0
 /**
  * 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;
 }