9

Stavo giocando con l'API V2 di Google Maps su Android. Cercando di ottenere un percorso tra 2 posizioni e facendo questo con l'analisi JSON.Disegno di un percorso tra 2 posizioni API di Google Maps Android V2

Sto ottenendo un percorso. e il percorso inizia come dovrebbe essere. ma poi a un certo punto va nella direzione sbagliata.

La mia destinazione finisce male. E con alcune altre posizioni la mia app viene appena terminata.

Questo è ciò che ho fatto

Ecco il mio metodo makeURL

public String makeUrl(){ 
    StringBuilder urlString = new StringBuilder(); 
    urlString.append("http://maps.googleapis.com/maps/api/directions/json"); 
    urlString.append("?origin="); //start positie 
    urlString.append(Double.toString(source.latitude)); 
    urlString.append(","); 
    urlString.append(Double.toString(source.longitude)); 
    urlString.append("&destination="); //eind positie 
    urlString.append(Double.toString(dest.latitude)); 
    urlString.append(","); 
    urlString.append(Double.toString(dest.longitude)); 
    urlString.append("&sensor=false&mode=driving"); 

    return urlString.toString(); 
} 

mia JSON parser

public class JSONParser { 

static InputStream is = null; 
static JSONObject jObj = null; 
static String json = ""; 

public JSONParser() { 
    // TODO Auto-generated constructor stub 
} 

public String getJSONFromURL(String url){ 

    try { 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 

     is = httpEntity.getContent(); 
    } catch(UnsupportedEncodingException e){ 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 

     while((line = reader.readLine()) != null){ 
      sb.append(line + "\n"); 
      //Log.e("test: ", sb.toString()); 
     } 

     json = sb.toString(); 
     is.close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     Log.e("buffer error", "Error converting result " + e.toString()); 
    } 

    return json; 
} 

traggo il mio percorso con questo metodo

public void drawPath(String result){ 
    try{ 
     final JSONObject json = new JSONObject(result); 
     JSONArray routeArray = json.getJSONArray("routes"); 
     JSONObject routes = routeArray.getJSONObject(0); 

     JSONObject overviewPolylines = routes.getJSONObject("overview_polyline"); 
     String encodedString = overviewPolylines.getString("points"); 
     Log.d("test: ", encodedString); 
     List<LatLng> list = decodePoly(encodedString); 

     LatLng last = null; 
     for (int i = 0; i < list.size()-1; i++) { 
      LatLng src = list.get(i); 
      LatLng dest = list.get(i+1); 
      last = dest; 
      Log.d("Last latLng:", last.latitude + ", " + last.longitude); 
      Polyline line = googleMap.addPolyline(new PolylineOptions().add( 
        new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude)) 
        .width(2) 
        .color(Color.BLUE)); 
     } 

     Log.d("Last latLng:", last.latitude + ", " + last.longitude); 
    }catch (JSONException e){ 
     e.printStackTrace(); 
    } 
} 

E io deco de la mia JSON con

private List<LatLng> decodePoly(String encoded){ 

    List<LatLng> poly = new ArrayList<LatLng>(); 
    int index = 0; 
    int length = encoded.length(); 
    int latitude = 0; 
    int longitude = 0; 

    while(index < length){ 
     int b; 
     int shift = 0; 
     int result = 0; 

     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 

     int destLat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     latitude += destLat; 

     shift = 0; 
     result = 0; 
     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b > 0x20); 

     int destLong = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     longitude += destLong; 

     poly.add(new LatLng((latitude/1E5),(longitude/1E5))); 
    } 
    return poly; 
} 

E poi codificato con un'AsyncTask

Grazie in anticipo.

+0

Grazie per la condivisione del codice ha aiutato. :) – rptwsthi

risposta

2

Ci scusiamo per la lunga attesa .. l'ho risolto qualche tempo fa ma non avevo ancora messo la mia soluzione qui.

era fondamentalmente un errore di battitura ...

Nel mio decoder JSON ho utilizzare 2 Do while con

while (b >= 0x20); 

Nel secondo Do While ho dimenticato il "=". Quindi non era il rendering correttamente ...

grazie

1

Credo che si stiano creando gli oggetti LatLng da overview_polyline. Questo, secondo la documentazione di Google "contiene un oggetto contenente una matrice di punti codificati che rappresentano un percorso approssimativo (levigato) delle direzioni risultanti.".

Sono abbastanza sicuro che si può ottenere un percorso più dettagliata costruire il vostro oggetto LatLng sulla base di legs[] e steps[] dati come documentazione ufficiale afferma che Un passo è l'unità più atomica del percorso di una direzione, contenente un solo passo che descrive una singola istruzione specifica sul viaggio.

Date un'occhiata a:

https://developers.google.com/maps/documentation/directions/#Routes

0

Tmichel, Michael ha l'onda correttamente, in quanto su gambe e passaggi sul vostro diagramma percorso la linea fuori dalla strada. Legs and steps, ha informazioni sulle coordinate per le informazioni da avvisare dell'utente.

Le polilinee sono i punti corretti e precisi sulla strada. Scusate il mio cattivo inglese