在android中的谷歌地图上绘制点数组的路径

时间:2015-03-20 13:14:47

标签: android google-maps google-maps-markers google-polyline

嗨我已经创建了与谷歌地图集成的应用程序,我需要绘制路径取决于驾驶运动。所以在这里我能够得到每2秒有当前lat和lang的点阵列现在我想通过使用那些lat和lang点数来绘制路径,我需要将标记放在源和目的地不在中间点。

我怎么能这样做,我已经搜索了很多时间,但仍然没有得到我期望的解决方案所以请告诉我你是否有任何想法或解决方案。

更新我的代码

我通过使用此代码获得了解决方案

private void drawPath() {
    PolylineOptions polylineOptions = new PolylineOptions();

    int i = 0;
    if (langtitudearray != null && latitudearray != null) {
        for (i = 0; i < latitudearray.size(); i = i + 1) {
            polylineOptions.add(new LatLng(latitudearray.get(i),
                    langtitudearray.get(i)));

        }
        addMarkers(
                new LatLng(latitudearray.get(0), langtitudearray.get(0)),
                new LatLng(latitudearray.get(latitudearray.size() - 1), langtitudearray.get(latitudearray.size() - 1)));

    }
    polylineOptions.color(Color.BLUE);
    polylineOptions.width(6);
    polylineOptions.geodesic(false);
    map.addPolyline(polylineOptions);

}

我可以使用lat和lang数组点并添加标记。现在的问题是。如果我在阵列中得到更多的lat和lang点,那么在地图上加载将会花费一些时间,这使得应用程序挂起,即使我可以通过30秒一次发送广播从服务获得那些点数。

注意:我从API响应中获取那些点数,这些点在后台服务中运行并生成lat和lang数组,然后通过广播发送到活动。

如何解决这个问题,有什么更好的方法呢? 在此先感谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

使用此方法:调用 makeURL()方法,然后调用 drawPath()方法

public String makeURL (double sourcelat, double sourcelog, double destlat, double destlog ){
    StringBuilder urlString = new StringBuilder();
    urlString.append("http://maps.googleapis.com/maps/api/directions/json");
    urlString.append("?origin=");// from
    urlString.append(Double.toString(sourcelat));
    urlString.append(",");
    urlString
            .append(Double.toString( sourcelog));
    urlString.append("&destination=");// to
    urlString
            .append(Double.toString( destlat));
    urlString.append(",");
    urlString.append(Double.toString( destlog));
    urlString.append("&sensor=false&mode=driving&alternatives=true");
    return urlString.toString();

}

public void drawPath(String  result) {

    try {
            //Tranform the string into a json object
           final JSONObject json = new JSONObject(result);
           JSONArray routeArray = json.getJSONArray("routes");
           JSONObject routes = routeArray.getJSONObject(0);
           JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
           String encodedString = overviewPolylines.getString("points");
           List<LatLng> list = decodePoly(encodedString);

           for(int z = 0; z<list.size()-1;z++){
                LatLng src= list.get(z);
                LatLng dest= list.get(z+1);
                Polyline line = googleMap.addPolyline(new PolylineOptions()
                .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude,   dest.longitude))
                .width(5)
                .color(Color.BLUE).geodesic(true));
            }

    } 
    catch (JSONException e) {

    }
} 

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