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

Matt Rutkowsky picture Matt Rutkowsky · Apr 10, 2011 · Viewed 19.2k times · Source

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

Answer

Matt Rutkowsky picture Matt Rutkowsky · Dec 17, 2014

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