如何从标记到另一个标记绘制路线方向? Googlemaps v2 Android

时间:2014-03-20 13:59:30

标签: android google-maps google-maps-api-3 google-maps-markers android-drawable

这是我的代码:

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

我想画一条从巴黎到电影院的路线。我怎么能这么简单地做到?

5 个答案:

答案 0 :(得分: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是两个包含点数的lat和lng的字符串,格式为“-1.0,2.0”:

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

要执行它,只需致电new GetDirection().execute();

希望它有所帮助!

答案 1 :(得分:2)

因为你有两点,所以通过谷歌json发送它,提供绘制路线   两点之间。看这个例子。

Route direction between two location

答案 2 :(得分:2)

您需要将Directions API与Android Maps util Lib

结合使用
  1. 从Directions Api获取Encoded Polyline字符串。
  2. 使用Maps Util Lib将编码的字符串解码为lat / lng的列表(https://developers.google.com/maps/documentation/android/utility/#poly-encoding
  3. 使用lat / lngs!
  4. 在地图上绘制折线

答案 3 :(得分:0)

Google Maps Android API实用程序库

点击此链接:https://github.com/googlemaps/android-maps-utils

答案 4 :(得分: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

这对我有用。