在 Google Maps v2 Android 上突出显示指定路线
Posted
技术标签:
【中文标题】在 Google Maps v2 Android 上突出显示指定路线【英文标题】:Highlight a specified route on Google Maps v2 Android 【发布时间】:2013-01-23 12:28:15 【问题描述】:好的,所以我目前在我的应用中使用 Google Directions API 来检索两个位置之间的路线。
当我发送路线指示请求时,我会在 JSON 中检索有关路线的许多详细信息,包括沿路线的每条道路的名称、它们对应的起点和终点经纬度坐标以及它们的折线值.
例如:如果我在两条道路之间发送请求 http://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=false,我会得到以下 JSON 响应(沿路线的一条道路的输出)。
"distance" :
"text" : "0.2 km",
"value" : 203
,
"duration" :
"text" : "1 min",
"value" : 18
,
"end_location" :
"lat" : 53.435250,
"lng" : -6.132140000000001
,
"html_instructions" : "Head \u003cb\u003eeast\u003c/b\u003e on \u003cb\u003eRedfern Ave.\u003c/b\u003e toward \u003cb\u003eMartello Court\u003c/b\u003e",
**"polyline" :
"points" : "woceIvgmd@ODOkDQqF"**
,
到目前为止,我的应用程序解析了这些信息,并在列表视图中简单地列出了道路和方向,如下所示:
我想要在地图上突出显示从 A 到 B 的整条路线,但是我在网上找不到任何有用的信息来说明如何在新的 Google Maps API v2 上执行此操作。我看到在 Google Maps v2 上使用折线而不是叠加来绘制线条,但是据我所知,它们只绘制对我没用的直线。是否可以使用我掌握的信息(道路名称、起点和终点经纬度坐标、折线点)突出显示路线?感谢任何帮助。
另外,我看到响应中有一个“折线”值,这可能很有用,但我不知道如何解析或使用这些信息。有谁知道我如何理解这个值来绘制折线?
**"polyline" :
"points" : "woceIvgmd@ODOkDQqF"**
编辑:我的解决方案代码在下面的答案中提供。
【问题讨论】:
【参考方案1】:经过多次反复试验,我终于设法让它工作了!它现在在地图上完全突出显示从 A 到 B 的指定路线(如下面的屏幕截图所示)。我还为将来可能需要它的任何人提供了我的代码。
public class PolyMap extends Activity
ProgressDialog pDialog;
GoogleMap map;
List<LatLng> polyz;
JSONArray array;
static final LatLng DUBLIN = new LatLng(53.344103999999990000,
-6.267493699999932000);
@SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.map_layout);
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
.getMap();
map.moveCamera(CameraUpdateFactory.newLatLngZoom(DUBLIN, 15));
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
new GetDirection().execute();
class GetDirection extends AsyncTask<String, String, String>
@Override
protected void onPreExecute()
super.onPreExecute();
pDialog = new ProgressDialog(PolyMap.this);
pDialog.setMessage("Loading route. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
protected String doInBackground(String... args)
Intent i = getIntent();
String startLocation = i.getStringExtra("startLoc");
String endLocation = i.getStringExtra("endLoc");
startLocation = startLocation.replace(" ", "+");
endLocation = endLocation.replace(" ", "+");;
String stringUrl = "http://maps.googleapis.com/maps/api/directions/json?origin=" + startLocation + ",+dublin&destination=" + endLocation + ",+dublin&sensor=false";
StringBuilder response = new StringBuilder();
try
URL url = new URL(stringUrl);
HttpURLConnection httpconn = (HttpURLConnection) url
.openConnection();
if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK)
BufferedReader input = new BufferedReader(
new InputStreamReader(httpconn.getInputStream()),
8192);
String strLine = null;
while ((strLine = input.readLine()) != null)
response.append(strLine);
input.close();
String jsonOutput = response.toString();
JSONObject jsonObject = new JSONObject(jsonOutput);
// routesArray contains ALL routes
JSONArray routesArray = jsonObject.getJSONArray("routes");
// Grab the first route
JSONObject route = routesArray.getJSONObject(0);
JSONObject poly = route.getJSONObject("overview_polyline");
String polyline = poly.getString("points");
polyz = decodePoly(polyline);
catch (Exception e)
return null;
protected void onPostExecute(String file_url)
for (int i = 0; i < polyz.size() - 1; i++)
LatLng src = polyz.get(i);
LatLng dest = polyz.get(i + 1);
Polyline line = map.addPolyline(new PolylineOptions()
.add(new LatLng(src.latitude, src.longitude),
new LatLng(dest.latitude, dest.longitude))
.width(2).color(Color.RED).geodesic(true));
pDialog.dismiss();
/* Method to decode polyline points */
private List<LatLng> decodePoly(String encoded)
List<LatLng> poly = new ArrayList<LatLng>();
int index = 0, len = encoded.length();
int lat = 0, lng = 0;
while (index < len)
int b, shift = 0, result = 0;
do
b = encoded.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 = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;
LatLng p = new LatLng((((double) lat / 1E5)),
(((double) lng / 1E5)));
poly.add(p);
return poly;
【讨论】:
这对我帮助很大。谢谢。如果您想重用同一张地图,您必须考虑将折线线保存在一个数组中,这样您就可以从该地图中删除这些线。 好吧,有一个巧合,我今天花了几个小时试图弄清楚为什么 line.remove() 不起作用。谢谢! 嗨@DanCoghlan,为什么你必须在每两个连续的点之间画一条线?我们不能在 1 次时为所有点绘制折线吗? - developers.google.com/maps/documentation/android/… @DanCoghlan 嗨,我是 android 新手,我不知道我需要为这个 String startLocation = i.getStringExtra("startLoc"); 提供什么String endLocation = i.getStringExtra("endLoc"); 纬度经度坐标,用点或逗号分隔?【参考方案2】:使用 Android maps api 2,您确实需要使用 Polyline
类在地图上绘制路线(至少这是一种最简单的方法 :))。您需要做的是提供沿途的点列表。
至于突出显示活动路线 - Polyline
类 setColor
中有一个方便的界面,因此您可以为活动路线设置任何您想要的颜色(包括 alpha 通道)
Polyline line1 = map.addPolyline(new PolylineOptions()
.add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
.width(5)
.color(0xFFFF0000)); //non transparent red
Polyline line2 = map.addPolyline(new PolylineOptions()
.add(new LatLng(51.5, -0.1), new LatLng(40.8, -74.2))
.width(5)
.color(0x7F0000FF)); //semi-transparent blue
请注意,您可以随时随意更改折线颜色(例如,用户点击或其他)
关于 google 的 JSON 响应 - 路由点是编码的,所以你可以参考this question 了解如何解码它
【讨论】:
好吧,如果你的道路有 10 个点,折线将绘制 10 条(实际上是 9 条)直线相互连接。你的路线有多少点,这些点的实际坐标是什么 -此信息被编码为points
字段【参考方案3】:
有一个简单的解决方案
添加库
编译'com.google.maps.android:android-maps-utils:0.4+'
参考来自 https://developers.google.com/maps/documentation/android-api/utility/setup
//Getting the points String from response of NavigationAPI call
String polyz=routeSteps.get(0).getOverview_polyline().getPoints();
//Decoding the LatLng Points using PolyUtil Class used from above Library
List<LatLng> points=PolyUtil.decode(polyz);
polyline.addAll(points);
googleMap.addPolyline(polyline);
【讨论】:
以上是关于在 Google Maps v2 Android 上突出显示指定路线的主要内容,如果未能解决你的问题,请参考以下文章
在 Google Maps Android SDK (v2) 中更改建筑物颜色
java Android Google Maps V2 - XML中的MapView
在 Google Maps API v2 Android 中添加多个标记