2012-03-20 62 views
1

我想在android中的路徑追蹤程序的源代碼。 我看到代碼中 How to draw a path on a map using kml file? 公共無效drawPath(NavigationDataSet navSet,詮釋色彩,MapView的mMapView01){在android中的路徑追蹤程序

Log.d(myapp.APP, "map color before: " + color);   

// color correction for dining, make it darker 
if (color == Color.parseColor("#add331")) color = Color.parseColor("#6C8715"); 
Log.d(myapp.APP, "map color after: " + color); 

Collection overlaysToAddAgain = new ArrayList(); 
for (Iterator iter = mMapView01.getOverlays().iterator(); iter.hasNext();) { 
    Object o = iter.next(); 
    Log.d(myapp.APP, "overlay type: " + o.getClass().getName()); 
    if (!RouteOverlay.class.getName().equals(o.getClass().getName())) { 
     // mMapView01.getOverlays().remove(o); 
     overlaysToAddAgain.add(o); 
    } 
} 
mMapView01.getOverlays().clear(); 
mMapView01.getOverlays().addAll(overlaysToAddAgain); 

String path = navSet.getRoutePlacemark().getCoordinates(); 
Log.d(myapp.APP, "path=" + path); 
if (path != null && path.trim().length() > 0) { 
    String[] pairs = path.trim().split(" "); 

    Log.d(myapp.APP, "pairs.length=" + pairs.length); 

    String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height 

    Log.d(myapp.APP, "lnglat =" + lngLat + ", length: " + lngLat.length); 

    if (lngLat.length<3) lngLat = pairs[1].split(","); // if first pair is not transferred completely, take seconds pair //TODO 

    try { 
     GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6)); 
     mMapView01.getOverlays().add(new RouteOverlay(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; 

      if (lngLat.length >= 2 && gp1.getLatitudeE6() > 0 && gp1.getLongitudeE6() > 0 
        && gp2.getLatitudeE6() > 0 && gp2.getLongitudeE6() > 0) { 

       // for GeoPoint, first:latitude, second:longitude 
       gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6)); 

       if (gp2.getLatitudeE6() != 22200000) { 
        mMapView01.getOverlays().add(new RouteOverlay(gp1, gp2, 2, color)); 
        Log.d(myapp.APP, "draw:" + gp1.getLatitudeE6() + "/" + gp1.getLongitudeE6() + " TO " + gp2.getLatitudeE6() + "/" + gp2.getLongitudeE6()); 
       } 
      } 
      // Log.d(myapp.APP,"pair:" + pairs[i]); 
     } 
     //routeOverlays.add(new RouteOverlay(gp2,gp2, 3)); 
     mMapView01.getOverlays().add(new RouteOverlay(gp2, gp2, 3)); 
    } catch (NumberFormatException e) { 
     Log.e(myapp.APP, "Cannot draw route.", e); 
    } 
} 
// mMapView01.getOverlays().addAll(routeOverlays); // use the default color 
mMapView01.setEnabled(true); 

} 但我無法執行代碼。 如果你不介意可以任何一次給整個源代碼。

謝謝。

+0

你得到的任何錯誤 – 2012-03-20 04:46:44

+0

android.app.ActionBar沒有解決。 – Venkat 2012-03-20 04:54:21

+0

listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE,MY_UUID_INSECURE)此方法未定義。 – Venkat 2012-03-20 04:54:57

回答

0

我有兩個類HomeActivity和MyOverlay在谷歌地圖 這裏畫出路徑是HomeActivity:

MapView mapView; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Log.e("Home", " activity created"); 
    mapView = (MapView) findViewById(R.id.mapview); 
    double src_lat = 28.011022; // the testing source 28.011022,73.323802 
    double src_long = 73.323802; 
    double dest_lat = 28.008389; // the testing destination 28.008389,73.33599 
    double dest_long = 73.33599; 

    Log.e("Home ", " Strting drawing path"); 
    GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6), 
      (int) (src_long * 1E6)); 
    GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6), 
      (int) (dest_long * 1E6)); 
    Log.e("Home ", " Strting drawing path"); 

    List<Overlay> mapOverlays = mapView.getOverlays(); 
    Drawable drawable = this.getResources().getDrawable(R.drawable.darkgreen_marker); 
    mapView.getOverlays(); 
    OverlayItem overlayitem = new OverlayItem(srcGeoPoint, "Hello!", "This is your position"); 
    overLay marker_overlay=new overLay(drawable); 
    marker_overlay.addOverlay(overlayitem); 
    mapOverlays.add(marker_overlay); 
    overlayitem = new OverlayItem(destGeoPoint, "Theater Big ", "Go to this "); 
    marker_overlay.addOverlay(overlayitem); 
    mapOverlays.add(marker_overlay); 
    //mapView.getOverlays().add(new overLay(null, destGeoPoint)); 

    DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);  
    mapView.getController().animateTo(srcGeoPoint); 
    mapView.getController().setZoom(15); 
    mapView.setBuiltInZoomControls(true); 
} 

@Override 
protected boolean isRouteDisplayed() { 

    return false; 
} 

private void DrawPath(GeoPoint src,GeoPoint dest, int color, MapView mMapView01) 
{ 
    // connect to map web service 
    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.e("Draw path ","URL="+urlString.toString()); 
    // get the kml (XML) doc. And parse it to get the coordinates(direction route). 
    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()); 
     Log.e(" Home ", " response"+doc.toString()); 
     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("draw path ","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("Draw path","pair:" + pairs[i]); 
      } 
      mMapView01.getOverlays().add(new MyOverLay(dest,dest, 3)); // use the default color 
     } 
    }catch (MalformedURLException e){ 
     e.printStackTrace(); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 
    catch (ParserConfigurationException e){ 
     e.printStackTrace(); 
    } 
    catch (SAXException e){ 
     e.printStackTrace(); 
    } 
} 

public class overLay extends ItemizedOverlay<OverlayItem>{ 
    private List<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
    GeoPoint gp1; 
    Drawable marker; 

    public overLay(Drawable marker) { 
     super(marker); 
     this.marker=marker; 
    } 

    public void addOverlay(OverlayItem overlay){ 
     mOverlays.add(overlay); 
     Log.e(" Map Overlay __", " adding new item "+overlay); 
     populate(); 
    } 

    @Override 
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when){ 
     Projection projection = mapView.getProjection(); 
     Point point = new Point(); 
     for(int i=0;i<mOverlays.size();i++){ 
      OverlayItem g = getItem(i); 
      gp1=g.getPoint(); 
      projection.toPixels(gp1, point); 
       Bitmap bmp = BitmapFactory.decodeResource(
         getResources(), R.drawable.marker_red);    
        canvas.drawBitmap(bmp, point.x-10, point.y-35, null); 
     } 
     return super.draw(canvas, mapView, shadow, when); 
    } 

    @Override 
    public boolean onTap(int index){ 
     /* GeoPonit p MapView mapView*/ 
     OverlayItem item = getItem(index); 
     GeoPoint gp=item.getPoint(); 
     String msg=item.getSnippet(); 

     mapView.getController().animateTo(gp); 
     Log.e("-- map view --", " marker clicked "+gp); 

     LayoutInflater infalter=getLayoutInflater(); 
     final LinearLayout table = (LinearLayout)infalter.inflate(R.layout.popup_baloon_layout, null); 
     table.setWillNotDraw(false); 
     final MapView.LayoutParams lp2 = new MapView.LayoutParams(
       150,100,gp,-15,-10,MapView.LayoutParams.BOTTOM_CENTER); 
     TextView addrs=(TextView)table.findViewById(R.id.address); 
     addrs.setText(msg); 
     ImageView call_img=(ImageView)table.findViewById(R.id.imageView1); 
     call_img.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.e("__ Home __", " making call to 12345"); 
       Bundle bundle=new Bundle(); 
       mapView.removeView(table); 
       Intent intent = new Intent(Intent.ACTION_CALL); 
       intent.setData(Uri.parse("tel:" + bundle.getString("12345"))); 
       HomeActivity.this.startActivity(intent); 

      } 
     }); 

     table.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mapView.removeView(table); 
       //table=null; 
      } 
     }); 

     mapView.addView(table,lp2); 
     return true; 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     Log.e("Map Overlay __", " creating overlay item "+i); 
     return mOverlays.get(i); 
    } 

    @Override 
    public int size() { 
     Log.e("Map Overlay __", " getting overlay size "); 
     return mOverlays.size(); 
    } 

} 

和MyOverLay類:

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; 
private Context context; 

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

public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor,Context context){ 
    this.gp1 = gp1; 
    this.gp2 = gp2; 
    this.mode = mode; 
    this.defaultColor = defaultColor; 
    this.context=context; 
} 

/*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); 
      Bitmap bmp = BitmapFactory.decodeResource(
        context.getResources(), R.drawable.marker_red);    
       canvas.drawBitmap(bmp, point.x-10, point.y-35, null); 

      /*RectF oval=new RectF(point.x - mRadius, point.y - mRadius, 
      point.x + mRadius, point.y + mRadius);*/ 
      // start point 
      //canvas.drawOval(oval, paint); 
     } 
     // 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); 
      Bitmap bmp = BitmapFactory.decodeResource(
        context.getResources(), R.drawable.marker_red);    
       canvas.drawBitmap(bmp, point.x-16, point.y-38, null); 
      /*RectF oval=new RectF(point2.x - mRadius,point2.y - mRadius, 
      point2.x + mRadius,point2.y + mRadius); 
      paint.setAlpha(255); 
      canvas.drawOval(oval, paint);*/ 
     } 
    } 
    return super.draw(canvas, mapView, shadow, when); 
} 

@Override 
public boolean onTap(GeoPoint p, MapView mapView){ 

    return false; 
} 

}

這些類使用KML在兩個位置之間繪製路徑。

+0

我的要求是,當用戶啓動應用程序時,它每5秒保存一次經度和緯度。到達目的地後,應用程序使用保存的經度和緯度繪製地圖。可能嗎?謝謝先進的 – Venkat 2012-03-20 05:21:40

+0

@venkat然後,你只需修改HomeActivity類中的DrawPath()函數,只需使用'mMapView01.getOverlays()。add(new MyOverLay(dest,dest,3));'並從DrawPath中刪除其餘代碼() – 2012-03-20 05:27:58

+0

我是新的android。所以爲什麼如果我嘗試執行該網站的代碼,它給了我很多錯誤。如果你不介意給我整個應用程序,然後我會在我的系統中測試,然後我修改它,請理解我的問題 – Venkat 2012-03-20 05:33:38