1

在我的 android 应用程序中,我正在显示路线 b/w current_location,并且用户通过单击“获取路线”按钮在剧院附近选择,但是当用户选择另一个剧院时,新路线也显示但旧路线未清除。我尝试了多种方式,但我无法去做。我尝试使用 mapOverlays.clear(); 这清除了我不想要的整个地图。即使我尝试了 {mapOverlays.remove(ol1); mapView.postInvalidate();}它没有清除路线请帮助我:以下是代码:

MyOverLay.java

public class MyOverLay extends Overlay 
{ 
    private GeoPoint gp1; 
    private GeoPoint gp2; 
    private int mode=0; 
    Context mContext;

    public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode) 
    { 
        this.gp1 = gp1; 
        this.gp2 = gp2; 
        this.mode = mode; 
    }  
    public int getMode() 
    { 
        return mode; 
    } 

    @Override 
    public boolean draw (Canvas canvas, MapView mapView, boolean shadow, long when) 
    { 
        Projection projection = mapView.getProjection(); 
        Log.d("shadow", ""+shadow);
        if (shadow== false) 
        { 
            Paint paint = new Paint(); 
            paint.setAntiAlias(true); 
            Point point = new Point(); 
            projection.toPixels(gp1, point); 
            if(mode==1) // start point
            { 
                    paint.setColor(Color.BLUE); 
            } 
            else if(mode==2) // mode=2,path 
            { 
                paint.setColor(Color.BLUE); 
                Point point2 = new Point(); 
                projection.toPixels(gp2, point2); 
                paint.setStrokeWidth(5); 
                paint.setAlpha(120); 
                canvas.drawLine(point.x, point.y, point2.x,point2.y, paint); 
            } 
            else if(mode==3)   /* mode=3:end */ 
            { 
                /* the last path */ 
                Point point2 = new Point(); 
                projection.toPixels(gp2, point2); 
                paint.setStrokeWidth(5); 
                paint.setAlpha(120); 
                canvas.drawLine(point.x, point.y, point2.x,point2.y, paint); 
                /* end point */
            } 
        } 
        return super.draw(canvas, mapView, shadow, when); 
    } 
}

HelloItemizedOverlay.java

public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    WebViewDemo viewDemo;
    GeoPoint curret_point;

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    Context mContext;

   //some methods

    public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
        viewDemo=(WebViewDemo)context;
    }

    //When user taps theater icon this alert box pop ups.which contains 'Get directions' Button
    @Override
    protected boolean onTap(int index) { 
         WebViewDemo.MyOverLayItem item = (WebViewDemo.MyOverLayItem) mOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        viewDemo.desc_lat=item.getPoint().getLatitudeE6();
        viewDemo.desc_lng=item.getPoint().getLongitudeE6();
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.setPositiveButton("Get directions", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                viewDemo.showDrections();
            }
        });
        dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        dialog.show();
        return true;
    }
}

WebViewDemo Map Activity的主要部分:

WebViewDemo.java

public class WebViewDemo extends MapActivity {

public double current_latitude, current_langitude;
Overlay ol1;
MapView mapView;
GeoPoint destGeoPoint;
HttpClient httpClient;
HttpPost postRequest;
HttpResponse response;
BufferedReader reader;
String sResponse, result;
StringBuilder s;
JSONObject jsonObject;
public String lat = null, lng = null;
int desc_lat,desc_lng;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
.....
mapView = (MapView) findViewById(R.id.mapview);
mapOverlays = mapView.getOverlays();
/**Here i am getting current_latitude, current_langitude using Location Manager
and displaying it on map.and making Web Service request to google and displaying near theaters also.*/
..
}//onCreate end

// *For displaying route b/w current location and User selected Theaters when Get directions Button clicked (in HelloItemizedOverlay class). 

public void showDrections() {

        try {
                      //Here i am trying  to clear previous path. 
            if(ol1!=null){
                mapOverlays.remove(ol1);
                mapView.postInvalidate();
                mapView.invalidate();
            }
            double l1 = desc_lat/1E6;
            double l2 = desc_lng/1E6;
            destGeoPoint = new GeoPoint(desc_lat,desc_lng);
            httpClient = new DefaultHttpClient();
            postRequest = new HttpPost(
                    "http://maps.googleapis.com/maps/api/directions/json?origin="
                            + current_latitude
                            + ","
                            + current_langitude
                            + "&destination="
                            + l1
                            + ","
                            + l2
                            + "&sensor=true&optimize=true&alternatives=false");
            response = httpClient.execute(postRequest);
            reader = new BufferedReader(new InputStreamReader(response
                    .getEntity().getContent(), "UTF-8"));// getting response
            sResponse = null;
            s = new StringBuilder();
            while ((sResponse = reader.readLine()) != null) {
                s = s.append(sResponse);
            }
            result = s.toString().trim();
            jsonObject = new JSONObject(result);

            JSONArray jsonRouteArray = jsonObject.getJSONArray("routes");
            JSONObject overview_poly = jsonRouteArray.getJSONObject(0).getJSONObject("overview_polyline");
            String points = overview_poly.getString("points");
            List<GeoPoint> _geopoints = decodePoly(points);
            GeoPoint gp1;
            GeoPoint gp2;
            gp2 = _geopoints.get(0);
            for (int i = 1; i < _geopoints.size(); i++) // the last one  would be crash
            {
                gp1 = gp2;
                gp2 = _geopoints.get(i);
                ol1 = new MyOverLay(gp1, gp2, 2);
                mapOverlays.add(ol1);
            }
            mapView.postInvalidate();
            dialog.cancel();
        } catch (JSONException je) {
            Toast.makeText(this, "Unable to Show The Route", Toast.LENGTH_LONG).show();
            Log.d("showDirectins() JSON ERROR", ""+je);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
private List<GeoPoint> decodePoly(String encoded) {
//this method is used to decode the route points which are coming from web service and convert them into GeoPoints
}

}

如果需要,请建议我更改代码。

4

3 回答 3

2

有可能删除地图中的路线,请在创建路线时将所有覆盖引用存储到一个列表,当您要删除迭代列表时,请从地图视图中删除所有覆盖引用。我希望它会奏效。

于 2012-05-02T07:14:42.603 回答
0

向 MyOverLay 类添加一个函数。“setPathVisibility(布尔值)”

将布尔值存储在称为可见性的私有变量中,在执行任何绘图逻辑之前,检查可见性是否为真。

这将允许您在不丢失所有覆盖数据的情况下打开和关闭路线。

于 2012-05-02T07:19:49.497 回答
0

我找到了一种更简单的方法。它可能有点脏,但它对我有用。

创建一个整数变量,每当单击按钮时该变量都会增加。然后在您的代码之上,添加此代码

if(iterator>0) {
                int listSize = mapView.getOverlays().size();
                Log.d("listSize",Integer.toString(listSize));
                mapView.getOverlays().remove(listSize-1); 
                iterator=0;
            }

上面的代码将删除在地图上绘制的最后一条路径。不需要列表或类似的东西。希望这可以帮助。

于 2012-08-13T07:09:39.157 回答