2012-04-14 5 views
1

J'essaye de tracer une route sur un Android MapView, mais je trouve qu'il est presque impossible d'effectuer un zoom sur le chemin. Je le gocde followinZoom avant sur le chemin MapView

Paint mPaint = new Paint(); 
     mPaint.setDither(true); 
     mPaint.setColor(Color.RED); 
     mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(4); 
     GeoPoint gP1 = null; 
     if (addresses.size() > 0) { 
      gP1 = new GeoPoint((int) (addresses.get(0).getLatitude() * 1E6), 
        (int) (addresses.get(0).getLongitude() * 1E6)); 
     } 
     GeoPoint gP2 = null; 
     if (addresses2.size() > 0) { 
      gP2 = new GeoPoint((int) (addresses2.get(0).getLatitude() * 1E6), 
        (int) (addresses2.get(0).getLongitude() * 1E6)); 
     } 
     Point p1 = new Point(); 
     Point p2 = new Point(); 
     Path path = new Path(); 
     projection.toPixels(gP1, p1); 
     projection.toPixels(gP2, p2); 
     path.moveTo(p2.x, p2.y); 
     path.lineTo(p1.x,p1.y); 
     canvas.drawPath(path, mPaint); 

     MapController mc = mymapView.getController(); 
     mc.setZoom(5); 
     mymapView.invalidate(); 

J'ai essayé de mettre à deux endroits en Caroline du Sud et un zoom sur l'un des points à l'aide mc.animateTo (GP1); mais chaque fois que je fais cela, il zoome sur Broken Arrow, OK, et non sur la coordonnée réelle à gP1.

Répondre

0

utiliser le code ci-dessous pour dessiner avec chemin Routh zoom/zoom arrière :::

public class RoutePath extends MapActivity { 
    /** Called when the activity is first created. */ 

    MapView mapView; 
    private RoutePath _activity; 
    private CustomDialog _customDialog; 
    GeoPoint srcGeoPoint,destGeoPoint; 
    private static List<Overlay> mOverlays; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     _activity = this; 

     MapView mapView = (MapView) findViewById(R.id.mapview); 
     if(Constants.LOG)Log.d("source geo point","route path:::"+Constants.GPSLAT+"::::"+Constants.GPSLNG); 

     double src_lat = getIntent().getExtras().getDouble("SRCLAT"); 
     double src_long = getIntent().getExtras().getDouble("SRCLNG"); 



     double dest_lat = getIntent().getExtras().getDouble("DESTLAT"); 
     double dest_long = getIntent().getExtras().getDouble("DESTLNG"); 
     srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),(int) (src_long * 1E6)); 
     destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),(int) (dest_long * 1E6)); 

     List<Overlay> mapOverlays = mapView.getOverlays(); 
     Drawable srcdrawable = this.getResources().getDrawable(R.drawable.pin_green); 
     CustomItemizedOverlay srcitemizedOverlay = new CustomItemizedOverlay(srcdrawable, this); 
     OverlayItem srcoverlayitem = new OverlayItem(srcGeoPoint, "Hello!", "This is your Location."); 

     Drawable destdrawable = this.getResources().getDrawable(R.drawable.pin_red); 
     CustomItemizedOverlay destitemizedOverlay = new CustomItemizedOverlay(destdrawable, this); 
     OverlayItem destoverlayitem = new OverlayItem(destGeoPoint, "Hello!", "This is dest Location."); 

     srcitemizedOverlay.addOverlay(srcoverlayitem); 
     destitemizedOverlay.addOverlay(destoverlayitem); 

     mapOverlays.add(srcitemizedOverlay); 
     mapOverlays.add(destitemizedOverlay); 

     connectAsyncTask _connectAsyncTask = new connectAsyncTask(); 
     _connectAsyncTask.execute();   
     mapView.setBuiltInZoomControls(true); 
     mapView.displayZoomControls(true); 
     mOverlays = mapView.getOverlays(); 
     mapView.getController().animateTo(srcGeoPoint); 
     mapView.getController().setZoom(12); 
    } 
    @Override 
    protected void onStop() { 
     super.onStop(); 
     //stop custom dialog 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    private class connectAsyncTask extends AsyncTask<Void, Void, Void>{ 
     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      //customDialog show(); 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      fetchData(); 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result);    
      if(doc!=null){ 
       Overlay ol = new MyOverLay(_activity,srcGeoPoint,srcGeoPoint,1); 
       mOverlays.add(ol); 
       NodeList _nodelist = doc.getElementsByTagName("status"); 
       Node node1 = _nodelist.item(0); 
       String _status1 = node1.getChildNodes().item(0).getNodeValue(); 
       if(_status1.equalsIgnoreCase("OK")){ 
        NodeList _nodelist_path = doc.getElementsByTagName("overview_polyline"); 
        Node node_path = _nodelist_path.item(0); 
        Element _status_path = (Element)node_path; 
        NodeList _nodelist_destination_path = _status_path.getElementsByTagName("points"); 
        Node _nodelist_dest = _nodelist_destination_path.item(0); 
        String _path = _nodelist_dest.getChildNodes().item(0).getNodeValue(); 
        List<GeoPoint> _geopoints = decodePoly(_path); 
        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); 
         Overlay ol1 = new MyOverLay(gp1,gp2,2,Color.BLUE); 
         mOverlays.add(ol1); 
        } 
        Overlay ol2 = new MyOverLay(_activity,destGeoPoint,destGeoPoint,3); 
        mOverlays.add(ol2); 

        //customDialog dismiss(); 

       }else{ 
        Util.showAlertGoBack(_activity,"Unable to find the route"); 
       } 
       //    String _status = node.getNodeValue(); 
       if(Constants.LOG)Log.d("sdsds","dsds"+_status1);     
       Overlay ol2 = new MyOverLay(_activity,destGeoPoint,destGeoPoint,3); 
       mOverlays.add(ol2); 
       // customDialog dismiss(); 
      }else{ 
       //Util.showAlertGoBack(_activity,"Unable to find the route"); 
      } 

     } 

    } 
    Document doc = null; 
    private void fetchData() 
    { 
     StringBuilder urlString = new StringBuilder(); 
     urlString.append("http://maps.google.com/maps/api/directions/xml?origin="); 
     urlString.append(Double.toString((double)srcGeoPoint.getLatitudeE6()/1.0E6)); 
     urlString.append(","); 
     urlString.append(Double.toString((double)srcGeoPoint.getLongitudeE6()/1.0E6)); 
     urlString.append("&destination=");//to 
     urlString.append(Double.toString((double)destGeoPoint.getLatitudeE6()/1.0E6)); 
     urlString.append(","); 
     urlString.append(Double.toString((double)destGeoPoint.getLongitudeE6()/1.0E6)); 
     urlString.append("&sensor=true&mode=driving"); 
     if(Constants.LOG)Log.d("xxx","URL="+urlString.toString());   
     HttpURLConnection urlConnection= null; 
     URL url = null; 
     try 
     { 
      url = new URL(urlString.toString()); 
      urlConnection=(HttpURLConnection)url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.setDoOutput(true); 
      urlConnection.setDoInput(true); 
      urlConnection.connect(); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      doc = (Document) db.parse(urlConnection.getInputStream());//Util.XMLfromString(response); 
     }catch (MalformedURLException e){ 
      e.printStackTrace(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     }catch (ParserConfigurationException e){ 
      e.printStackTrace(); 
     } 
     catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    private List<GeoPoint> decodePoly(String encoded) { 

     List<GeoPoint> poly = new ArrayList<GeoPoint>(); 
     int index = 0, len = encoded.length(); 
     int lat = 0, lng = 0; 

     while (index < len) { 
      int b, shift = 0, result = 0; 
      do { 
       b = encoded.charAt(index++) - 63; 
       result |= (b & 0x1f) << shift; 
       shift += 5; 
      } while (b >= 0x20); 
      int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
      lat += dlat; 

      shift = 0; 
      result = 0; 
      do { 
       b = encoded.charAt(index++) - 63; 
       result |= (b & 0x1f) << shift; 
       shift += 5; 
      } while (b >= 0x20); 
      int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
      lng += dlng; 

      GeoPoint p = new GeoPoint((int) (((double) lat/1E5) * 1E6), 
        (int) (((double) lng/1E5) * 1E6)); 
      poly.add(p); 
     } 

     return poly; 
    } 
} 

MyOverLay.java

public class MyOverLay extends Overlay 
{ 
    private GeoPoint gp1; 
    private GeoPoint gp2; 
    //private int mRadius=6; 
    private int mode=0; 
    private int defaultColor; 
    private String text=""; 
    private Bitmap img = null; 
    Context mContext; 

    public MyOverLay(Context context,GeoPoint gp1,GeoPoint gp2,int mode) // GeoPoint is a int. (6E) 
    { 
     this.gp1 = gp1; 
     this.gp2 = gp2; 
     this.mode = mode; 
     this.mContext = context; 
     defaultColor = 999; // no defaultColor 

    } 

    public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor) 
    { 
     this.gp1 = gp1; 
     this.gp2 = gp2; 
     this.mode = mode; 
     this.defaultColor = defaultColor; 
    } 
    public void setText(String t) 
    { 
     this.text = t; 
    } 
    public void setBitmap(Bitmap bitmap) 
    { 
     this.img = bitmap; 
    } 
    public int getMode() 
    { 
     return mode; 
    } 

    @Override 
    public boolean draw 
    (Canvas canvas, MapView mapView, boolean shadow, long when) 
    { 
     Projection projection = mapView.getProjection(); 
     if (shadow == false) 
     { 
      Paint paint = new Paint(); 
      paint.setAntiAlias(true); 
      Point point = new Point(); 
      projection.toPixels(gp1, point); 
      // mode=1&#65306;start 
      if(mode==1) 
      { 
       if(defaultColor==999) 
        paint.setColor(Color.BLUE); 
       else 
        paint.setColor(defaultColor);     
       // start point 
      } 
      // mode=2&#65306;path 
      else if(mode==2) 
      { 
       if(defaultColor==999) 
        paint.setColor(Color.RED); 
       else 
        paint.setColor(defaultColor); 
       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); 

      } 
      /* mode=3&#65306;end */ 
      else if(mode==3) 
      { 
       /* the last path */ 

       if(defaultColor==999) 
        paint.setColor(Color.GREEN); 
       else 
        paint.setColor(defaultColor); 
       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); 
    } 

} 
Questions connexes