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

 

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

 

private List<GeoPoint> _points = new ArrayList<GeoPoint>();

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



DotBlogs Tags: Android Google Map

回應

  • 導航目的 2011/8/22 下午 09:27 回覆

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

    你好
    我想將導航目地由輸入地址改成座標輸入
    請問怎麼改寫呢

  • 星寂 2011/8/23 上午 10:29 回覆

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

    to 導航目的 :
    座標?你指經緯度嗎??

    直接改帶成經緯度就可以囉~,請參考google api

  • 王欢 2011/9/5 下午 02:45 回覆

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

    你好 我想让我通过别的方法得到别人的位置的坐标和我自得坐标显示的效果一样要怎么做啊?恳请告知!~

  • 星寂 2011/9/5 下午 04:32 回覆

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

    to 王欢 :

    不太懂你的意思??你是想讓別人的座標也顯示像MyLocationOverlay嗎??你可能要自己建Overlay畫icon上去了哦~。

    內建的icon好像沒有那種的

    http://since2006.com/android/2.1-drawables.php
     

  • ADR 2011/12/1 上午 09:27 回覆

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

    你好 想請問一下 在你程式執行後都會跑到內壢車站 如果要改其他地點 需要改哪裡呢?

  • 星寂 2011/12/1 下午 12:04 回覆

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

    to ADR :
    改google api網址那段。

  • ALEXTWS 2012/2/11 下午 10:00 回覆

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

    你好 我是香港來的 想請問一下 如果我把google api網址那段 改成這個 好像會當機...

    http://maps.google.com.hk/maps/api/directions/json?origin=宜安街&destination=宜安街&language=zh-TW&sensor=true&waypoints=optimize:true|駱克道|錦上路|康寧道

    程式好像一到
    get = new HttpGet("http://maps.google.com.hk/maps/api/directions/json?origin=宜安街&destination=宜安街&language=zh-TW&sensor=true&waypoints=optimize:true|駱克道|錦上路|康寧道");
    這段的時間就掛了

    請問有方法解決嗎??

  • 星寂 2012/2/12 下午 12:35 回覆

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

    to ALEXTWS :
    你可以直接拿這段網址用瀏覽器測測看啊,這段就是直接連google那邊。
    不過看起來你的地址沒給完整啊,這樣他應該算不出來路徑吧。

  • mapAPI 2012/2/17 下午 01:49 回覆

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

    為何private final String mapAPI = "http://maps.google.com/maps/api/directions/json?"+ "origin={0}&destination={1}&language=zh-TW&sensor=true";為何這段是在中壢車站?
    我有去Google Directions API看說明還是看不懂@@?

  • mapAPI 2012/2/17 下午 01:50 回覆

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

    origin={0}&destination={1}這裡要怎麼改?
    mapAPI和(from = params[0];to = params[1];)的關係是?
    謝謝

  • 星寂 2012/2/17 下午 03:25 回覆

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

    to mapAPI :

    請參考google api的說明。
     

  • 東吳學生 2012/3/1 下午 03:07 回覆

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

    你好,我們是東吳大學大4學生,目前在製作android導航相關的畢業專題
    我們目前可以藉由GOOGLE API取得導航路徑
    不過我們不打算讓使用者看到地圖,想要讓程式可以直接提示使用者該轉彎的地方
    但我們對於該如何使用JSON來取得轉彎的路點還是不太了解,請問要怎麼使用JSON的功能?
    我們目前只能利用GOOGLE API來開啟地圖和導航路徑
    然後也有點找不到JSON的教學文或相關資源
    希望你可以幫助我們

  • 摩拉 2012/3/1 下午 03:25 回覆

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

    https://www.google.com/search?client=ubuntu&channel=fs&q=json&ie=utf-8&oe=utf-8

    約有 232,000,000 項結果 (搜尋時間:0.15 秒)

    這麼多資源怎麼會說找不到相關資訊呢0.0?

    這樣就找不到資料,畢業專題不容易寫好吧o.o?

  • 星寂 2012/3/1 下午 04:42 回覆

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

    to 東吳學生 :

    JSON只是一個資料格式,如同摩拉貼的,網路上隨便找都可以找到JSON的格式說明呦。

    至於GOOGLE的導航路徑,你只要取回來之後全部照著顯示出來就可以了,要轉彎的地方他有分段落。

     

  • 可以載入gpx檔? 2012/3/17 上午 11:20 回覆

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

    可以讀取gpx檔,載入路逕?

  • 星寂 2012/3/17 下午 04:41 回覆

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

    to 可以載入gpx檔? :

    我沒試過,你可能要自己試了@@
     

  • fly 2012/3/24 下午 02:31 回覆

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

    想問為何destination={1}

    是在中壢火車站  你的目的地是怎麼給他的?

  • fly 2012/3/24 下午 03:29 回覆

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

    想問String mapAPI = "http://maps.google.com/maps/api/directions/json?origin={0}&destination={1}&language=zh-TW&sensor=true"; 目的地有辦法利用EditText輸入地址在給destination嗎

     

     

  • fly 2012/3/24 下午 04:25 回覆

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

    我試成功了:)

  • 嘎嘎 2012/5/23 下午 04:15 回覆

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

    新手學習中
    第一篇已經解決了
    這一篇程式是要打在project還是class還是main.xml中

  • 星寂 2012/5/23 下午 04:56 回覆

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

    to 嘎嘎 :
     

    看不懂你的問題,會有人把函式打在XML裡面嗎= = ?

  • 阿盛 2012/5/23 下午 05:55 回覆

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

     

      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);
    _from跟_to有問題
  • 星寂 2012/5/23 下午 06:14 回覆

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

    to 阿盛 :

    _from跟_to是類別變數,哪裡有問題??
     

  • 阿盛 2012/5/23 下午 08:36 回覆

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

    整串就是_from跟_to有叉叉,需要另外在宣告嗎?

    還是我少了什麼東西呢~拜託大大解答

  • 星寂 2012/5/23 下午 09:47 回覆

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

    to 阿盛 :
    當然要啊,那個就是變數啊~。

     

  • 小試餐刀 2012/6/8 下午 10:44 回覆

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

    不好意思,我來自香港。我想請教各大大 _from,_to是否寫成為
    String _from = "";
    String _to = "";

    MessageFormat.format(mapAPI, _from, _to);

    我不明白_from ,_to 

    謝謝各大大指教先^^


     

  • 星寂 2012/6/9 下午 04:09 回覆

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

    to 小試餐刀 : 

    _from就是起點,_to就是終點。

    如果你有認真看過google api就該知道........。
     

  • 小試餐刀 2012/6/11 上午 03:31 回覆

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

    我知道在那裏錯呢,因為我的link有waypoints 我用多一個,要在waypoints 加上 | 分隔,但java url 不容許 | 的存在

    thank you

  • 小試餐刀 2012/6/11 上午 03:41 回覆

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

    我的問題應該與ALEXTWS 一樣

    java url 不容許 | 的存在

    請問有沒有其他方法?

     

  • 星寂 2012/6/22 下午 06:17 回覆

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

    to 小試餐刀 :

    url就是url,沒有是不是java的問題,如果你需要帶特殊字元,那正常來說就要經過編碼。

     

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 2 and 3 and type the answer here:

Copyright © 2008 design by Iris Kang.