9

Google Maps API V2でアンドロイドで遊んでいました。 2つの場所の間のパスを取得しようとしており、これをJSON解析で行います。2か所の間のルートを描くGoogle Maps API Android V2

私はルートを取得しています。それがどのようにすべきかが始まります。しかしある時点でそれは間違った方向に行きます。

最終目的地が正しく設定されていません。他の場所では、私のアプリはただ終了します。

これは私がここで

を行っているものですが、私の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(); 
} 

私のJSONパーサー

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

である私は、この方法

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

と私のパスを描きますそして私はデコ事前にAsyncTask

おかげでコード化され、その後

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

そして、と私のJSONデ。

+0

それが助けたコードを共有するためのおかげでレンダリングされませんでした。 :) – rptwsthi

答えて

2

私はそれをしばらく前に修正しましたが、まだ私の解決策をここに入れていませんでした。

それは私が「=」を忘れてしまった文の間、私は二ドゥで

while (b >= 0x20); 

と文ながら2ドを使用して...基本的に私のJSONデコーダで

タイプミスでした。 は、したがって、それは...正しく

おかげ

1

LatLngのオブジェクトをoverview_polylineから作成していると思います。これは、Googleドキュメントによると、結果のルートの近似(平滑)パスを表す符号化された点の配列を保持するオブジェクトが含まれています。

私は公式ドキュメントがステップは、単一のステップを含む、方向のルートの中で最も原子単位であると述べているとして、あなたがlegs[]steps[]データに基づいてLatLngオブジェクトを構築し、より詳細なルートを得ることができることをかなり確信しています旅の特定の単一の指示を記述する。マイケルは正しくので、あなたのルートをプロット上の脚と手順通りのラインアウトで、振った

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

0

Tmichel、 :

は見てみましょう。 脚とステップには、ユーザーに警告する情報の座標に関する情報があります。

ポリラインは、通り上の正確で正確なポイントです。 申し訳ありません私の悪い英語

関連する問題