/* * Copyright 2015 Google Inc. All rights reserved. * * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this * file except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF * ANY KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.google.maps; import static com.google.maps.internal.StringJoin.join; import com.google.gson.FieldNamingPolicy; import com.google.maps.errors.ApiError; import com.google.maps.errors.ApiException; import com.google.maps.internal.ApiConfig; import com.google.maps.internal.ApiResponse; import com.google.maps.model.LatLng; import com.google.maps.model.SnappedPoint; import com.google.maps.model.SnappedSpeedLimitResponse; import com.google.maps.model.SpeedLimit; /** * The Google Maps Roads API identifies the roads a vehicle was traveling along and provides * additional metadata about those roads, such as speed limits. * * <p>See also: <a href="https://developers.google.com/maps/documentation/roads">Roads API * documentation</a>. */ public class RoadsApi { static final String API_BASE_URL = "https://roads.googleapis.com"; static final ApiConfig SNAP_TO_ROADS_API_CONFIG = new ApiConfig("/v1/snapToRoads") .hostName(API_BASE_URL) .supportsClientId(false) .fieldNamingPolicy(FieldNamingPolicy.IDENTITY); static final ApiConfig SPEEDS_API_CONFIG = new ApiConfig("/v1/speedLimits") .hostName(API_BASE_URL) .supportsClientId(false) .fieldNamingPolicy(FieldNamingPolicy.IDENTITY); static final ApiConfig NEAREST_ROADS_API_CONFIG = new ApiConfig("/v1/nearestRoads") .hostName(API_BASE_URL) .supportsClientId(false) .fieldNamingPolicy(FieldNamingPolicy.IDENTITY); private RoadsApi() { } /** * Takes up to 100 GPS points collected along a route, and returns a similar set of data with the * points snapped to the most likely roads the vehicle was traveling along. */ public static PendingResult<SnappedPoint[]> snapToRoads(GeoApiContext context, LatLng... path) { return context.get(SNAP_TO_ROADS_API_CONFIG, RoadsResponse.class, "path", join('|', path)); } /** * Takes up to 100 GPS points collected along a route, and returns a similar set of data with the * points snapped to the most likely roads the vehicle was traveling along. Additionally, you can * request that the points be interpolated, resulting in a path that smoothly follows the geometry * of the road. * * @param interpolate Whether to interpolate a path to include all points forming the full * road-geometry. When true, additional interpolated points will also be * returned, resulting in a path that smoothly follows the geometry of the * road, even around corners and through tunnels. * @param path The path to be snapped. */ public static PendingResult<SnappedPoint[]> snapToRoads(GeoApiContext context, boolean interpolate, LatLng... path) { return context.get(SNAP_TO_ROADS_API_CONFIG, RoadsResponse.class, "path", join('|', path), "interpolate", String.valueOf(interpolate)); } /** * Returns the posted speed limit for given road segments. The provided LatLngs will first be * snapped to the most likely roads the vehicle was traveling along. * * <p>Note: The accuracy of speed limit data returned by the Google Maps Roads API cannot be * guaranteed. Speed limit data provided is not real-time, and may be estimated, inaccurate, * incomplete, and/or outdated. Inaccuracies in our data may be reported through the <a * href="http://www.google.com/mapmaker">Google Map Maker</a> service. */ public static PendingResult<SpeedLimit[]> speedLimits(GeoApiContext context, LatLng... path) { return context.get(SPEEDS_API_CONFIG, SpeedsResponse.class, "path", join('|', path)); } /** * Returns the posted speed limit for given road segments. * * <p>Note: The accuracy of speed limit data returned by the Google Maps Roads API cannot be * guaranteed. Speed limit data provided is not real-time, and may be estimated, inaccurate, * incomplete, and/or outdated. Inaccuracies in our data may be reported through the <a * href="http://www.google.com/mapmaker">Google Map Maker</a> service. * * @param placeIds The Place ID of the road segment. Place IDs are returned by the {@link * #snapToRoads(GeoApiContext, com.google.maps.model.LatLng...)} method. You can * pass up to 100 placeIds with each request. */ public static PendingResult<SpeedLimit[]> speedLimits(GeoApiContext context, String... placeIds) { String[] placeParams = new String[2 * placeIds.length]; int i = 0; for (String placeId : placeIds) { placeParams[i++] = "placeId"; placeParams[i++] = placeId; } return context.get(SPEEDS_API_CONFIG, SpeedsResponse.class, placeParams); } /** * Returns the result of snapping the provided points to roads and retrieving the speed limits. * This is useful for interactive applications where you need to */ public static PendingResult<SnappedSpeedLimitResponse> snappedSpeedLimits(GeoApiContext context, LatLng... path) { return context.get(SPEEDS_API_CONFIG, CombinedResponse.class, "path", join('|', path)); } /** * Takes up to 100 GPS points, and returns the closest road segment for each * point. The points passed do not need to be part of a continuous path * * @param points The sequence of points to be aligned to nearest roads */ public static PendingResult<SnappedPoint[]> nearestRoads(GeoApiContext context, LatLng... points) { return context.get(NEAREST_ROADS_API_CONFIG, RoadsResponse.class, "points", join('|', points)); } private static class RoadsResponse implements ApiResponse<SnappedPoint[]> { private SnappedPoint[] snappedPoints; private ApiError error; @Override public boolean successful() { return error == null; } @Override public SnappedPoint[] getResult() { return snappedPoints; } @Override public ApiException getError() { return ApiException.from(error.status, error.message); } } private static class SpeedsResponse implements ApiResponse<SpeedLimit[]> { private SpeedLimit[] speedLimits; private ApiError error; @Override public boolean successful() { return error == null; } @Override public SpeedLimit[] getResult() { return speedLimits; } @Override public ApiException getError() { return ApiException.from(error.status, error.message); } } private static class CombinedResponse implements ApiResponse<SnappedSpeedLimitResponse> { private SnappedPoint[] snappedPoints; private SpeedLimit[] speedLimits; private ApiError error; @Override public boolean successful() { return error == null; } @Override public SnappedSpeedLimitResponse getResult() { SnappedSpeedLimitResponse response = new SnappedSpeedLimitResponse(); response.snappedPoints = snappedPoints; response.speedLimits = speedLimits; return response; } @Override public ApiException getError() { return ApiException.from(error.status, error.message); } } }