Я хочу использовать 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;
}