it-swarm.com.ru

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

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


До того, как я использовал Старый 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.

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

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

18
Dipali

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

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

16
Hitesh Patel

Я взял 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;
    }
}

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

21
La bla bla

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

3
geocodezip

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

И укажите режимы движения

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

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

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

1
Nikhil

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

0
user330844

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

    if (mMarkerPoints.size() > 1) {

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

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

0
Ensar

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

0
ivanhoe_gg

Вышеупомянутое решение, опубликованное 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.

0
Ghareeb Falazi

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

Ура!

0
ivanhoe_gg