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 = " "; 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

