[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 的標籤: Android,Google Map
相關連結: