突出显示在谷歌地图V2 Android的指明路线 [英] Highlight a specified route on Google Maps v2 Android

查看:286
本文介绍了突出显示在谷歌地图V2 Android的指明路线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对,所以我目前使用我的应用程序的谷歌路线API检索两个位置之间的路线。

Right, so I'm currently using the Google Directions API in my app to retrieve the route between two locations.

当我送了一个路线指引的要求,我找回了一些关于包括沿线每路的名称的路线JSON的细节,其相应的起点和终点经纬度长的坐标,和他们的折线价值

When I send a request for a route directions, I retrieve a number of details in JSON regarding the route including the names of every road along the route, their corresponding start and end lat-long co-ordinates, and their polyline value.

例如:如果我发送请求<一href="http://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=false">http://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=false两条道路,我得到以下JSON响应(输出一路沿着路线)。

For example: If I send the request http://maps.googleapis.com/maps/api/directions/json?origin=redfern+ave,+dublin&destination=limetree+ave,+dublin&sensor=false between two roads, I get the following JSON response (output for one road along route).

 {
                     "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@O}DOkDQqF"**
                     },

到目前为止,我的应用程序解析该信息,并罗列了在这样的列表视图中的道路和方向:

So far my application parses this information and simply lists the roads and directions in a list view like this:

我想这样做,突出从A整体路线上的映像B什么,但是我发现没有什么可在线上如何​​做到这一点在新的谷歌地图API第2版。我看到折线的使用,而不是覆盖吸取谷歌地图V2线,但是从我可以告诉,他们只画直线是没有用的我。反正用我掌握的信息在我手上突出的路线(路名,启动和放大器;。最终LAT-长坐标,折线各点的任何帮助AP preciated

What I want to do it highlight the whole route from A to B on a map, however I've found nothing useful online on how to do this on the new Google Maps API v2. I see that polyline's are used instead of overlays to draw lines on Google Maps v2, however from what I can tell, they only draw straight lines which is useless for me. Is there anyway of highlighting the route using the information I have at my disposal (road names, start & end lat-long co-ordinates, polyline points? Any help is appreciated.

另外,我看到有一个在响应折线值,它可能是有用的,但我不知道如何解析或使用的信息,该位。有谁知道我可以使这个价值感绘制折线?

Also, I see there is a 'polyline' value in the response which could be useful but I can't work out how to parse or use this bit of information. Does anyone know how I can make sense of this value to plot a polyline?

**"polyline" : {
             "points" : "woceIvgmd@O}DOkDQqF"**

编辑:。我的解决办法code是我的回答如下规定

My solution code is provided in my answer below.

推荐答案

我终于成功了很多的反复试验后得到它的工作!现在完全突出了从A指定的路线在地图上B(在我的截图看到下文)。我也扔在我的code的人谁需要它的未来。

I finally managed to get it working after a lot of trial and error! It now fully highlights a specified route from A to B on a map (as seen in my screenshot below). I have also thrown in my code for anyone who may need it in future.

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

这篇关于突出显示在谷歌地图V2 Android的指明路线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆