How can I parse out points and draw a route on a Google Map in Android?

AndroidGoogle MapsDrawingRoutes

Android Problem Overview


How do I get points & draw the route on Google maps in Android OS?

Android Solutions


Solution 1 - Android

An example URL you're going to parse is...

http://maps.googleapis.com/maps/api/directions/xml?origin=52.31,16.71&destination=51.27,6.75&sensor=false

change origin [lat,long] and destination[lat, long] for your purpose

--

points fetching

import java.io.StringReader;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import net.gynsoft.citydusseldorf.lib.HttpClient;
import android.os.Handler;
import com.google.android.maps.GeoPoint;


public class MapRoute 
{
private GeoPoint gpSrc = null;
private GeoPoint gpDest = null;
private ArrayList<GeoPoint> alRoute = new ArrayList<GeoPoint>();
private Handler haRoute = new Handler();

public interface RouteListener
{
	public void onDetermined(ArrayList<GeoPoint> alPoint);
	public void onError();
}

private RouteListener oRoute = null;


public MapRoute(GeoPoint gpSrc,GeoPoint gpDest)
{
	this.gpSrc = gpSrc;
	this.gpDest = gpDest;
}

public void getPoints(RouteListener oRoute)
{
	this.oRoute = oRoute;
	new Thread(ruFetch).start();
}

private Runnable ruFetchOk = new Runnable()
{
	public void run()
	{
		oRoute.onDetermined(alRoute);
	}
};

private Runnable ruFetchError = new Runnable()
{
	public void run()
	{
		oRoute.onDetermined(alRoute);
	}
};

private Runnable ruFetch = new Runnable()
{
	public void run()
	{
		String szUrl = "http://maps.googleapis.com/maps/api/directions/xml";
		szUrl += "?origin=" + (gpSrc.getLatitudeE6()/1e6) + "," + (gpSrc.getLongitudeE6()/1e6);
		szUrl += "&destination=" + (gpDest.getLatitudeE6()/1e6) + "," + (gpDest.getLongitudeE6()/1e6);
		szUrl += "&sensor=true";
		
		HttpClient oHttp = HttpClient.getInstance();
		String szXml = oHttp.doGet(szUrl,"");
		
		try
		{
			XmlPullParserFactory xppfFactory = XmlPullParserFactory.newInstance();
			xppfFactory.setNamespaceAware(true);
			XmlPullParser xppParses = xppfFactory.newPullParser();
			 
			xppParses.setInput(new StringReader(szXml));
			int iEventType = xppParses.getEventType();
			String szTag = "";
			String szText = "";
			boolean bStep = false;
			int iLat = 0;
			int iLong = 0;
			
			while(iEventType != XmlPullParser.END_DOCUMENT) 
			{ 	  
				 iEventType = xppParses.next();
				 
				 if(iEventType == XmlPullParser.START_TAG) 
				 {
					 szTag = xppParses.getName();
					 
					 if(szTag.equals("step"))
						 bStep = true;
				 }
				 else if(iEventType == XmlPullParser.TEXT)  	
				 {  
					 if(szTag.equals("points"))
						 szText = "";
					 else
						 szText = xppParses.getText().trim();
				 }			
				 else if(iEventType == XmlPullParser.END_TAG) 
				 {
					 if(xppParses.getName().equals("step"))
					 {
						 bStep = false;
					 }
					else if(bStep && xppParses.getName().equals("start_location") || xppParses.getName().equals("end_location"))
					 {
						 GeoPoint gpPoint = new GeoPoint(iLat,iLong);
						 alRoute.add(gpPoint);
					 }
					 else if(bStep && xppParses.getName().equals("lat"))
					 {
						 iLat = (int)(Double.parseDouble(szText) * 1e6);
					 }
					 else if(bStep && xppParses.getName().equals("lng"))
					 {
						 iLong = (int)(Double.parseDouble(szText) * 1e6);
					 }
				 }
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
			haRoute.post(ruFetchError);
		}
		
		
		if(alRoute.size() == 0)
			haRoute.post(ruFetchError);
		else
			haRoute.post(ruFetchOk);
	}
};
}

--

map overlay

public class MapRouteOverlay extends Overlay 
{
private GeoPoint gp1;
private GeoPoint gp2;

private int mode=0;
private int defaultColor;

public MapRouteOverlay(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 MapRouteOverlay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor)
{
this.gp1 = gp1;
this.gp2 = gp2;
this.mode = mode;
this.defaultColor = defaultColor;
}

public int getMode()
{
return mode;
}

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);
		paint.setDither(true);
		Point point = new Point();
		projection.toPixels(gp1, point);
	
		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);
			}
		}
	}
	return super.draw(canvas, mapView, shadow, when);
}
}

--

how to use it... somewhere in my activity

dEmpty = new BitmapDrawable(Bitmap.createBitmap(1,1,Bitmap.Config.ARGB_8888));
dPin = getResources().getDrawable(R.drawable.pin_map);

private void doDrawPath(GeoPoint gpSrc,GeoPoint gpDest) 
{
	MapRoute oRoute = new MapRoute(gpSrc,gpDest);
	oRoute.getPoints(new RouteListener()
	{
		@Override
		public void onDetermined(ArrayList<GeoPoint> alPoint) 
		{
			GeoPoint oPointA = null;
			GeoPoint oPointB = null;
			
			mvMap.getOverlays().clear();
			
			for(int i=1; i<alPoint.size()-1; i++)
			{
				oPointA = alPoint.get(i-1);
				oPointB =  alPoint.get(i);
				
				mvMap.getOverlays().add(new MapRouteOverlay(oPointA,oPointB,2,Color.RED));
			}
							
			
			mvMap.getOverlays().add(new MapRoutePinOverlay(alPoint.get(0),dPin));
			mvMap.getOverlays().add(new MapRoutePinOverlay(alPoint.get(alPoint.size()-1),dPin));
			
			mvMap.invalidate();
		}

		@Override
		public void onError() 
		{
		}			
	});
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMatt RutkowskyView Question on Stackoverflow
Solution 1 - AndroidMatt RutkowskyView Answer on Stackoverflow