Разница версий 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

Выход:

Старый API Карт Google


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

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

Новый API Карт Google

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

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

Заранее спасибо.

9 ответов

Решение

Что нового в 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

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

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

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

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

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

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

И укажите режимы путешествия

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

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

пожалуйста, попробуйте.

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

    if (mMarkerPoints.size() > 1) {

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

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

@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 - это список, содержащий все точки нашего пути.

Ура!

Вышеуказанное решение, опубликованное La bla bla очень хорошо работает с API Карт Google 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.

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

Что я сделал, так это разделил путь следующим образом:

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 точек, это может быть менее эффективно, но таким образом вы можете отображать траекторию при больших значениях масштаба.

Что касается неразрешенности GeoPoint, я просто изменил все вхождения GeoPoint на LatLng, и все заработало.

Другие вопросы по тегам