нарисуйте короткий путь между двумя точками на карте - PullRequest
0 голосов
/ 22 марта 2012

Я занимаюсь приложением Google Map android.Я хочу нарисовать короткий путь между двумя точками на карте.Но я не знаю, как мне нужно?Пожалуйста, помогите мне. Большое спасибо.

1 Ответ

0 голосов
/ 23 марта 2012

новый класс util.java

public class Util {


    private DataBaseHelper dbHelper;
    private GeoFencApplicationDataset Dataset;
    private int getId;

    public static boolean checkConnection(Context mContext) {

        NetworkInfo info = ((ConnectivityManager) mContext
                .getSystemService(Context.CONNECTIVITY_SERVICE))
                .getActiveNetworkInfo();
        if (info == null || !info.isConnected()) {
            return false;
        }
        if (info.isRoaming()) {
            return true;
        }
        return true;
    }

    public void DrawPath(Context c, GeoPoint src, GeoPoint dest, int color,
            MapView mMapView01) {

        Dataset = (GeoFencApplicationDataset) c.getApplicationContext();
        dbHelper = Dataset.getDbHelper();

        StringBuilder urlString = new StringBuilder();
        urlString.append("http://maps.google.com/maps?f=d&hl=en");
        urlString.append("&saddr=");// from
        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) {
                 final String path = doc.getElementsByTagName("GeometryCollection")
                        .item(0).getFirstChild().getFirstChild()
                        .getFirstChild().getNodeValue();


                 final String[] pairs = path.split(" ");

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

                final GeoPoint startGP = new GeoPoint(
                        (int) (Double.parseDouble(lngLat[1]) * 1E6),
                        (int) (Double.parseDouble(lngLat[0]) * 1E6));
                mMapView01.getOverlays().add(
                        new PathOverLay(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 PathOverLay(gp1, gp2, 2, color));
                    if (getId != 0) {
                        dbHelper.insertTempLatLong(lngLat[1], lngLat[0], getId);
                    }
                    Log.d("xxx", "pair:" + pairs[i]);

                }

            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }

    }

    public double[] getLocation(Context c) {
        Criteria criteria;
        String provider;

        LocationManager locManager = (LocationManager) c
                .getSystemService(Context.LOCATION_SERVICE);

        criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);

        provider = locManager.getBestProvider(criteria, true);
        double[] loca = new double[2];
        // For Latitude & Longitude

        Location location = locManager.getLastKnownLocation(provider);
        if (location != null) {
            loca[0] = location.getLatitude();
            loca[1] = location.getLongitude();
        } else {
            loca[0] = 0.0;
            loca[1] = 0.0;
        }
        return loca;
    }

    public void setId(int id) {
        // TODO Auto-generated method stub
        getId = id;
    }

}

новый класс PathOverLay.java

public class PathOverLay 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 PathOverLay(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 PathOverLay(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&#65306;start
            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);
                RectF oval = new RectF(point.x - mRadius, point.y - mRadius,
                        point.x + mRadius, point.y + mRadius);
                // start point
                canvas.drawOval(oval, paint);
            }
            // mode=2&#65306;path
            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(70);
                canvas.drawLine(point.x, point.y, point2.x, point2.y, paint);

            }
            /* mode=3&#65306;end */
            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(120);
                canvas.drawOval(oval, paint);
            }
        }
        return super.draw(canvas, mapView, shadow, when);
    }

    // Read more:
    // http://csie-tw.blogspot.com/2009/06/android-driving-direction-route-path.html#ixzz1hte9kGoi

}

метод окончательного вызова ...

util = new Util();

        mapOverlays = mapView.getOverlays();

        util = new Util();
        util.setId(id);



GeoPoint srcGeoPoint = new GeoPoint((int) (destLat * 1E6),
                        (int) (destLong * 1E6));
                GeoPoint destGeoPoint = new GeoPoint((int) (srcLat * 1E6),
                        (int) (srcLong * 1E6));

                progrDialog = ProgressDialog.show(AddFenceActivity.this,
                        "", "Please Wait..", true);

                mapView.getOverlays().add(
                        new PathOverLay(srcGeoPoint,destGeoPoint, 2,Color.RED));
                util.DrawPath(AddFenceActivity.this, srcGeoPoint,
                        destGeoPoint, Color.RED, mapView);
                mapView.getController().animateTo(srcGeoPoint);





public class MapOverLayItem extends ItemizedOverlay<OverlayItem> {

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    Context mContext;

    public MapOverLayItem(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
        // TODO Auto-generated constructor stub
    }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        // TODO Auto-generated method stub
        return mOverlays.get(i);

    }

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return mOverlays.size();

    }

    public MapOverLayItem(Drawable defaultMarker, Context context) {
        super(defaultMarker);
        mContext = context;
    }

}
...