Android: DrivingDirections удален с API 1.0 - как это сделать в 1.5 / 1.6? - PullRequest
1 голос
/ 23 октября 2009

Похоже, что DrivingDirections были удалены с Android API 1.0

Как теперь отобразить карту с двумя точками (одна из них может быть текущим, но может быть и любым другим местоположением) и направлением от одного к другому в Android 1.6?

Ответы [ 5 ]

4 голосов
/ 10 ноября 2011

Если вам просто нужна точка, соединенная линией, вам не нужен полный кмл. Более быстрый способ сделать это - просто использовать JSON, возвращенный из API Карт Google, с помощью output = dragdir

private String getUrl(String start, String end) {
    //If params GeoPoint convert to lat,long string here
    StringBuffer urlString = new StringBuffer();
    urlString.append("http://maps.google.com/maps?f=d&hl=en");
    urlString.append("&saddr=");// from
    urlString.append(start);
    urlString.append("&daddr=");// to
    urlString.append(end);
    urlString.append("&ie=UTF8&0&om=0&output=dragdir"); //DRAGDIR RETURNS JSON
    Log.i("URLString", urlString.toString());
    return urlString.toString();
}

Эта urlString может использоваться для получения файла JSON, который вы можете легко извлечь из информации с помощью функции String split ()

private String getConnection(String url) {
    URL inUrl = new URL(url);
    URLConnection yc = inUrl.openConnection();
    BufferedReader in = new BufferedReader( new InputStreamReader(yc.getInputStream()));
    String inputLine;
    String encoded = "";
    while ((inputLine = in.readLine()) != null)
        encoded = encoded.concat(inputLine);
    in.close();
    String polyline = encoded.split("points:")[1].split(",")[0];
    polyline = polyline.replace("\"", "");
    polyline = polyline.replace("\\\\", "\\");
    return polyline;
}

Возвращаемая строка - это ломаная линия, которую можно декодировать в список географических точек, используя метод, приведенный ниже.

private static ArrayList<GeoPoint> decodePolyline(String encoded) {
    ArrayList<GeoPoint> geopoints = new ArrayList<GeoPoint>();
    int index = 0, len = encoded.length();
    int lat = 0, lng = 0;
    while (index < len) {
        int b, shift = 0, result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
        geopoints.add(p);
    }
 return geopoints;
}

Последний шаг - нарисовать эти точки в mapView, для этого нам понадобится оверлейный элемент, который будет обрабатывать ArrayList GeoPoints.

public class PathOverlay extends Overlay {

    private ArrayList<GeoPoint> pointList;

    public PathOverlay(ArrayList<GeoPoint> pointList) {
            this.pointList = pointList;     
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        Point current = new Point();
        Path path = new Path();
        Projection projection = mapView.getProjection();
        Iterator<GeoPoint> iterator = pointList.iterator();
        if (iterator.hasNext()) {
            projection.toPixels(iterator.next(), current);
            path.moveTo((float) current.x, (float) current.y);
        } else return;
        while(iterator.hasNext()) {
            projection.toPixels(iterator.next(), current);
            path.lineTo((float) current.x, (float) current.y);
        }

        Paint pathPaint = new Paint();
        pathPaint.setAntiAlias(true);
        pathPaint.setStrokeWidth(3.0f);
        pathPaint.setColor(Color.GREEN);
        pathPaint.setStyle(Style.STROKE);
        canvas.drawPath(path, pathPaint);
    }
}

Если вы не уверены в некоторых промежуточных шагах, таких как, как получить оверлей на MapView или как настроить класс маршрутизатора, сообщите мне, и я могу отправить вам полный код.

2 голосов
/ 02 декабря 2009

Может быть, немного поздно, но все же полезно для других. Я написал несколько простых классов, чтобы получать и отображать маршруты проезда в MapView для Android:

http://home.ameliemedia.com/android-app-aroundme/#tips

Надеюсь, это поможет!

Andrea.

2 голосов
/ 23 октября 2009

Я подозреваю, что ответ заключается в том, чтобы подписаться на лицензию TeleNav или кого-либо на многомиллионную лицензию.

Причина, по которой API был удален, заключалась в том, что у самого Google есть ограничения на то, что он может делать с указаниями направления движения (например, не может выполнять пошаговые действия в реальном времени), поскольку Google лицензирует эти данные от TeleNav или других фирм. Google, в свою очередь, не может позволить разработчикам делать такие ограниченные вещи, и открытый API не может быть адекватно защищен в этом случае.

Мне показалось, что я упомянул, что в Open Street Map есть маршруты проезда, FWIW.

0 голосов
/ 16 сентября 2011

Текущее решение от Google заключается в использовании веб-служб API Карт Google . Бесплатно для ограниченного использования; Вы должны будете заплатить за (успешное) коммерческое использование.

0 голосов
/ 09 января 2010
...