9

我在 android 上玩 Google Maps API V2。尝试在 2 个位置之间获取路径并使用 JSON Parsing 执行此操作。

我得到了一条路线。路线开始了它应该是怎样的。但在某一时刻,它走错了路。

我的最终目的地是错误的。在其他一些位置,我的应用程序刚刚被终止。

这就是我所做的

这是我的 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();
    }
}

我用

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

然后用 AsyncTask 编码

提前致谢。

4

3 回答 3

2

抱歉让您久等了..我已经修复了一段时间,但我还没有把我的解决方案放在这里。

基本上是笔误...

在我的 Json 解码器中,我使用 2 Do while 语句

while (b >= 0x20);

在第二个 Do While 语句中,我忘记了“=”。因此它没有正确渲染......

谢谢

于 2013-08-08T12:10:41.843 回答
1

我相信您是LatLngoverview_polyline. 根据 Google 文档,“包含一个对象,其中包含一组编码点,这些编码点代表结果方向的近似(平滑)路径。” .

我很确定您可以获得更详细的路线来构建LatLng基于legs[]steps[]数据的对象,因为官方文档指出步骤是方向路线的最原子单元,包含描述特定的单个指令的单个步骤旅程

看一眼:

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

于 2013-02-18T22:47:00.523 回答
0

Tmichel,Michael 有正确的挥手,因为在你的路线上的腿和台阶上,将线绘制在街道外。腿和步骤,具有围绕坐标的信息,用于提醒用户的信息。

折线是街道上正确且精确的点。 对不起我的英语不好

于 2013-05-28T00:05:13.607 回答