Разница версий API Карт Google

Я пытаюсь показать маршрут между двумя местами, я хочу использовать Google Places API V3 для шагов маршрута между двумя точками.


До того, как я использовал Старый API Карт Google, и следующий запрос дает отличный результат:

http://maps.google.com/maps?f=d&hl=en&saddr=19.5217608,-99.2615823&daddr=19.531224,-99.248262&ie=UTF8&0&om=0&output=kml

Выход:

Old Google Maps API


Теперь я пытаюсь заменить это новым API Карт Google, и следующий запрос дает неправильный результат. В обоих случаях я использую тот же источник и пункт назначения, но результат дает другое поведение на Карте Google:

http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false

New Google Maps API

Моя проблема заключается в том, что новый API Карт Google возвращает меньшее количество шагов между источником и получателем, поэтому маршрут не отображается на карте Google.

Пожалуйста, помогите решить эту проблему для нового API Карт Google v3.

Спасибо заранее.

Ответ 1

Что нового в Google Map API v3?
Google Maps Directions API v3 для Android предусмотрены маршруты в Encoded Polyline Algorithm Format.

Что нам нужно делать?
We must have to decode this Polyline for showing exact Map

Как мы декодируем эту закодированную полилинию, предоставленную Google Directions API v3?
Пожалуйста, ознакомьтесь с этими тремя ссылками, чтобы получить более четкое представление с зашифрованной Полилинией от Google Maps Directions API v3

Как мы можем решить проблему в вышеуказанном вопросе?
Пожалуйста, обратитесь к этим трем ответам, которые решают вашу проблему:

Ответ 2

Я взял ваш URL-адрес запроса и вставил его в свое приложение, которое использует новую версию, и оно отлично работает. Проблема может заключаться в том, как вы анализируете данные или декодируете полученную строку JSON. enter image description here

String url = "http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false";

HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream is = null;
is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
    sb.append(line + "\n");
}
is.close();
reader.close();
String result = sb.toString();
JSONObject jsonObject = new JSONObject(result);
JSONArray routeArray = jsonObject.getJSONArray("routes");
JSONObject routes = routeArray.getJSONObject(0);
JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
String encodedString = overviewPolylines.getString("points");
List<GeoPoint> pointToDraw = decodePoly(encodedString);

//Added line:
mapView.getOverlays().add(new RoutePathOverlay(pointToDraw));

и метод decodePoly() берется из другого вопроса здесь, в SO, который я не помню автора:

private List<GeoPoint> decodePoly(String encoded) {

    List<GeoPoint> poly = 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));
        poly.add(p);
    }

    return poly;
}

Я включаю то, что я использовал, чтобы добавить наложение к самой карте, Я не могу найти учебник, из которого он взят. Извините за то, что не отдал должное. (добавлен призыв к этому в первом методе, который я опубликовал)

public class RoutePathOverlay extends Overlay {

    private int _pathColor;
    private final List<GeoPoint> _points;
    private boolean _drawStartEnd;

    public RoutePathOverlay(List<GeoPoint> points) {
            this(points, Color.RED, true);
    }

    public RoutePathOverlay(List<GeoPoint> points, int pathColor, boolean drawStartEnd) {
            _points = points;
            _pathColor = pathColor;
            _drawStartEnd = drawStartEnd;
    }


    private void drawOval(Canvas canvas, Paint paint, Point point) {
            Paint ovalPaint = new Paint(paint);
            ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            ovalPaint.setStrokeWidth(2);
            int _radius = 6;
            RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius);
            canvas.drawOval(oval, ovalPaint);               
    }

    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
            Projection projection = mapView.getProjection();
            if (shadow == false && _points != null) {
                    Point startPoint = null, endPoint = null;
                    Path path = new Path();
                    //We are creating the path
                    for (int i = 0; i < _points.size(); i++) {
                            GeoPoint gPointA = _points.get(i);
                            Point pointA = new Point();
                            projection.toPixels(gPointA, pointA);
                            if (i == 0) { //This is the start point
                                    startPoint = pointA;
                                    path.moveTo(pointA.x, pointA.y);
                            } else {
                                    if (i == _points.size() - 1)//This is the end point
                                            endPoint = pointA;
                                    path.lineTo(pointA.x, pointA.y);
                            }
                    }

                    Paint paint = new Paint();
                    paint.setAntiAlias(true);
                    paint.setColor(_pathColor);
                    paint.setStyle(Paint.Style.STROKE);
                    paint.setStrokeWidth(5);
                    paint.setAlpha(90);
                    if (getDrawStartEnd()) {
                            if (startPoint != null) {
                                    drawOval(canvas, paint, startPoint);
                            }
                            if (endPoint != null) {
                                    drawOval(canvas, paint, endPoint);
                            }
                    }
                    if (!path.isEmpty())
                            canvas.drawPath(path, paint);
            }
            return super.draw(canvas, mapView, shadow, when);
    }

    public boolean getDrawStartEnd() {
            return _drawStartEnd;
    }

    public void setDrawStartEnd(boolean markStartEnd) {
            _drawStartEnd = markStartEnd;
    }
}

Надеюсь, это сработает для вас.

Ответ 3

Вы не используете все точки, возвращенные в результате. Вы не указали свой код, но вот пример с API v3, который показывает тот же путь, что и возвращаемые вашими "картами google", пример.

Ответ 4

Пожалуйста, проверьте эту ссылку .

И укажите Режимы перемещения

-- driving
-- walking 
-- bicycling 
-- transit 

чтобы получить разные результаты.

попробуйте.

Ответ 5

Что касается того, что GeoPoint не решен, я просто изменил все события GeoPoint на LatLng, и все сработало.

Ответ 6

Решение выше, размещенное https://stackoverflow.com/users/975959/la-bla-bla, отлично работает с Google Maps API V2, но для него требуются небольшие модификации:
Замените все вхождения GeoPoint на LatLng.
Замените строку:

GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));

который находится непосредственно перед завершением метода decodePoly, с этой строкой:

LatLng p = new LatLng(lat / 1E5, lng / 1E5);

Надеемся, что это будет работать для пользователей Google Maps API v2.

Ответ 7

Я использовал решение, данное "La bla bla", но сделал некоторые небольшие изменения. У меня возникла проблема с отображением пути, когда у меня было слишком много очков, когда вы слишком сильно увеличиваете масштаб, маршрут больше не отображается, и вы получаете это сообщение в логарифмическом "слишком длинном пути формы для визуализации в текстуру".

То, что я сделал, заключалось в том, чтобы разделить путь следующим образом:

if (shadow == false && _points != null) {
        Path path = new Path();;
        //We are creating the path
        Point pointA = new Point();
        for (int i = 0; i < _points.size(); i++) {
            mapView.getProjection().toPixels(_points.get(i), pointA);
            if (i == 0) path.moveTo(pointA.x, pointA.y);                
            else path.lineTo(pointA.x, pointA.y);

            if(i%10==0 || i == _points.size()-1){
                Paint paint = new Paint();
                paint.setAntiAlias(true);
                paint.setColor(_pathColor);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeJoin(Paint.Join.ROUND);
                paint.setStrokeCap(Paint.Cap.ROUND);
                paint.setStrokeWidth(mapView.getZoomLevel()-10);
                paint.setAlpha(200);
                if (!path.isEmpty()) canvas.drawPath(path, paint);
                path = new Path();
                path.moveTo(pointA.x, pointA.y);
            }
        }
    }

Я делаю маршруты каждые 10 пунктов, он может быть менее эффективным, но таким образом вы можете отобразить путь, когда масштаб имеет большие значения.

Ответ 8

@Ghareeb-Strange - Но зачем нам это нужно с API v2? Я имею в виду, что у нас есть полилиния, которая делает ее более простой.

private void drawPath(){
        PolylineOptions options = new PolylineOptions();
        options.width(4);
        options.color(Color.RED);
        for(int i = 0; i< pathList.size(); i++ ){
            options.add(pathList.get(i));
        }
        map.addPolyline(options);
    }

С чем-то вроде кода, вышедшего выше, у вас будет отличный путь в вашем приложении.

pathList - это список, содержащий все точки нашего пути.

Ура!

Ответ 9

Кажется, что ответов достаточно, но по этому вопросу я получаю выгоду от этой . Но это не сработало, когда я загрузил и импортировал. Поэтому я реализовал свое приложение. И в этом коде есть ошибка. Когда вы хотите во второй раз вычислить маршрут, приложение. брейки.

    if (mMarkerPoints.size() > 1) {

                mMarkerPoints.clear();
                map.clear();
                // LatLng startPoint = new LatLng(nearbyLatitude,
                // nearbyLongitude);
                // drawMarker(startPoint);
            }

Найдите эти строки и сделайте комментарий, как я сделал. Во всяком случае, на самом деле вы попросили нарисовать маршрут не весь код, чтобы вы могли проверить код на этом веб-сайте. Хорошо провести маршрут между точками (маркерами). Удачного дня.