I'm trying to validate a clickable route functionality using google
map API.

I established route display between two coordinates using the map API.

To realize this, I used the following tutorial
http://csie-tw.blogspot.com/2009/06/android-driving-direction-route-path.html
,
which basically parse a KML file (the response of a google map
direction request) and use a custom map overlay to draw a route.

**Custom Overlay :**

    package com.test.route;

    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.graphics.RectF;
    import android.util.Log;
    import android.view.MotionEvent;

    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 MyOverLay extends Overlay
    {
      private GeoPoint gp1;
      private GeoPoint gp2;
      private int mRadius=6;
      private int mode=0;
      private int defaultColor;
      private String text="";
      private Bitmap img = null;


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

      public void setText(String t)
      {
          this.text = t;
      }

      public void setBitmap(Bitmap bitmap)
      {
          this.img = bitmap;
      }

      public int getMode()
      {
          return mode;
      }

      @Override
      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);


          Point point = new Point();
          projection.toPixels(gp1, point);
          // mode=1¡Gstart
          if(mode==1)
          {
                if(defaultColor==999)
                        paint.setColor(Color.BLUE);
                else
                        paint.setColor(defaultColor);


                RectF oval=new RectF(point.x - mRadius, point.y - mRadius,
                                                         point.x + mRadius, 
point.y + mRadius);
                // start point
                canvas.drawOval(oval, paint);
          }
          // mode=2¡Gpath
          else 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);
          }
          /* mode=3¡Gend */
          else if(mode==3)
          {
                /* the last path */

                if(defaultColor==999)
                        paint.setColor(Color.GREEN);
                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);


                RectF oval=new RectF(point2.x - mRadius,point2.y - mRadius,
                                                         point2.x + 
mRadius,point2.y + mRadius);
                /* end point */
                paint.setAlpha(255);
                canvas.drawOval(oval, paint);
          }
          /* mode=4¡Gcar */
          else if(mode==4)
          {

                if(defaultColor==999)
                        paint.setColor(Color.GREEN);
                else
                        paint.setColor(defaultColor);

                Point point2 = new Point();
                projection.toPixels(gp2, point2);
                paint.setTextSize(20);
                paint.setAntiAlias(true);
                canvas.drawBitmap(img, point2.x, point2.y,paint);
                canvas.drawText(this.text, point2.x, point2.y, paint);
          }

          else if(mode==5)
          {

                if(defaultColor==999)
                        paint.setColor(Color.GREEN);
                else
                        paint.setColor(defaultColor);

                Point point2 = new Point();
                projection.toPixels(gp2, point2);
                paint.setTextSize(20);
                paint.setAntiAlias(true);
                canvas.drawBitmap(img, point2.x, point2.y,paint);

          }



        }
        return super.draw(canvas, mapView, shadow, when);
      }

      @Override
      public boolean onTouchEvent(MotionEvent event, MapView mapView)
      {
          Log.i("Map", "Clicked");
          return false;
      }
    }

**Test Map Activity :**

    package com.test.route;

    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.w3c.dom.Document;
    import org.xml.sax.SAXException;

    import android.content.Intent;
    import android.graphics.Color;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log;

    import com.dailymates.carmate.utils.MyOverLay;
    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapView;

    public class TestMap extends MapActivity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.map);
                MapView mapView = (MapView) findViewById(R.id.mapview);
                /*
                 * Defining the starting and end point of the route (latitude /
longitude)
                 * Oh Paris
                 *
                 */
                final double src_lat = 48.847378;
                final double src_long = 2.340417;
                final double dest_lat = 48.931466;
                final double dest_long = 2.504525;

                GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),
                                (int) (src_long * 1E6));
                GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),
                                (int) (dest_long * 1E6));

                DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);

                mapView.getController().animateTo(srcGeoPoint);
                mapView.getController().setZoom(12);

        }

        protected boolean isRouteDisplayed() {
                return false;
        }

        private void DrawPath(GeoPoint src, GeoPoint dest, int color,
MapView mMapView01) {

                StringBuilder urlString = new StringBuilder();
                urlString.append("http://maps.google.com/maps?f=d&hl=en";);
                urlString.append("&saddr=");
                urlString.append(Double.toString((double) src.getLatitudeE6() /
1.0E6));
                urlString.append(",");
                urlString.append(Double.toString((double) src.getLongitudeE6() /
1.0E6));
                urlString.append("&daddr=");// to
                urlString.append(Double.toString((double) dest.getLatitudeE6() /
1.0E6));
                urlString.append(",");
                urlString.append(Double.toString((double)
dest.getLongitudeE6() / 1.0E6));
                urlString.append("&ie=UTF8&0&om=0&output=kml");

                Log.d("xxx", "URL=" + urlString.toString());

                Document doc = null;
                HttpURLConnection urlConnection = null;
                URL url = null;
                try {
                        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()
                                                .getFirstChild().getNodeValue();

                                Log.d("xxx", "path=" + path);

                                String[] pairs = path.split(" ");
                                String[] lngLat = pairs[0].split(",");

                                // lngLat[0]=longitude
                                // lngLat[1]=latitude
                                // lngLat[2]=height

                                GeoPoint startGP = new GeoPoint((int)
(Double.parseDouble(lngLat[1]) * 1E6),
                                                (int) 
(Double.parseDouble(lngLat[0]) * 1E6));
                                mMapView01.getOverlays().add(new 
MyOverLay(startGP, startGP,
1));

                                GeoPoint gp1;
                                GeoPoint gp2 = startGP;
                                for (int i = 1; i < pairs.length; i++)
                                {
                                        lngLat = pairs[i].split(",");
                                        gp1 = gp2;
                                        gp2 = new GeoPoint(
                                                        (int) 
(Double.parseDouble(lngLat[1]) * 1E6),
                                                        (int) 
(Double.parseDouble(lngLat[0]) * 1E6));
                                        mMapView01.getOverlays().add(
                                                        new MyOverLay(gp1, gp2, 
2, color));

                                        Log.d("xxx", "pair:" + pairs[i]);

                                }
                                mMapView01.getOverlays().add(new 
MyOverLay(dest, dest, 3));
                        }
                } catch (MalformedURLException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                } catch (ParserConfigurationException e) {
                        e.printStackTrace();

                } catch (SAXException e) {

                        e.printStackTrace();
                }

        }
    }


So, as I said, I correctly get a route drawing.
But how could I handle click events on those drawn routes ?

For information, I was thinking about something which would probably
be inefficient, but I'll tell it, we never knows :)

Since the route establishement is basicaly a succession of drawings
beetween two geopoints (segments), we could prehaps handle route
clicking this way :

 - Using the `onTouchEvent` method of the map overlay, we can get the
geopoint associated to a click.
 - Then we try to establish if the clicked geopoint is part of a route
segment.

One last information : Several routes will be drawn on the map at the
same instant, so the click must be associated to a unique route and
not all of them.

Thanks.

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