RoadsApi.nearestRoad в навигации. Как пользоваться? - PullRequest
0 голосов
/ 05 августа 2020

Я хочу использовать Roads Api от Google для упрощения навигации. Я могу показать синюю точку на карте, которая показывает мое местоположение:

map.setMyLocationEnabled(true)

Но из-за качества сигнала GPS эта точка не всегда точна. Поэтому я хочу использовать RoadsApi.nearestRoads , который возвращает ближайшую дорогу к заданному месту. Самый простой способ - отправить местоположение в RoadsApi, который вернет ближайшую улицу и отобразит там маркер (например, стрелку) вместо синей точки. Но есть проблема. К сожалению, иногда местоположение, взятое из функции onLocationChanged, бывает настолько плохим, что RoadsApi возвращает неверную улицу. Думаю, мне нужно дождаться нескольких локаций и отправить их в RoadsApi. Как заставить навигацию работать плавно и точно?

Мой код:

MainFragment:

onLocationChanged(Location location) {
mLatLngs.clean();
mLatLngs = new ArrayList<>();
mLatLngs.add(
                new com.google.maps.model.LatLng(
                        location.getLatitude(),
                        location.getLongitude()
                )
        );
        NearestRoadAsyncTask nearestRoadAsyncTask = new NearestRoadAsyncTask(mGeoApiContext);
        try {
            List<SnappedPoint> snappedPoints = nearestRoadAsyncTask.execute(mLatLngs).get();
            Log.d(TAG, "onLocationChanged: LatLngs " + snappedPoints.toString() );

            map.addMarker(new MarkerOptions().position(
                    new LatLng(
                            snappedPoints.get(0).location.lat,
                            snappedPoints.get(0).location.lng))
            .title("qwertt"));
        } catch (ExecutionException | InterruptedException e) {
            e.printStackTrace();
        }
}

NearestRoadAsyncTask

public class NearestRoadAsyncTask extends AsyncTask<List<LatLng>, Void, List<SnappedPoint>> {
private static final String TAG = "NearestRoadAsyncTask";
private WeakReference<GeoApiContext> mContext;

public NearestRoadAsyncTask(GeoApiContext context) {
    this.mContext = new WeakReference<>(context);
}

@Override
protected void onPreExecute() {
    super.onPreExecute();

}

@Override
protected List<SnappedPoint> doInBackground(List<LatLng>... latLngs) {
    try {
        GeoApiContext context = mContext.get();
        return nearestRoad(context, latLngs[0]);
    } catch (final Exception ex) {
        ex.printStackTrace();
        return null;
    }
}

@Override
protected void onPostExecute(List<SnappedPoint> snappedPoints) {
    Log.d(TAG, "onPostExecute: " + snappedPoints.toString());

}

/**
 * Snaps the points to their most likely position on roads using the Roads API.
 */
private List<SnappedPoint> nearestRoad(GeoApiContext context, List<LatLng> locations) throws Exception {
    List<SnappedPoint> snappedPoints = new ArrayList<>();
        List<SnappedPoint> ls = asList(RoadsApi.nearestRoads(context, locations.toArray(new LatLng[locations.size()])).await());
    return snappedPoints;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...