如何从一个标记点绘制路线到另一个标记点?Google Maps v2 Android。

3

这是我的代码:

    public class MyGoogleMapActivity extends FragmentActivity {


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.googlemap);

            GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

            map.setMyLocationEnabled(true);

            LatLng Paris= new LatLng(64.711696, 12.170481);
            map.addMarker(new MarkerOptions().title("LolluSaba").position(Paris));
            LatLng Cinema= new LatLng(34.711696, 2.170481);
            map.addMarker(new MarkerOptions().title("Pseudo").position(Cinema));
       }
    }

我想画一条从巴黎到电影院的路线。如何简单地做到这一点?
4个回答

4

假设您已经有了要绘制的两个点的坐标,您可以使用以下方法从谷歌获取路线:

class GetDirection extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(MapaAnunciante.this);
        dialog.setMessage("Drawing the route, please wait!");
        dialog.setIndeterminate(false);
        dialog.setCancelable(false);
        dialog.show();
    }

    protected String doInBackground(String... args) {
        String stringUrl = "http://maps.googleapis.com/maps/api/directions/json?origin=" + origin+ "&destination=" + destination+ "&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");
            pontos = decodePoly(polyline);

        } catch (Exception e) {

        }

        return null;

    }

    protected void onPostExecute(String file_url) {
        for (int i = 0; i < pontos.size() - 1; i++) {
            LatLng src = pontos.get(i);
            LatLng dest = pontos.get(i + 1);
            try{
                //here is where it will draw the polyline in your map
                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));
            }catch(NullPointerException e){
                Log.e("Error", "NullPointerException onPostExecute: " + e.toString());
            }catch (Exception e2) {
                Log.e("Error", "Exception onPostExecute: " + e2.toString());
            }

        }
        dialog.dismiss();

    }
}

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

在这里,origindestination两个字符串分别包含经度和纬度的信息,并且以“-1.0,2.0”的格式呈现:

 String origin = "64.711696,12.170481";
 String destination = "34.711696,2.170481";

执行它,只需调用new GetDirection().execute();

希望能帮到您!


所以我不得不创建另一个类,名为Get Direction?我可以将其添加到MyGoogleMapActivity类中吗? - KingMaker
是的,你可以在你的MyGoogleMapActivity中创建它,我也是在我的活动中创建了我的GetDirection! - Giacomoni
1
我有一些错误:dialog无法解析为变量,MapaAnunciante无法解析为类型,pontos无法解析为变量,GetDirection的decodePoly(String)方法未定义。我该怎么办? - KingMaker
只需声明一个私有的ProgressDialog dialog;,这样在绘制路线时就会出现一个对话框。 - Giacomoni
就像我在答案中所说的那样,当你想要绘制路径时,只需调用 new GetDirection().execute(); ... 但是在调用之前,请先调用 String origin = "64.711696,12.170481"; String destination = "34.711696,2.170481"; - Giacomoni
显示剩余12条评论

2

2

0

首先,您需要一个LatLng列表

List<LatLng> ls_pos=new ArrayList<>();

之后,在OnMapReady中进行操作

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(final Marker marker) {
   if (ls_pos.size() >= 2) {

 mMap.addPolyline(newPolylineOptions().addAll(ls_pos).width(10).color(Color.RED).visible(true).clickable(true));

     ls_pos.clear

这对我来说是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接