18

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


Прежде чем я использовал Old Google Maps API, и после запроса дает прекрасный результат:

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.

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

ответ

16

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

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

1

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

и указать Режимы Путешествия

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

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

попробуйте.

3

Вы не используете все точки, возвращенные в результате. Вы не указали свой код, но here is an example with the v3 API, который показывает тот же путь, что и на вашем примере с Google Maps.

21

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

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

+0

Я изменил парсинг kml на синтаксический анализ json с использованием этого ответа. Спасибо, отличный ответ. – Murat

+0

amaziingggg .. !!!!!!!!!! – sephtian

+0

Он работает! Спасибо человеку за то, что он все вместе! – AlexAndro

0

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

0

Раствор выше отправленный 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

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

0

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

Cheers!

0

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

if (mMarkerPoints.size() > 1) { 

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

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