开发者

Google Maps Api Directions

开发者 https://www.devze.com 2023-03-07 12:17 出处:网络
Can i mark two points on the google maps in my ap开发者_C百科plication and then calculate the direction on the map as well as turn by turn navigation ?I am create an application which are used to get

Can i mark two points on the google maps in my ap开发者_C百科plication and then calculate the direction on the map as well as turn by turn navigation ?


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


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

0

精彩评论

暂无评论...
验证码 换一张
取 消