Skip to content Skip to sidebar Skip to footer

Draw A Line In A Route Map

I want to draw a line in a route map. For that I use a code from here http://csie-tw.blogspot.com/2009/06/android-driving-direction-route-path.html . But It not works . It show thi

Solution 1:

Use Below Code for that.

MainActivity.java

publicclassMainActivityextendsMapActivity {
    LinearLayout linearLayout;
    MapView mapView;
    private Road mRoad;

    @OverridepublicvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);

        newThread() {
            @Overridepublicvoidrun() {
                doublefromLat=49.85, fromLon = 24.016667, toLat = 50.45, toLon = 30.523333;
                Stringurl= RoadProvider
                        .getUrl(fromLat, fromLon, toLat, toLon);
                InputStreamis= getConnection(url);
                mRoad = RoadProvider.getRoute(is);
                mHandler.sendEmptyMessage(0);
            }
        }.start();
    }

    HandlermHandler=newHandler() {
        publicvoidhandleMessage(android.os.Message msg) {
            TextViewtextView= (TextView) findViewById(R.id.description);
            textView.setText(mRoad.mName + " " + mRoad.mDescription);
            MapOverlaymapOverlay=newMapOverlay(mRoad, mapView);
            List<Overlay> listOfOverlays = mapView.getOverlays();
            listOfOverlays.clear();
            listOfOverlays.add(mapOverlay);
            mapView.invalidate();
        };
    };

    private InputStream getConnection(String url) {
        InputStreamis=null;
        try {
            URLConnectionconn=newURL(url).openConnection();
            is = conn.getInputStream();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }

    @OverrideprotectedbooleanisRouteDisplayed() {
        returnfalse;
    }
}

classMapOverlayextendscom.google.android.maps.Overlay {
    Road mRoad;
    ArrayList<GeoPoint> mPoints;

    publicMapOverlay(Road road, MapView mv) {
        mRoad = road;
        if (road.mRoute.length > 0) {
            mPoints = newArrayList<GeoPoint>();
            for (inti=0; i < road.mRoute.length; i++) {
                mPoints.add(newGeoPoint((int) (road.mRoute[i][1] * 1000000),
                        (int) (road.mRoute[i][0] * 1000000)));
            }
            intmoveToLat= (mPoints.get(0).getLatitudeE6() + (mPoints.get(
                    mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
                    .getLatitudeE6()) / 2);
            intmoveToLong= (mPoints.get(0).getLongitudeE6() + (mPoints.get(
                    mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
                    .getLongitudeE6()) / 2);
            GeoPointmoveTo=newGeoPoint(moveToLat, moveToLong);

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

    @Overridepublicbooleandraw(Canvas canvas, MapView mv, boolean shadow, long when) {
        super.draw(canvas, mv, shadow);
        drawPath(mv, canvas);
        returntrue;
    }

    publicvoiddrawPath(MapView mv, Canvas canvas) {
        intx1= -1, y1 = -1, x2 = -1, y2 = -1;
        Paintpaint=newPaint();
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);
        for (inti=0; i < mPoints.size(); i++) {
            Pointpoint=newPoint();
            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;
        }
    }
}

Add following classes

Point.java

publicclassPoint{
    String mName;
    String mDescription;
    String mIconUrl;
    double mLatitude;
    double mLongitude;
}

Road.java

publicclassRoad{
    publicString mName;
    publicString mDescription;
    publicint mColor;
    publicint mWidth;
    publicdouble[][] mRoute = newdouble[][] {};
    public Point[] mPoints = new Point[] {};
}

RoadProvider.java

publicclassRoadProvider {

    publicstatic Road getRoute(InputStream is) {
        KMLHandlerhandler=newKMLHandler();
        try {
            SAXParserparser= 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;
    }

    publicstatic String getUrl(double fromLat, double fromLon, double toLat,
            double toLon) {// connect to map web serviceStringBufferurlString=newStringBuffer();
        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");
        return urlString.toString();
    }
}

classKMLHandlerextendsDefaultHandler {
    Road mRoad;
    boolean isPlacemark;
    boolean isRoute;
    boolean isItemIcon;
    private Stack<String> mCurrentElement = newStack<String>();
    private String mString;

    publicKMLHandler() {
        mRoad = newRoad();
    }

    publicvoidstartElement(String uri, String localName, String name,
            Attributes attributes)throws SAXException {
        mCurrentElement.push(localName);
        if (localName.equalsIgnoreCase("Placemark")) {
            isPlacemark = true;
            mRoad.mPoints = addPoint(mRoad.mPoints);
        } elseif (localName.equalsIgnoreCase("ItemIcon")) {
            if (isPlacemark)
                isItemIcon = true;
        }
        mString = newString();
    }

    publicvoidcharacters(char[] ch, int start, int length)throws SAXException {
        Stringchars=newString(ch, start, length).trim();
        mString = mString.concat(chars);
    }

    publicvoidendElement(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;
                }
            } elseif (localName.equalsIgnoreCase("color") && !isPlacemark) {
                mRoad.mColor = Integer.parseInt(mString, 16);
            } elseif (localName.equalsIgnoreCase("width") && !isPlacemark) {
                mRoad.mWidth = Integer.parseInt(mString);
            } elseif (localName.equalsIgnoreCase("description")) {
                if (isPlacemark) {
                    Stringdescription= cleanup(mString);
                    if (!isRoute)
                        mRoad.mPoints[mRoad.mPoints.length - 1].mDescription = description;
                    else
                        mRoad.mDescription = description;
                }
            } elseif (localName.equalsIgnoreCase("href")) {
                if (isItemIcon) {
                    mRoad.mPoints[mRoad.mPoints.length - 1].mIconUrl = mString;
                }
            } elseif (localName.equalsIgnoreCase("coordinates")) {
                if (isPlacemark) {
                    if (!isRoute) {
                        String[] xyParsed = split(mString, ",");
                        doublelon= Double.parseDouble(xyParsed[0]);
                        doublelat= 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, " ");
                        intlenNew= coodrinatesParsed.length;
                        intlenOld= mRoad.mRoute.length;
                        double[][] temp = newdouble[lenOld + lenNew][2];
                        for (inti=0; i < lenOld; i++) {
                            temp[i] = mRoad.mRoute[i];
                        }
                        for (inti=0; i < lenNew; i++) {
                            String[] xyParsed = split(coodrinatesParsed[i], ",");
                            for (intj=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;
        } elseif (localName.equalsIgnoreCase("ItemIcon")) {
            if (isItemIcon)
                isItemIcon = false;
        }
    }

    private String cleanup(String value) {
        Stringremove="<br/>";
        intindex= value.indexOf(remove);
        if (index != -1)
            value = value.substring(0, index);
        remove = "&#160;";
        index = value.indexOf(remove);
        intlen= 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 = newPoint[points.length + 1];
        for (inti=0; i < points.length; i++)
            result[i] = points[i];
        result[points.length] = newPoint();
        return result;
    }

    privatestatic String[] split(String strString, String strDelimiter) {
        String[] strArray;
        intiOccurrences=0;
        intiIndexOfInnerString=0;
        intiIndexOfDelimiter=0;
        intiCounter=0;
        if (strString == null) {
            thrownewIllegalArgumentException("Input string cannot be null.");
        }
        if (strDelimiter.length() <= 0 || strDelimiter == null) {
            thrownewIllegalArgumentException(
                    "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 = newString[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;
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/description"android:layout_width="fill_parent"android:layout_height="wrap_content" /><com.google.android.maps.MapViewandroid:id="@+id/mapview"android:layout_width="fill_parent"android:layout_height="fill_parent"android:apiKey="Your API Key"android:clickable="true" /></LinearLayout>

Add below permissions into your android manifest file.

<uses-permissionandroid:name="android.permission.INTERNET"/>

Post a Comment for "Draw A Line In A Route Map"