public static PolylineList create(JSONObject jsObj) throws JSONException { PolylineList line = null; String status = jsObj.getString(Param.STATUS.toString()); if (status.equals(PolylineList.Status.OK)) { JSONArray routesArray = jsObj.getJSONArray(Param.ROUTES.toString()); line = ok(routesArray); } else { line = new PolylineList(); line.status = status; if (status.equalsIgnoreCase(PolylineList.Status.NOT_FOUND)) { // по крайней мере для одной заданной точки (исходной точки, пункта назначения или путевой // точки) геокодирование невозможно. } else if (status.equalsIgnoreCase(PolylineList.Status.ZERO_RESULTS)) { // между исходной точкой и пунктом назначения не найдено ни одного маршрута. } else if (status.equalsIgnoreCase(PolylineList.Status.MAX_WAYPOINTS_EXCEEDED)) { // в запросе задано слишком много waypoints. Максимальное количество waypoints равно 8 плюс // исходная точка и пункт назначения. ( (Пользователи Google Maps Premier могут выполнять // запросы с количеством путевых точек до 23.) } else if (status.equalsIgnoreCase(PolylineList.Status.INVALID_REQUEST)) { // запрос недопустим } else if (status.equalsIgnoreCase(PolylineList.Status.OVER_QUERY_LIMIT)) { // служба получила слишком много запросов от вашего приложения в разрешенный период времени. } else if (status.equalsIgnoreCase(PolylineList.Status.REQUEST_DENIED)) { // служба Directions отклонила запрос вашего приложения. } else if (status.equalsIgnoreCase(PolylineList.Status.UNKNOWN_ERROR)) { // обработка запроса маршрута невозможна из-за ошибки сервера. При повторной попытке запрос // может быть успешно выполнен } else { } } return line; }
private static PolylineList ok(JSONArray routesArray) throws JSONException { JSONObject route = routesArray.getJSONObject(0); PolylineList polylineList = new PolylineList(); polylineList.status = PolylineList.Status.OK; JSONArray legs = route.getJSONArray(Param.LEGS.toString()); JSONObject leg = legs.getJSONObject(0); JSONObject distanceObj = leg.getJSONObject(Param.DISTANCE.toString()); polylineList.distance = distanceObj.getLong(Param.VALUE.toString()); JSONObject durationObj = leg.getJSONObject(Param.DURATION.toString()); // содержит куб выделения информационного окна для маршрута. JSONObject bounds = route.getJSONObject(Param.BOUNDS.toString()); JSONObject bounds_southwest = bounds.getJSONObject(Param.SOUTHWEST.toString()); JSONObject bounds_northeast = bounds.getJSONObject(Param.NORTHEAAST.toString()); double latitudeMax = bounds_northeast.getDouble(Param.LAT.toString()); double longitudeMax = bounds_northeast.getDouble(Param.LNG.toString()); double latitudeMin = bounds_southwest.getDouble(Param.LAT.toString()); double longitudeMin = bounds_southwest.getDouble(Param.LNG.toString()); polylineList.maxLatLng = new LatLng(latitudeMax, longitudeMax); polylineList.minLatLng = new LatLng(latitudeMin, longitudeMin); JSONArray steps = leg.getJSONArray(Param.STEPS.toString()); for (int i = 0; i < steps.length(); i++) { JSONObject step = steps.getJSONObject(i); JSONObject start_location = step.getJSONObject(Param.START_LOCATION.toString()); JSONObject end_location = step.getJSONObject(Param.END_LOCATION.toString()); double latitudeStart = start_location.getDouble(Param.LAT.toString()); double longitudeStart = start_location.getDouble(Param.LNG.toString()); double latitudeEnd = end_location.getDouble(Param.LAT.toString()); double longitudeEnd = end_location.getDouble(Param.LNG.toString()); LatLng startGeoPoint = new LatLng(latitudeStart, longitudeStart); LatLng endGeoPoint = new LatLng(latitudeEnd, longitudeEnd); JSONObject polylineObject = step.getJSONObject(Param.POLYLINE.toString()); // if(accuracyRoute == FINE_ROUTE ){ List points = decodePoly(polylineObject.getString(Param.POINTS.toString())); polylineList.addAll(points); // } else { // polyline.add(startGeoPoint); // polyline.add(endGeoPoint); // } } return polylineList; }