2011-05-20 167 views

回答

2

否地圖活動不提供此類功能。您必須通過Google Maps Web API請求。

+0

確定。所以我需要使用Web API並確保KML文件在地圖上呈現? – 2011-05-20 16:46:41

+0

你有任何想法如何解析KML文件? – 2011-05-20 16:47:47

+0

http://stackoverflow.com/questions/2023669/j2me-android-blackberry-driving-directions-route-between-two-locations – Flo 2011-05-20 20:02:23

3

我創建其用於在地圖上的兩點之間得到驅動方向

步驟是步驟

步驟1首先應用程序創建類MyOverlay.java其是用於繪製路徑

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); 
    } 


} 

第2步:創建類名稱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(); 
    } 

} 

現在執行..

如果這是不好的,那麼你可以通過你的當前位置作爲源loaction

+2

我跟着你的代碼,並在'getDocument(...)方法在'doc = db.parse(urlConnection.getInputStream());'。異常消息是'未終止的實體引用(位置:ENTITY_REF&@ 1:796 in java.io[email protected])'。任何線索? – 2012-08-02 12:09:01

+1

看來這種方法不再有效。該網址的回覆現在是google maps html頁面。 – frankli 2012-11-28 03:05:01