GoogleMap对象上的清除路径 - android

时间:2017-05-02 19:43:02

标签: java android google-maps

问题是每次我尝试绘制不同的路线时都不会清除地图,因此我会在另一条路线上绘制一条路线。

我已经花了太多时间试图解决它。在测试了其他用户的建议之后,似乎没有什么工作可行。 这基本上是我尝试过的:

  • 我正在调用googleMap.clear()方法

  • 我还维护对地图上添加的每条折线的引用,以便在绘制新路线时稍后调用polyline.remove()方法。

我有一个从数据库中检索数据的Web服务,它返回ArrayList<Stop>,stop对象表示一个包含在地图上绘制路径所需信息的公交车站。

该应用程序不直接使用谷歌网络服务,每个停止对象都有一个名为“折线”的字段,应用程序解码此折线字符串并检索ArrayList<LatLng>

让我向您展示我编写的代码片段。

public void drawRoute(ArrayList<Stop> stops){
    googleMap.clear();
    removePolylines();
        for(int x = 0; x< stops.size(); x++){
            Stop stop = stops.get(x);
            if(x != stops.size() -1){                    
                ArrayList<LatLng> routePoints = DataParser.decodePolyline(stop.getPolyline());
                Polyline polyline = googleMap.addPolyline(polylineOptions.addAll(routePoints));
                polylines.add(polyline);                    
            }
            addMarker(stop);
        }            
}

...

private void removePolylines(){
    for(Polyline polyline: polylines){
            polyline.remove();
    }
}

我还附上了一些截图,以便更好地解释问题所在。

enter image description here

第一次画一条路线没问题......

enter image description here

但是当我按下后退按钮并选择其他路线ID时......

enter image description here

正如您可以通过红色圆圈看到的前一条路线仍然在地图上,奇怪的是标记不再出现,但路线确实如此。

如何摆脱这个问题? 是否有更好的解决方案来实现相同的目标?

2 个答案:

答案 0 :(得分:0)

查看另一个类似的答案,看起来您只需要在polylines.remove(polyline);语句后添加polyline.remove();。作为参考,这是另一个类似的问题:Remove the last plotted line from Google Map Android

答案 1 :(得分:0)

好的家伙问题解决了,经过多次努力,我意识到解决方案是多么容易。

问题出现在这一行:

Polyline polyline = googleMap.addPolyline(polylineOptions.addAll(routePoints));

问题是polylineOptions对象是在类的顶部声明的,并在构造函数中初始化。因此,每次执行drawRoute(ArrayList<Stop> stops)方法时,都会向其添加新的ArrayList<LatLng> routePoints

这就是为什么te路线出现在另一个之上的原因。我还发现,至少在这个具体案例中,没有必要调用googleMap.clear()removePolylines()方法。

重构的代码如下所示:

public void drawRoute(ArrayList<Stop> stops){
    PolylineOptions polylineOptions = new PolylineOptions();
    for(int x = 0; x< stops.size(); x++){
        Stop stop = stops.get(x);
        if(x != stops.size() -1){
            ArrayList<LatLng> routePoints = DataParser.decodePolyline(stop.getPolyline());
            googleMap.addPolyline(polylineOptions.addAll(routePoints));                
        }
        addMarker(stop);
    }
}

你看到了区别吗? PolylineOptions对象在方法中在本地声明和初始化。

我希望这对其他人有用。