[Android] Google Map(三)– 取得導航資訊

[Android] Google Map(三)– 取得導航資訊

Google Maps API Web Services提供了不少的好用服務,其中一個就是導航,只要提供起迄點(地址或是座標均可),他就會幫你計算~而且是簡單的HttpGet方法就可以使用,回傳的格式包含了Xml或是JSON物件,詳細的說明可以參考:Google Directions API

 

因為我打算要在地圖上把導航路徑呈現出來,所以需要所有經過的點的位置,取得這個資訊的最快方法就是利用overview_path中的points,但這個資料是經過編碼,所以需要再解碼之後才可以使用,演算法格式可以參考:地理編碼折線演算法格式;下面的decodePolylines方法就是用來解碼的。

 



public List<GeoPoint> GetDirection()
{
    String mapAPI = "http://maps.google.com/maps/api/directions/json?origin={0}&destination={1}&language=zh-TW&sensor=true";
    String url = MessageFormat.format(mapAPI, _from, _to);

    HttpGet get = new HttpGet(url);
    String strResult = "";
    try
    {

        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
        HttpClient httpClient = new DefaultHttpClient(httpParameters);

        HttpResponse httpResponse = null;
        httpResponse = httpClient.execute(get);

        if (httpResponse.getStatusLine().getStatusCode() == 200)
        {
            strResult = EntityUtils.toString(httpResponse.getEntity());

            JSONObject jsonObject = new JSONObject(strResult);
            JSONArray routeObject = jsonObject.getJSONArray("routes");
            String polyline = routeObject.getJSONObject(0).getJSONObject("overview_polyline").getString("points");

            if (polyline.length() > 0)
            {
                decodePolylines(polyline);
            }

        }
    }
    catch (Exception e)
    {
        Log.e("map", "MapRoute:" + e.toString());
    }

    return _points;
}

private void decodePolylines(String poly)
{
    int len = poly.length();
    int index = 0;
    int lat = 0;
    int lng = 0;

    while (index < len)
    {
        int b, shift = 0, result = 0;
        do
        {
            b = poly.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 = poly.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));
        _points.add(p);

    }
}

 

後面因為windows mobile也要用,結果解碼這段程式可以直接拿來轉寫成C#,差別只在C#沒有charAt,不過這個寫個function來轉就可以了,真是開心XD

 

Dotblogs 的標籤: ,

相關連結:

Decoding Polylines from Google Maps Direction API with Java