Hi.. Good morning Developers
I am sonendra mishra. I am trying to draw the path between two points
on google map in android . When i click the map we need to draw a
pushpin and again user click the map then draw another pushpin and
draw also path between these points on google map .

I am trying this by using this link

http://stackoverflow.com/questions/2643993/how-to-display-a-route-between-two-geocoords-in-google-maps-android

Problem is that i m able to draw path between these points when i
click the map on second time we get by default another map in place
map drawing the path on map.
Please any one can help me..

Point.java


package com.tech.google.demo;

public class Point {
    String mName;
    String mDescription;
    String mIconUrl;
    double mLatitude;
    double mLongitude;
}


Road.java

package com.tech.google.demo;

public class Road {
    public String mName;
    public String mDescription;
    public int mColor;
    public int mWidth;
    public double[][] mRoute = new double[][] {};
    public Point[] mPoints = new Point[] {};
}

RoadProvider.java

package com.tech.google.demo;

import java.io.IOException;
import java.io.InputStream;
import java.util.Stack;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
public class RoadProvider {

        public static Road getRoute(InputStream is) {
                KMLHandler handler = new KMLHandler();
                try {
                        SAXParser parser =
SAXParserFactory.newInstance().newSAXParser();
                        parser.parse(is, handler);
                } catch (ParserConfigurationException e) {
                        e.printStackTrace();
                } catch (SAXException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                Log.i("RoadProvider" , "Value of handler.mRoad = "+
handler.mRoad);
                return handler.mRoad;
        }

        public static String getUrl(double fromLat, double fromLon,
double toLat,
                        double toLon) {// connect to map web service

                StringBuffer urlString = new StringBuffer();
                urlString.append("http://maps.google.com/maps?
f=d&hl=en");
                urlString.append("&saddr=");// from
                urlString.append(Double.toString(fromLat));
                urlString.append(",");
                urlString.append(Double.toString(fromLon));
                urlString.append("&daddr=");// to
                urlString.append(Double.toString(toLat));
                urlString.append(",");
                urlString.append(Double.toString(toLon));
                urlString.append("&ie=UTF8&0&om=0&output=kml");
                Log.i("RoadProvider" , " return value = " +
urlString.toString());
                return urlString.toString();
        }
}

class KMLHandler extends DefaultHandler {
        Road mRoad;
        boolean isPlacemark;
        boolean isRoute;
        boolean isItemIcon;
        private Stack mCurrentElement = new Stack();
        private String mString;

        public KMLHandler() {
                mRoad = new Road();
        }

        public void startElement(String uri, String localName, String
name,
                        Attributes attributes) throws SAXException {
                mCurrentElement.push(localName);
                if (localName.equalsIgnoreCase("Placemark")) {
                        isPlacemark = true;
                        mRoad.mPoints = addPoint(mRoad.mPoints);
                } else if (localName.equalsIgnoreCase("ItemIcon")) {
                        if (isPlacemark)
                                isItemIcon = true;
                }
                mString = new String();
        }

        public void characters(char[] ch, int start, int length)
                        throws SAXException {
                String chars = new String(ch, start, length).trim();
                mString = mString.concat(chars);
        }

        public void endElement(String uri, String localName, String
name)
                        throws SAXException {
                if (mString.length() > 0) {
                        if (localName.equalsIgnoreCase("name")) {
                                if (isPlacemark) {
                                        isRoute =
mString.equalsIgnoreCase("Route");
                                        if (!isRoute) {
 
mRoad.mPoints[mRoad.mPoints.length - 1].mName = mString;
                                        }
                                } else {
                                        mRoad.mName = mString;
                                }
                        } else if (localName.equalsIgnoreCase("color")
&& !isPlacemark) {
                                mRoad.mColor =
Integer.parseInt(mString, 16);
                        } else if (localName.equalsIgnoreCase("width")
&& !isPlacemark) {
                                mRoad.mWidth =
Integer.parseInt(mString);
                        } else if
(localName.equalsIgnoreCase("description")) {
                                if (isPlacemark) {
                                        String description =
cleanup(mString);
                                        if (!isRoute)
 
mRoad.mPoints[mRoad.mPoints.length - 1].mDescription = description;
                                        else
                                                mRoad.mDescription =
description;
                                }
                        } else if (localName.equalsIgnoreCase("href"))
{
                                if (isItemIcon) {
 
mRoad.mPoints[mRoad.mPoints.length - 1].mIconUrl = mString;
                                }
                        } else if
(localName.equalsIgnoreCase("coordinates")) {
                                if (isPlacemark) {
                                        if (!isRoute) {
                                                String[] xyParsed =
split(mString, ",");
                                                double lon =
Double.parseDouble(xyParsed[0]);
                                                double lat =
Double.parseDouble(xyParsed[1]);
 
mRoad.mPoints[mRoad.mPoints.length - 1].mLatitude = lat;
 
mRoad.mPoints[mRoad.mPoints.length - 1].mLongitude = lon;
                                        } else {
                                                String[]
coodrinatesParsed = split(mString, " ");
                                                mRoad.mRoute = new
double[coodrinatesParsed.length][2];
                                                for (int i = 0; i <
coodrinatesParsed.length; i++) {
                                                        String[]
xyParsed = split(coodrinatesParsed[i], ",");
                                                        for (int j =
0; j < 2 && j < xyParsed.length; j++)
 
mRoad.mRoute[i][j] = Double
                                                                                
.parseDouble(xyParsed[j]);
                                                }
                                        }
                                }
                        }
                }
                mCurrentElement.pop();
                if (localName.equalsIgnoreCase("Placemark")) {
                        isPlacemark = false;
                        if (isRoute)
                                isRoute = false;
                } else if (localName.equalsIgnoreCase("ItemIcon")) {
                        if (isItemIcon)
                                isItemIcon = false;
                }
        }

        private String cleanup(String value) {
                String remove = "<br/>";
                int index = value.indexOf(remove);
                if (index != -1)
                        value = value.substring(0, index);
                remove = "&#160;";
                index = value.indexOf(remove);
                int len = remove.length();
                while (index != -1) {
                        value = value.substring(0, index).concat(
                                        value.substring(index + len,
value.length()));
                        index = value.indexOf(remove);
                }
                return value;
        }

        public Point[] addPoint(Point[] points) {
                Point[] result = new Point[points.length + 1];
                for (int i = 0; i < points.length; i++)
                        result[i] = points[i];
                result[points.length] = new Point();
                return result;
        }

        private static String[] split(String strString, String
strDelimiter) {
                String[] strArray;
                int iOccurrences = 0;
                int iIndexOfInnerString = 0;
                int iIndexOfDelimiter = 0;
                int iCounter = 0;
                if (strString == null) {
                        throw new IllegalArgumentException("Input
string cannot be null.");
                }
                if (strDelimiter.length() <= 0 || strDelimiter ==
null) {
                        throw new IllegalArgumentException(
                                        "Delimeter cannot be null or
empty.");
                }
                if (strString.startsWith(strDelimiter)) {
                        strString =
strString.substring(strDelimiter.length());
                }
                if (!strString.endsWith(strDelimiter)) {
                        strString += strDelimiter;
                }
                while ((iIndexOfDelimiter =
strString.indexOf(strDelimiter,
                                iIndexOfInnerString)) != -1) {
                        iOccurrences += 1;
                        iIndexOfInnerString = iIndexOfDelimiter +
strDelimiter.length();
                }
                strArray = new String[iOccurrences];
                iIndexOfInnerString = 0;
                iIndexOfDelimiter = 0;
                while ((iIndexOfDelimiter =
strString.indexOf(strDelimiter,
                                iIndexOfInnerString)) != -1) {
                        strArray[iCounter] =
strString.substring(iIndexOfInnerString,
                                        iIndexOfDelimiter);
                        iIndexOfInnerString = iIndexOfDelimiter +
strDelimiter.length();
                        iCounter += 1;
                }

                return strArray;
        }
}

GoogleMapDemo.java


package com.tech.google.demo;


import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;



public class GoogleMapDemoActivity extends MapActivity {
        private static double lat=28.579015;
        private static double lon=77.327442;
        private int latE6;
        private int lonE6;
        private int latE61;
        private int lonE61;
        private int latE62;
        private int lonE62;
        MapView mapView;
        MapController mapControler;
        GeoPoint gp  , gp1 , gp2;
        Point screenPts , screenPts1 ;
         LinearLayout linearLayout;
     private Road mRoad;
         int check =0;
         int count = 0;
         double a =0 ;
         double b=0;
         double c=0;
         double d=0;
         Paint paint = new Paint();
         Projection projection;
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
                setContentView(R.layout.main);
                mapView = (MapView) findViewById(R.id.mapView);

                mapControler = mapView.getController();
                latE6 = (int) (lat * 1E6);
                lonE6 = (int) (lon * 1E6);
                gp = new GeoPoint(latE6, lonE6);
                mapControler.animateTo(gp);
                mapControler.setZoom(14);
                MapOverlay1 mapOverlay = new MapOverlay1();
         List<Overlay> overlays = mapView.getOverlays();
         projection = mapView.getProjection();
            overlays.add(mapOverlay);

     mapView.setBuiltInZoomControls(true);

        }
        Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
                TextView textView = (TextView)
findViewById(R.id.description);
                textView.setText(mRoad.mName + " " +
mRoad.mDescription);
                MapOverlay mapOverlay = new MapOverlay(mRoad,
mapView);
                List<Overlay> listOfOverlays = mapView.getOverlays();
                listOfOverlays.clear();
                listOfOverlays.add(mapOverlay);
                mapView.invalidate();
        };
};

private InputStream getConnection(String url) {
        InputStream is = null;
        try {
                URLConnection conn = new URL(url).openConnection();
                is = conn.getInputStream();
                Log.i("MapRoute" , "Value of is = "+is);
        } catch (MalformedURLException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
        }
        return is;
}
        @Override
        protected boolean isRouteDisplayed() {
                return false;
        }




        class MapOverlay extends com.google.android.maps.Overlay {
        Road mRoad;
        ArrayList<GeoPoint> mPoints;

        public MapOverlay(Road road, MapView mv) {
                mRoad = road;
                if (road.mRoute.length > 0) {
                        mPoints = new ArrayList<GeoPoint>();
                        for (int i = 0; i < road.mRoute.length; i++) {
                                mPoints.add(new GeoPoint((int)
(road.mRoute[i][1] * 1000000),
                                                (int) (road.mRoute[i]
[0] * 1000000)));
                        }
                        int moveToLat =
(mPoints.get(0).getLatitudeE6() + (mPoints.get(
                                        mPoints.size() -
1).getLatitudeE6() - mPoints.get(0)
                                        .getLatitudeE6()) / 2);
                        int moveToLong =
(mPoints.get(0).getLongitudeE6() + (mPoints.get(
                                        mPoints.size() -
1).getLongitudeE6() - mPoints.get(0)
                                        .getLongitudeE6()) / 2);
                        GeoPoint moveTo = new GeoPoint(moveToLat,
moveToLong);

                        MapController mapController =
mv.getController();
                        mapController.animateTo(moveTo);
                        mapController.setZoom(7);
                }
        }

        @Override
        public boolean draw(Canvas canvas, MapView mv, boolean shadow,
long when) {
                super.draw(canvas, mv, shadow);
                drawPath(mv, canvas);
                return true;
        }

        public void drawPath(MapView mv, Canvas canvas) {
                int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
                Paint paint = new Paint();
                paint.setColor(Color.GREEN);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(3);
                for (int i = 0; i < mPoints.size(); i++) {
                        Point point = new Point();
                        mv.getProjection().toPixels(mPoints.get(i),
point);
                        x2 = point.x;
                        y2 = point.y;
                        if (i > 0) {
                                canvas.drawLine(x1, y1, x2, y2,
paint);
                        }
                        x1 = x2;
                        y1 = y2;
                }
        }
}




        class MapOverlay1 extends com.google.android.maps.Overlay {


                public boolean draw(Canvas canvas, MapView mapView, boolean 
shadow,
                                long when) {
                        super.draw(canvas, mapView, shadow);
                        if(a==0 && b==0 && c==0 && d==0)
                        {
                        }


                        else
                        {
                                if((a!=0 && b!=0) ||(c==0 && d==0))
                                {

                                        screenPts = new Point();
                                        mapView.getProjection().toPixels(gp1, 
screenPts);

                                        Bitmap bmp =
BitmapFactory.decodeResource(getResources(),R.drawable.index);

                                        canvas.drawBitmap(bmp, screenPts.x, 
screenPts.y, null);

                                }

                                        if(check%2==0)
                                        {
                                                 
Toast.makeText(getBaseContext(), "Value of a = "+a + "Value of
b = "+b + "Value of c = "+c + "Value of d = "+d,
Toast.LENGTH_LONG).show();
                                                new Thread() {
                                                 @Override
                                                 public void run() {
                                                         double fromLat = a, 
fromLon = b, toLat = c,
toLon = d;

                                                         String url = 
RoadProvider
                                                                         
.getUrl(fromLat, fromLon, toLat,
toLon);
                                                         InputStream is = 
getConnection(url);
                                                         mRoad = 
RoadProvider.getRoute(is);
                                                         
mHandler.sendEmptyMessage(0);
                                                 }
                                         }.start();

                                                 paint.setDither(true);
                                                paint.setColor(Color.RED);
                                                
paint.setStyle(Paint.Style.FILL_AND_STROKE);
                                                
paint.setStrokeJoin(Paint.Join.ROUND);
                                                
paint.setStrokeCap(Paint.Cap.ROUND);
                                                paint.setStrokeWidth(5);

                                                screenPts1 = new Point();
                                                
mapView.getProjection().toPixels(gp2, screenPts1);
                                                Bitmap bmp =
BitmapFactory.decodeResource(getResources(),R.drawable.index);
                        //      int width =     bmp.getWidth();

                                                canvas.drawBitmap(bmp, 
screenPts.x, screenPts.y, null);

                                                Bitmap bmp1 =
BitmapFactory.decodeResource(getResources(),R.drawable.index);

                                                canvas.drawBitmap(bmp1, 
screenPts1.x, screenPts1.y, null);
                                        //      int width1 =    bmp1.getWidth();

                                                
//canvas.drawLine(screenPts.x+width-10, screenPts.y+width+27,
screenPts1.x+width1-10, screenPts1.y+width1+25, paint);

                                        }

                        }
                        return true;
                }

                public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{
                        if (event.getAction()==1)
                        {
                                GeoPoint p = 
mapView.getProjection().fromPixels((int)
event.getX(), (int) event.getY());
                        //      
Toast.makeText(getBaseContext(),p.getLatitudeE6() / 1E6 + "," +
p.getLongitudeE6()/ 1E6, Toast.LENGTH_SHORT).show();

                                if (count== 0)
                                {
                                 a=p.getLatitudeE6() / 1E6;
                                 b =p.getLongitudeE6()/ 1E6;
                                latE61 = (int) (a * 1E6);
                                lonE61 = (int) (b * 1E6);
                                gp1 = new GeoPoint(latE61, lonE61);
                                mapControler.animateTo(gp1);
                                mapControler.setZoom(14);
                                MapOverlay1 mapOverlay = new MapOverlay1();
                                List<Overlay> overlays = mapView.getOverlays();
                            overlays.add(mapOverlay);

                            count = 1;

                                }
                                else
                                {
                                     c=p.getLatitudeE6() / 1E6;
                                          d =p.getLongitudeE6()/ 1E6;
                                        latE62 = (int) (c * 1E6);
                                        lonE62 = (int) (d * 1E6);
                                        gp2 = new GeoPoint(latE62, lonE62);
                                        mapControler.animateTo(gp2);
                                        mapControler.setZoom(14);
                                        MapOverlay1 mapOverlay = new 
MapOverlay1();
                                        List<Overlay> overlays = 
mapView.getOverlays();
                                    overlays.add(mapOverlay);
                                    count = 0;

                                }

                            check++;
                        }
                        return true;
                }
        }



}


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/linear"
    android:orientation="vertical" >

    <view android:id="@+id/mapView"
        class="com.google.android.maps.MapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:clickable="true"
        android:apiKey="0a7bfmpNYPzjig6vEsqnM_JhjlFUVHo6PPwlgzw"
         />
<TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

</LinearLayout>


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android";
    package="com.tech.google.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:icon="@drawable/img"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".GoogleMapDemoActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category
android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <uses-library android:name="com.google.android.maps"/>
    </application>

</manifest>






Please help...

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to