9

Ich spielte mit der Google Maps API V2 auf Android. Der Versuch, einen Pfad zwischen zwei Orten zu erhalten und dies mit dem JSON-Parsing zu tun.Zeichnen einer Route zwischen zwei Standorten Google Maps API Android V2

Ich bekomme eine Route. und die Route beginnt, wie es sein sollte. Aber irgendwann geht es in die falsche Richtung.

Mein Endziel endet falsch. Und mit einigen anderen Orten wird meine App gerade beendet.

Das ist, was ich

hier getan haben meine makeURL Methode ist

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

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

Ich ziehe meinen Weg mit dieser Methode

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

Und ich Deko de meine JSON mit

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

und dann mit einem

Vielen Dank im Voraus AsyncTask codiert.

+0

Vielen Dank für den Code teilen, es half. :) – rptwsthi

Antwort

2

Sorry für die lange Wartezeit .. Ich habe es vor einiger Zeit behoben, aber ich hatte meine Lösung hier noch nicht gesetzt.

Es war im Grunde ein Tippfehler ...

In meinem Json Decoder ich verwende 2 Do Statements mit

while (b >= 0x20); 

In dem zweiten Do While-Anweisung i die "=" vergessen. Daher war es nicht richtig machen ...

dank

1

Ich glaube, dass Sie Ihre LatLng Objekte aus overview_polyline erstellen. Dies enthält nach der Google-Dokumentation "ein Objekt, das ein Array codierter Punkte enthält, die einen ungefähren (geglätteten) Pfad der resultierenden Richtungen darstellen.".

Ich bin mir ziemlich sicher, dass Sie eine detaillierte Route Aufbau Ihr LatLng Objekts basierend auf legs[] und steps[] Daten erhalten können, wie die offizielle Dokumentation besagt, dass Ein Schritt ist die unteilbare Einheit einer Route der Richtung, einen Schritt enthält, Beschreibung einer spezifischen, einzigen Anweisung auf der Reise.

Werfen Sie einen Blick auf:

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

0

Tmichel, Michael hat die richtig Welle, weil an den Beinen und Schritte auf dem Weg Grundstück die Linie aus der Straße. Beine und Schritte, hat Informationen über Koordinaten für Informationen, um den Benutzer zu warnen.

Polylinien sind die korrekten und präzisen Punkte über der Straße. Sorry mein schlechtes Englisch

Verwandte Themen