【问题标题】:Draw a straight line on Google Map v2在谷歌地图 v2 上画一条直线
【发布时间】:2016-08-15 07:41:25
【问题描述】:

您好,我想在 Google Maps v2 上画一条直线。并从那条线上获取所有 LatLng 点(注意:这不是简单的画线....我想获取所有步点)。

我在谷歌上搜索了很多,但它给出了道路......我只想要直线(不是道路)。 这是我正在使用的代码:

Polyline line = mMap.addPolyline(new PolylineOptions()
                    .add(origin, dest)
                    .width(10)
                    .color(Color.RED));
Log.wtf("Activity","Poits="+line.getPoints());

但它只给出起点和终点! 谁能建议我如何获得所有积分? 提前谢谢!

【问题讨论】:

标签: android google-maps path draw polyline


【解决方案1】:

对于多点你可以试试这个。

private String getDirectionsUrlForAllPoints(String travelMode, ArrayList<LatLng> points) 
    {
        //int source, dest = 0;
        StringBuilder polyLineUrl = new StringBuilder("http://maps.googleapis.com/maps/api/directions/");

        // Output format
        polyLineUrl.append("json?");

        StringBuilder wayPointUrl = new StringBuilder();

        for (int i = 0; i < points.size(); i++) {

            if (i == 0) {
                // Origin of route
                polyLineUrl.append("origin=");
                polyLineUrl.append(points.get(i).latitude);
                polyLineUrl.append(",");
                polyLineUrl.append(points.get(i).longitude);
                continue;
            }

            // For poly line between last points
            if (i == points.size() - 1) {
                //dest = i;

                // Destination of route
                polyLineUrl.append("&destination=");
                polyLineUrl.append(points.get(i).latitude);
                polyLineUrl.append(",");
                polyLineUrl.append(points.get(i).longitude);
                continue;
            }

            wayPointUrl.append("|");
            wayPointUrl.append(points.get(i).latitude);
            wayPointUrl.append(",");
            wayPointUrl.append(points.get(i).longitude);

            /*https://maps.googleapis.com/maps/api/directions/json?origin=Adelaide,SA&destination=Adelaide,SA&waypoints=optimize:true
            |-34.901374,138.737500|-34.918335,138.720412|-34.919335,138.750412|-34.928335,138.790412|-34.938335,138.800412
            * */


        }

        // Sensor enabled
        // Building the parameters to the web service
        polyLineUrl.append("&sensor=false&optimize=true&mode="); //String parameters = str_origin+"&"+str_dest+"&"+sensor + ;

        polyLineUrl.append(travelMode);

        if (wayPointUrl.toString().length() > 0) {
            wayPointUrl.insert(0, "&waypoints=");
        }

        // Building the url to the web service
        String url = polyLineUrl.toString() + wayPointUrl.toString();

        Log.d(TAG, "Url: " + url);

        return url;
    }


    /**
     * Receives a JSONObject and returns a list of lists containing latitude and longitude
     */
    public List<List<HashMap<String, String>>> parseForAllPoints(JsonObject jObject) {

        List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String, String>>>();
        JsonArray jRoutes = null;
        JsonArray jLegs = null;
        JsonArray jSteps = null;
        JsonObject jDistance = null;
        JsonObject jDuration = null;

        try {


            jRoutes = jObject.getAsJsonArray("routes");

            if (jRoutes != null) {
                /** Traversing all routes */
                for (int i = 0; i < jRoutes.size(); i++) {
                    jLegs = ((JsonObject) jRoutes.get(i)).getAsJsonArray("legs");

                    List<HashMap<String, String>> path = new ArrayList<HashMap<String, String>>();

                    /** Traversing all legs */
                    for (int j = 0; j < jLegs.size(); j++) {

                        /** Getting distance from the json data */
                        jDistance = ((JsonObject) jLegs.get(j)).getAsJsonObject("distance");
                        HashMap<String, String> hmDistance = new HashMap<String, String>();
                        hmDistance.put("distance", jDistance.get("text").getAsString());

                        /** Getting duration from the json data */
                        jDuration = ((JsonObject) jLegs.get(j)).getAsJsonObject("duration");
                        HashMap<String, String> hmDuration = new HashMap<String, String>();
                        hmDuration.put("duration", jDuration.get("text").getAsString());

                        /** Adding distance object to the path */
                        path.add(hmDistance);

                        /** Adding duration object to the path */
                        path.add(hmDuration);

                        jSteps = ((JsonObject) jLegs.get(j)).getAsJsonArray("steps");

                        /** Traversing all steps */
                        for (int k = 0; k < jSteps.size(); k++) {
                            String polyline = "";
                            polyline = ((JsonObject) ((JsonObject) jSteps.get(k)).get("polyline")).get("points").getAsString();
                            //Log.d(TAG, "parse: " + polyline);
                            List<LatLng> list = decodePoly(polyline);

                            /** Traversing all points */
                            for (int l = 0; l < list.size(); l++) {
                                HashMap<String, String> hm = new HashMap<String, String>();

                                if (list.get(l) != null) {
                                    hm.put("lat", Double.toString(((LatLng) list.get(l)).latitude));
                                    hm.put("lng", Double.toString(((LatLng) list.get(l)).longitude));
                                    path.add(hm);
                                }
                            }
                        }
                    }
                    routes.add(path);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return routes;
    }


    /**
     * Method to decode polyline points
     * Courtesy : jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
     */
    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;
    }

您将从 getDirectionsUrlForAllPoints() 获得 url。进行 webservice(get) 调用,然后使用 parseForAllPoints() 方法解析该响应。然后最后将 latlng 的数组列表添加到折线。它将绘制所有点的折线。 我在不同的班级做过这些事情,但我不能在这里粘贴完整的代码。希望你能理解。

【讨论】:

  • 没有哦。我还没有读过那部分说不是公路。但它会在特定路线上绘制折线。我认为显示路线比在空中显示线路更好。
  • 如果你有所有 latlng 然后使用 for 循环,或者你可以在折线选项中使用 addAll() 添加点,然后将其传递给谷歌地图。