RouteOverlay.java :  » Map » mapdroid » org » mapdroid » maps » gmaps » overlay » Android Open Source

Android Open Source » Map » mapdroid 
mapdroid » org » mapdroid » maps » gmaps » overlay » RouteOverlay.java
package org.mapdroid.maps.gmaps.overlay;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.mapdroid.maps.gmaps.MdMapActivity;
import org.mapdroid.maps.gmaps.MdMapView;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.os.Vibrator;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;

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 RouteOverlay extends Overlay implements OnGestureListener{
  private GeoPoint startPoint;
  private GeoPoint tmpStartPoint;
  private GeoPoint endPoint;
  private GeoPoint tmpEndPoint;
  private MdMapView mapView;
  private int mRadius=6;
  private String path;
  private GestureDetector gestureDetector;
  private Vibrator vibrator;

  public RouteOverlay(Context context, MdMapView mapView, GeoPoint gp1, GeoPoint gp2){ 
    super();
    this.mapView = mapView;
    this.startPoint = gp1;
    this.endPoint = gp2;
    
    gestureDetector = new GestureDetector(this);
    this.vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
  }

  @Override
  public void draw(Canvas canvas, MapView mapView, boolean shadow){
    //super.draw(canvas, mapView, shadow);
    String [] pairs = path.split(" ");
    String[] lngLat = pairs[0].split(","); 
    try{
      this.tmpStartPoint=new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
    }catch(NumberFormatException e){
      return;
    }
    this.tmpEndPoint=tmpStartPoint;
    
    Projection projection = mapView.getProjection();
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    Point point = new Point();
    projection.toPixels(tmpStartPoint, point);
    
    paint.setColor(Color.BLUE);
    
    RectF oval=new RectF(  point.x - mRadius, point.y - mRadius,
                point.x + mRadius, point.y + mRadius);
    // start point
    canvas.drawOval(oval, paint);
    
    paint.setColor(Color.GREEN);
    paint.setStrokeWidth(5);
    paint.setAlpha(120);
    Point point1 = new Point();
    Point point2 = new Point();
    for(int i=0;i<pairs.length;i++){ // the last one would be crash
      lngLat = pairs[i].split(",");
      this.tmpStartPoint=this.tmpEndPoint;
      try{
        this.tmpEndPoint=new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble(lngLat[0])*1E6));
      }catch(NumberFormatException e){
        return;
      }
      projection.toPixels(tmpStartPoint, point1);
      projection.toPixels(tmpEndPoint, point2);
      canvas.drawLine(point1.x, point1.y, point2.x,point2.y, paint);
      //Log.d("xxx","pair:" + pairs[i]);
    }

    this.tmpStartPoint=endPoint;
    this.tmpEndPoint=endPoint;
    paint.setColor(Color.RED);
    projection.toPixels(tmpStartPoint, point1);
    projection.toPixels(tmpEndPoint, point2);
    canvas.drawLine(point1.x, point1.y, point2.x,point2.y, paint);
    RectF oval2=new RectF(  point2.x - mRadius,point2.y - mRadius,
                point2.x + mRadius,point2.y + mRadius);
    /* end point */
    paint.setAlpha(255);
    canvas.drawOval(oval2, paint);
    return;
  }
  
  public void drawPath(Canvas canvas, MapView mapView) throws MalformedURLException, IOException, ParserConfigurationException, SAXException{
    // 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)startPoint.getLatitudeE6()/1.0E6 ));
    urlString.append(",");
    urlString.append( Double.toString((double)startPoint.getLongitudeE6()/1.0E6 ));
    urlString.append("&daddr=");//to
    urlString.append( Double.toString((double)endPoint.getLatitudeE6()/1.0E6 ));
    urlString.append(",");
    urlString.append( Double.toString((double)endPoint.getLongitudeE6()/1.0E6 ));
    urlString.append("&ie=UTF8&0&om=0&output=kml");
    //Log.d("xxx","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;
  
    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());
  
    if(doc.getElementsByTagName("GeometryCollection").getLength()>0){
      //String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getNodeName();
      path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getFirstChild().getNodeValue() ;
      //Log.d("xxx","path="+ path);
      draw(canvas, mapView, false);
    }
  }

  @Override
  public boolean onTouchEvent(MotionEvent e, MapView mapView){
    gestureDetector.onTouchEvent(e);
    this.mapView.hasEventHandled(true);
    return false;
  }
  
  @Override
  public boolean onDown(MotionEvent arg0) {
    // TODO Auto-generated method stub
    return false;
  }

  @Override
  public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
      float arg3) {
    // TODO Auto-generated method stub
    return false;
  }

  @Override
  public void onLongPress(MotionEvent arg0) {
    // TODO Auto-generated method stub
    vibrator.vibrate(75);
    MdMapActivity.removeDirectionDialog.show();
  }

  @Override
  public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
      float arg3) {
    // TODO Auto-generated method stub
    return false;
  }

  @Override
  public void onShowPress(MotionEvent arg0) {
    // TODO Auto-generated method stub
    
  }

  @Override
  public boolean onSingleTapUp(MotionEvent arg0) {
    // TODO Auto-generated method stub
    return false;
  }  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.