Google地图路线未显示

时间:2016-02-09 04:24:18

标签: android google-maps

我正在使用Google Map V2我尝试在google mapPolygon选项中显示路线,并尝试通过PolyLine选项。

我在stack overflow上经历了很多答案,但没有用,路线没有出现。我的代码如下:

 points = new ArrayList<LatLng>();
    PolygonOptions lineOptions = new PolygonOptions();
    for (int i = 0; i < directionEntityMain.getOverview_polyline().size(); i++) {
        LatLng position = directionEntityMain.getOverview_polyline().get(i);
        points.add(position);
    }

    lineOptions.addAll(points);
    lineOptions.strokeWidth(2);
    lineOptions.strokeColor(Color.RED);
    googleMap.addPolygon(lineOptions);

2 个答案:

答案 0 :(得分:0)

尝试使用此代码

首先,我们将获得我们必须绘制路线的源点和目的地点。然后我们将这些属性传递给下面的函数。

 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");
    urlString.append("&key=YOUR_API_KEY");
    return urlString.toString(); }

此函数将生成我们将发送的url以获取Direction API响应。然后我们将解析该响应。解析器类是

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public String getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }

        json = sb.toString();
        is.close();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    return json;

}}

此解析器将返回我们的字符串。我们会这样称呼它。

JSONParser jParser = new JSONParser();  String json = jParser.getJSONFromUrl(url);

现在我们将此字符串发送到drawpath函数。 drawpath函数是

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);
       Polyline line = mMap.addPolyline(new PolylineOptions()
                                .addAll(list)
                                .width(12)
                                .color(Color.parseColor("#05b1fb"))//Google maps blue color
                                .geodesic(true)
                );
       /*
       for(int z = 0; z<list.size()-1;z++){
            LatLng src= list.get(z);
            LatLng dest= list.get(z+1);
            Polyline line = mMap.addPolyline(new PolylineOptions()
            .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude,   dest.longitude))
            .width(2)
            .color(Color.BLUE).geodesic(true));
        }
       */
} 
catch (JSONException e) {

}} 

上面的代码将在mMap上绘制路径。 decodePoly的代码是

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

由于方向调用可能需要一些时间,因此我们将在异步任务中执行所有操作。我的异步任务是

private class connectAsyncTask extends AsyncTask<Void, Void, String>{
private ProgressDialog progressDialog;
String url;
connectAsyncTask(String urlPass){
    url = urlPass;
}
@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    progressDialog = new ProgressDialog(MainActivity.this);
    progressDialog.setMessage("Fetching route, Please wait...");
    progressDialog.setIndeterminate(true);
    progressDialog.show();
}
@Override
protected String doInBackground(Void... params) {
    JSONParser jParser = new JSONParser();
    String json = jParser.getJSONFromUrl(url);
    return json;
}
@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);   
    progressDialog.hide();        
    if(result!=null){
        drawPath(result);
    }
}}

答案 1 :(得分:0)

假设您已将Directions API的JSON响应映射到directionEntityMain对象,您可以执行以下操作在地图上绘制路线

List<LatLng> points = decodePoly(directionEntityMain.getOverview_polyline()
                                                           .getPoints());
PolyLineOptions lineOptions = new PolyLineOptions()
                                    .addAll(points)
                                    .strokeWidth(2)
                                    .strokeColor(Color.RED);
googleMap.addPolyline(lineoptions);


//the decoder function
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;
}