0

I'm searching for a few hours right now, and i can't seem to reach any solution. I am developing an app that displays some reference points in a map. I want to draw the road path between these points, and show the respective directions inside my app. I don't want to launch google maps app to show those informations there.

Is this possible? If yes, can you point some tutorials?

Thks in advance.

Paulo Rodrigues
  • 593
  • 14
  • 32

3 Answers3

3

KML Output is not working anymore on google maps. You must use the directions api to get routes from google.

http://maps.googleapis.com/maps/api/directions/xml?origin={lat_lon_origin}&destination={lat_lon_dest}&ie=UTF8&oe=UTF8&0&om=0&sensor=false

See this post for infos:

Google Maps API Version difference

Community
  • 1
  • 1
1

Sure this is possible. There are enough tutorials on the net about this. One search request gives me the following results:

Have a look at API demos at the Android Developer site :

http://developer.android.com/resources/tutorials/views/hello-mapview.html

for a starting point for implementing a MapView.

In this stack overflow thread, your can find an answer on your question about drawing route on map:

How to display a route between two geocoords in google maps?

Tip: Search first on the Android Developers site and on stack-overflow before asking a question.

Have nice development!

Kr

Community
  • 1
  • 1
pinyin_samu
  • 174
  • 1
  • 12
  • I have the map and the markers already...I just need a way to show the path. I've searched on stackoverflow too and the only answers would draw a line path between points, not considering the roads etc. That link you gave, i also saw it before..The thing about it is that it makes calls to the google maps url..I wanted to know if there was some "clean" method to do this, withouth dealing with XML and requests... – Paulo Rodrigues Jun 10 '12 at 12:23
0

I have done walking and driving directions with drawing path on map. For that i use 2 locations.; 1)current location lat and lon 2) user click on marker to show path between point 1 and 2. for that you just need to get lat and long of clicked marker point than my code is useful.

    drawPath(Utils.ConvertToFloat(kiosk.Lat),
    Utils.ConvertToFloat(kiosk.Lon), true);

Function is:

private void drawPath(final double lat, final double lon,
        final boolean isWalking) {
    new Thread() {
        @Override
        public void run() {
            double fromLat = 0, fromLon = 0, toLat, toLon;
            if (curLocation != null) {
                fromLat = curLocation.getLatitude();
                fromLon = curLocation.getLongitude();
            }
            toLat = lat;
            toLon = lon;
            // For Testing
            // fromLat = 36.00;
            // fromLon = -115.16116333007813;
            String url = RoadProvider.getUrl(fromLat, fromLon, toLat,
                    toLon, isWalking);
            InputStream is = getConnection(url);
            mRoad = RoadProvider.getRoute(is);
            mHandler.sendEmptyMessage(0);
        }
    }.start();
}
   Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {

        MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
        List<Overlay> listOfOverlays = mapView.getOverlays();
        ArrayList<Overlay> objs = new ArrayList<Overlay>();

        for (Overlay o : listOfOverlays) {
            if (o instanceof MapOverlay) {
                objs.add(o);
            }
        }
        for (Overlay overlay : objs) {
            listOfOverlays.remove(overlay);
        }
        // listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);
        mapView.invalidate();
    };
};

here is where path is drawn::

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

    @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);
        if (mPoints != null && mPoints.size() > 0) {

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

You need these 3 files in same or different package.

point.java

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

}

Road.java

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

  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();
            }
            return handler.mRoad;
    }

    public static String getUrl(double fromLat, double fromLon, double toLat,
                    double toLon, boolean isWalking) {// 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");
            if(isWalking){
                urlString.append("&dirflg=w");
            }
            Utils.LogInfo(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, " ");
                                            int lenNew = coodrinatesParsed.length;
                                            int lenOld = mRoad.mRoute.length;
                                            double[][] temp = new double[lenOld + lenNew][2];
                                            for (int i = 0; i < lenOld; i++) {
                                                    temp[i] = mRoad.mRoute[i];
                                            }
                                            for (int i = 0; i < lenNew; i++) {
                                                    String[] xyParsed = split(coodrinatesParsed[i], ",");
                                                    for (int j = 0; j < 2 && j < xyParsed.length; j++)
                                                            temp[lenOld + i][j] = Double
                                                                            .parseDouble(xyParsed[j]);
                                            }
                                            mRoad.mRoute = temp;
                                    }
                            }
                    }
            }
            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;
    }

}

Tell me if you need any other code..

djk
  • 3,671
  • 9
  • 31
  • 40