Google Maps Api Directions

后端 未结 2 2036
别跟我提以往
别跟我提以往 2021-01-01 07:49

Can i mark two points on the google maps in my application and then calculate the direction on the map as well as turn by turn navigation ?

相关标签:
2条回答
  • 2021-01-01 08:26

    No the Map Activity doesn't provide such a feature. You have to request it via the Google Maps Web API.

    0 讨论(0)
  • 2021-01-01 08:33

    I am create an application which are used to get the driving direction between two points in the map

    Step be step

    step1 First create a class MyOverlay.java which are used to draw a path

        import android.graphics.Bitmap;
    import android.graphics.Canvas; 
    import android.graphics.Color;
    import android.graphics.Paint; 
    import android.graphics.Point; 
    import android.graphics.RectF; 
    import android.util.Log;
    //import android.util.Log;
    
    import com.google.android.maps.GeoPoint; 
    import com.google.android.maps.MapView; 
    import com.google.android.maps.Overlay; 
    import com.google.android.maps.Projection; 
    
    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;
    
    
      public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode) //  GeoPoint is a int. (6E)
      { 
    
        this.gp1 = gp1; 
        this.gp2 = gp2;
        this.mode = mode;
        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¡Gstart 
          if(mode==1)
          {
            if(defaultColor==999)
                paint.setColor(Color.BLUE);   
            else
                paint.setColor(defaultColor);   
    
    
            RectF oval=new RectF(point.x - mRadius, point.y - mRadius,  
                                 point.x + mRadius, point.y + mRadius); 
            // start point
            canvas.drawOval(oval, paint); 
          }
          // mode=2¡Gpath 
          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¡Gend */
          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);
    
    
            RectF oval=new RectF(point2.x - mRadius,point2.y - mRadius,  
                                 point2.x + mRadius,point2.y + mRadius); 
            /* end point */
            paint.setAlpha(255);
            canvas.drawOval(oval, paint);
          }
          /* mode=4¡Gcar */
          else if(mode==4)
          {
    
            if(defaultColor==999)
                paint.setColor(Color.GREEN);   
            else
                paint.setColor(defaultColor);   
    
            Point point2 = new Point(); 
            projection.toPixels(gp2, point2); 
            paint.setTextSize(20);
            paint.setAntiAlias(true); 
            canvas.drawBitmap(img, point2.x, point2.y,paint);      
            canvas.drawText(this.text, point2.x, point2.y, paint);
        //    Log.d(TAG, "Draw the text="+this.text+ " at point="+point2.x + "," + point2.y);
          }
    
          else if(mode==5)
          {
    
            if(defaultColor==999)
                paint.setColor(Color.GREEN);   
            else
                paint.setColor(defaultColor);   
    
            Point point2 = new Point(); 
            projection.toPixels(gp2, point2); 
            paint.setTextSize(20);
            paint.setAntiAlias(true); 
            canvas.drawBitmap(img, point2.x, point2.y,paint);
    
    
    
        //    Log.d(TAG, "Draw the text="+this.text+ " at point="+point2.x + "," + point2.y);
          }
    
    
    
        } 
        return super.draw(canvas, mapView, shadow, when); 
      } 
    
    
    } 
    

    step 2: Create a class name DrivingDirectionActivity.java

       import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.w3c.dom.Document;
    import org.xml.sax.SAXException;
    
    import android.graphics.Color;
    import android.os.Bundle;
    import android.util.Log;
    
    import com.android.code.R;
    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapView;
    
    /**
     * @author ashish
     * 
     *  
     *
     */
    public class DrivingDirectionActivity extends MapActivity {
    
    
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.google_map_driving_direction_view);
    
            MapView mapView = (MapView) findViewById(R.id.myMapView1);
    
            double src_lat = 28.632808;
            double src_long = 77.218276;
            double dest_lat = 28.588535;
            double dest_long = 77.255130;
            GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),
                    (int) (src_long * 1E6));
            GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),
                    (int) (dest_long * 1E6));
    
            DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);
    
            mapView.getController().animateTo(srcGeoPoint);
            mapView.getController().setZoom(15);
    
        }
    
        /* (non-Javadoc)
         * @see com.google.android.maps.MapActivity#isRouteDisplayed()
         */
    
    
    
        protected boolean isRouteDisplayed() {
            // TODO Auto-generated method stub
            return false;
        }
        private void DrawPath(GeoPoint src, GeoPoint dest, int color,MapView mMapView01) {
    
            // connect to map web service
            Document doc = getDocument(makeUrl(src,dest));
            System.out.println(doc.toString());
            try {
    
                if (doc.getElementsByTagName("GeometryCollection").getLength() > 0) {
    
                    // String path =
                    // doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getNodeName();
                    String path = doc.getElementsByTagName("GeometryCollection")
                            .item(0).getFirstChild().getFirstChild()
                            .getFirstChild().getNodeValue();
    
                    Log.d("xxx", "path=" + path);
    
                    String[] pairs = path.split(" ");
                    String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude
                                                            // lngLat[1]=latitude
                                                            // lngLat[2]=height
    
                    // src
                    GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),
                                                        (int) (Double.parseDouble(lngLat[0]) * 1E6));
                    mMapView01.getOverlays().add(new MyOverLay(startGP, startGP, 1));
    
                    GeoPoint gp1;
                    GeoPoint gp2 = startGP;
                    for (int i = 1; i < pairs.length; i++) {
                        // the last one would be crash
    
                        lngLat = pairs[i].split(",");
                        gp1 = gp2;
                        // watch out! For GeoPoint, first:latitude, second:longitude
                        gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),
                                (int) (Double.parseDouble(lngLat[0]) * 1E6));
                        mMapView01.getOverlays().add(new MyOverLay(gp1, gp2, 2, color));
                        Log.d("xxx", "pair:" + pairs[i]);
                    }
                    mMapView01.getOverlays().add(new MyOverLay(dest, dest, 3)); // use
                                                                                // the
                                                                                // default
                                                                                // color
                }
            } catch ( Exception e) {
    
                e.printStackTrace();
            }  
    
        }
    
        private Document getDocument(String urlString) {
            // TODO Auto-generated method stub
    
            Document doc = null;
            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 = db.parse(urlConnection.getInputStream());
            } catch (Exception e) {
                // TODO: handle exception
            }
    
            return doc;
        }
    
        private String makeUrl(GeoPoint src, GeoPoint dest) {
            // TODO Auto-generated method stub
    
            // get the kml (XML) doc. And parse it to get the coordinates(direction
            // route).
    
            StringBuilder urlString = new StringBuilder();
            urlString.append("http://maps.google.com/maps?f=d&hl=en");
            urlString.append("&saddr=");// from
            urlString.append(Double.toString((double) src.getLatitudeE6() / 1.0E6));
            urlString.append(",");
            urlString.append(Double.toString((double) src.getLongitudeE6() / 1.0E6));
            urlString.append("&daddr=");// to
            urlString.append(Double.toString((double) dest.getLatitudeE6() / 1.0E6));
            urlString.append(",");
            urlString.append(Double.toString((double) dest.getLongitudeE6() / 1.0E6));
            urlString.append("&ie=UTF8&0&om=0&output=kml");
    
            Log.d("xxx", "URL=" + urlString.toString());
            return urlString.toString();
        }
    
    }
    

    now execute..

    If this is not good then you can pass the your current location as source loaction

    0 讨论(0)
提交回复
热议问题