18

Sto tentando di mostrare il percorso tra due posizioni, voglio utilizzare Google Places API V3 per i passaggi del percorso tra due punti.API di Google Maps Differenza di versione


Prima usavo Old Google Maps API, e in seguito alla richiesta dà risultato perfetto:

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 

uscita:

Old Google Maps API


Ora cerco di sostituirlo con Nuova API di Google Maps, e in seguito alla richiesta dà risultato sbagliato, In entrambi i casi Sto utilizzando stessa origine e di destinazione, ma risultato dà un comportamento diverso su Google Map:

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

New Google Maps API

mio problema è che, nuovo Google Maps API di ritorno meno passaggi tra sorgente e destinazione, quindi la rotta non è perfetta su Google Map.

Si prega di aiutare a risolvere questo problema per la nuova v3 API di Google Maps.

Grazie in anticipo.

risposta

16

Quali sono le novità di Google Maps API v3?
Google Maps Directions API v3 per Android fornire percorsi nel Encoded Polyline Algorithm Format.

Cosa dobbiamo fare?
We must have to decode this Polyline for showing exact Map

Come decodificare questo Polilinea codificato fornito da Google Indicazioni API v3?
fare riferimento questi tre collegamenti a più chiare con rendimenti Polilinea codificati dalla Google Maps Directions API v3

Come possiamo risolvere il problema in domanda di cui sopra?
prega di fare riferimento questi tre collegamenti risposta, che risolve il problema:

1

Si prega di controllare questo link..

e specificare Modi di viaggio

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

in modo da ottenere risultati diversi.

per favore provalo.

21

Ho preso l'URL della richiesta e l'ho incollato nella mia app, che utilizza la versione più recente, e funziona benissimo. Il problema potrebbe essere il modo in cui si analizzano i dati o si decodifica la stringa JSON ricevuta. 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)); 

e il metodo decodePoly() è preso da un'altra domanda qui a SO, che non ricordo l'autore:

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

sto tra cui quello che ho usato al fine di aggiungi la sovrapposizione alla mappa stessa, Non riesco a trovare il tutorial da cui è tratto .. scusa per non aver dato credito. (aggiunta la chiamata a questo nel primo metodo che ho postato)

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

Spero che questo funzioni per voi.

+0

Ho modificato l'analisi dei par su json parsing usando questa risposta. Grazie, ottima risposta. – Murat

+0

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

+0

Funziona! Grazie amico per aver messo tutto insieme! – AlexAndro

0

Per quanto riguarda GeoPoint essere risolto, ho appena cambiato tutte le occorrenze di GeoPoint a LatLng e tutto ha funzionato.

0

La soluzione di cui sopra postato da https://stackoverflow.com/users/975959/la-bla-bla funziona molto bene con Google Maps API V2, ma ha bisogno di qualche piccola modifica:
sostituire tutte le occorrenze di GeoPoint con LatLng.
sostituire la riga:

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

che si trova appena prima della fine del metodo decodePoly, con questa linea:

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

Spero che questo funziona per gli utenti di Google Maps API v2.

0

Ho usato la soluzione fornita da "La bla bla", ma ho apportato alcune piccole modifiche. Stavo riscontrando un problema nella visualizzazione del percorso quando avevo troppi punti, quando ingrandisci troppo, il percorso non viene più visualizzato e ottieni questo messaggio in logcat "Percorso di forma troppo grande per essere sottoposto a rendering in una trama".

Quello che ho fatto è stato quello di suddividere il percorso nel modo seguente:

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

faccio percorsi ogni 10 punti, può essere meno efficiente, ma in questo modo è possibile visualizzare il percorso quando lo zoom è in valori alti.

0

@ Ghareeb-Strange- Ma perché dovremmo averne bisogno con l'API v2? Voglio dire, abbiamo una polilinea che rende tutto più semplice.

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

Con qualcosa come il codice pubblicato sopra, avresti il ​​percorso perfettamente disegnato nella tua app.

pathList è un elenco contenente tutti i punti del nostro percorso.

Cheers!

0

Sembra che ci siano abbastanza risposte ma per questo argomento, sono a favore di questo link. Ma non ha funzionato quando ho scaricato e importato. Così ho implementato la mia applicazione. E c'è un errore in quel codice. Quando vuoi calcolare la seconda volta un percorso, l'app. pause.

if (mMarkerPoints.size() > 1) { 

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

Trova le righe e commenta come ho fatto. Ad ogni modo, in realtà hai chiesto di disegnare un percorso non intero codice, in modo da poter controllare il codice su quel sito web. È bravo a tracciare la rotta tra i punti (marcatori). Buona giornata.