Обновить полилинию в соответствии с перемещением пользователя Android googleMaps v2

У меня есть googleMap (v2) с полилинией, которая представляет маршрут между текущим местоположением пользователя и точкой назначения.
Теперь я хочу обновить полилинию в соответствии с перемещением пользователя.

Я пытался перерисовать всю полилинию при изменении местоположения, но полилиния мерцает.

Я не нашел подходящей функции в классе PolylineOptions
(функция add() предназначена только для добавления вершины, но не для обновления или удаления)

Есть ли у вас идеи, как обновить полилинию???
спасибо, что уделили время.

3 ответа

Решение

Единственный способ с версии 3.1.36:

List<LatLng> points = polyline.getPoints();
points.add(newPoint);
polyline.setPoints(points);

Надеюсь, API будет улучшен в более поздних версиях.

* Я уже сделал работу по обновлению пути полилинии без удаления полилинии. Мы можем сделать это, изменив точки этой полилинии. Проверьте ниже код.

Это логика установки новых точек на полилинию.

/*Here the routes contain the points(latitude and longitude)*/
for (int i = 0; i < routes.size(); i++) {
            Route route = routes.get(i);
            if(polyline_path != null){
                polyline_path.setPoints(route.points);
            }
        }

Подробное объяснение:

private GoogleMap map_object;
private Marker marker_driver;
private Marker marker_drop_off;
private Polyline polyline_path;
private PolylineOptions polylineOptions_path;

...
...
...

/*HelperDirectionFinder is a class that I create to call google API and I used this 
  class to get directions routes*/

/*I have created Service, and I'm calling this lines below after 5 sec. to get the 
  updated routes from google API.*/

HelperDirectionFinder directionFinder = new HelperDirectionFinder(
            JobEndScreen.this, source, destinations);
    try {
        directionFinder.showDirection();
    } catch (UnsupportedEncodingException e) {
        HelperProgressDialog.closeDialog();
    }

...
...
...

@Override
public void onDirectionFinderStart() {
    if(polylineOptions_path == null){
        HelperProgressDialog.showDialog(getActivity(), "", getString(R.string.text_loading));
    }
}


/*This interface method is called after getting routes from google API.*/
/*Here the routes contains the list of path or routes returned by Google Api*/
@Override
public void onDirectionFinderSuccess(List<Route> routes) {
    HelperProgressDialog.closeDialog();


    /*When polylineOptions_path is null it means the polyline is not drawn.*/
    /*If the polylineOptions_path is not null it means the polyline is drawn on map*/
    if(polylineOptions_path == null){
        for (Route route : routes) {
            polylineOptions_path = new PolylineOptions().
                    geodesic(true).
                    color(ContextCompat.getColor(getActivity(), R.color.color_bg_gray_dark)).
                    width(10);

            for (int i = 0; i < route.points.size(); i++)
                polylineOptions_path.add(route.points.get(i));

            polyline_path = map_object.addPolyline(polylineOptions_path);
        }
    }
    else {
        for (int i = 0; i < routes.size(); i++) {
            Route route = routes.get(i);
            if(polyline_path != null){
                polyline_path.setPoints(route.points);
            }
        }
    }
}
//Declare on global
PolylineOptions polyOptions, polyOptions2;
Polyline polyline2;
List<LatLng> ltln;
private Double lat_decimal = 0.0,lng_decimal=0.0;



//initialize
ltln = new ArrayList<>();

// если вы используете библиотеку маршрутизации

compile 'com.github.jd-alexander:library:1.0.7'

 @Override
    public void onRoutingSuccess(ArrayList<Route> arrayList, int i) {

    //Add this code snippet on onRoutingSuccess  to store latlan list
        ltln = new ArrayList<>();
        System.out.println("-----arrayList------" + arrayList.get(0).getPoints());
        ltln = arrayList.get(0).getPoints();



        //  NOTE here already we draw polyLine 1

       }


 //below mentioned how to update polyline

   private void UpdatePoliline(){
    System.out.println("-------runnablePolyline-------"+ltln.size());
    try {
        if (ltln.size() > 0) {
            for (int i = 0; i < ltln.size(); i++) {
                ltln.remove(i);
                if (CalculationByDistance(ltln.get(i), new LatLng(lat_decimal, lng_decimal)) >= 10) {
                    break;
                }

            }
            polyOptions2 = new PolylineOptions();
            polyOptions2.color(getResources().getColor(R.color.app_color));
            polyOptions2.width(7);
            polyOptions2.addAll(ltln);


            if (polyline2 == null) {
                polyline2 = googleMap.addPolyline(polyOptions2);
                if (polyLines.size() > 0) {
                    for (Polyline poly : polyLines) {
                        poly.remove();
                    }
                }
                polyLines.add(polyline2);
                if (polyline != null) {
                    polyline.remove();
                    polyline = null;
                }
            } else {
                polyline = googleMap.addPolyline(polyOptions2);
                if (polyLines.size() > 0) {
                    for (Polyline poly : polyLines) {
                        poly.remove();
                    }
                }
                polyLines.add(polyline);
                if (polyline2 != null) {
                    polyline2.remove();
                    polyline2 = null;
                }
            }
            System.out.println("=====waypoints new===" + ltln);
        }
    } catch (IndexOutOfBoundsException e) {
        e.printStackTrace();
    }
}

// Расчет расстояния между 2 точками

 public float CalculationByDistance(LatLng StartP, LatLng EndP) {


    Location locationA = new Location("Source");
    locationA.setLatitude(StartP.latitude);
    locationA.setLongitude(StartP.longitude);

    Location locationB = new Location("Destination");
    locationB.setLatitude(EndP.latitude);
    locationB.setLongitude(EndP.longitude);



    float distance = locationA.distanceTo(locationB);


    return distance;
}

// Перерисовать машину Polyline не в текущей полилинии с определенным расстоянием

    if (ltln.size() > 0) {

        if (PolyUtil.isLocationOnPath(new LatLng(currentlat, currentLon), ltln, false, 60.0f) ){
            System.out.println("===tolarance===" + true);
        } else {
           //Redraw Polyline
        }
    }

   UpdatePoliline();
Другие вопросы по тегам