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