显示两个位置之间的持续时间和距离google maps api v2

时间:2015-08-19 11:51:31

标签: android google-maps

我目前正在开发谷歌地图应用程序,我可以显示两个给定(用户)点之间的路线,现在我试图为用户显示一些信息,如:持续时间在两点和距离之间以及显示替代道路。

搜索后我发现我可以在网址中添加内容,例如mode,alternatives = true ...

public class MapsActivity extends FragmentActivity {

    private GoogleMap gm;
    String Depart;
    String Arrive;
    TextView tvdirections;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapifNeeded();
        ImageButton serch_button = (ImageButton) findViewById(R.id.btnSearch);
        tvdirections=(TextView)findViewById(R.id.tvdirections);
        serch_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final Dialog dialog_button = new Dialog(MapsActivity.this);
                dialog_button.setTitle("Voir itineraires");
                dialog_button.setContentView(R.layout.dialog);
                dialog_button.show();
                final EditText edittxt1 = (EditText) dialog_button.findViewById(R.id.depart);
                final EditText edittxt2 = (EditText) dialog_button.findViewById(R.id.arrive);
                Button GoButton = (Button) dialog_button.findViewById(R.id.btnDialog);

                GoButton.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {                           
                        Depart = edittxt1.getText().toString();       
                        Arrive = edittxt2.getText().toString();      

                        if ((Depart.equals("") || Arrive.equals("")) || (Depart.equals(null) || Arrive.equals(null))) {
                            Toast.makeText(getApplicationContext(), "Veuillez entrer les points de depart et d'arrive", Toast.LENGTH_SHORT).show();
                        } else {
                            new ItineraryActivity(getApplicationContext(), gm, Depart, Arrive,tvdirections).execute();

                            dialog_button.cancel();
                            gm.clear();
                        }

                    }
                });
            }
        });

    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapifNeeded();
    }

    public void OnChangeToHybrid(View view) {

        gm.setMapType(GoogleMap.MAP_TYPE_HYBRID);

    }

    public void OnChangeToNormal(View view) {

        gm.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    }



    private void setUpMapifNeeded() {
        if (gm == null) {
            gm = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mymap)).getMap();

        }
        if (gm != null) {
            setUpMap();
        }
    }

    private void setUpMap() {
        //gm.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("hi bouchra :)"));
        //gm.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(0, 0), 18));
        gm.setMyLocationEnabled(true);
        gm.getUiSettings().setZoomControlsEnabled(true);
        gm.getUiSettings().setCompassEnabled(true);

    }



}

这是另一个班级

public class ItineraryActivity extends AsyncTask<Void,Integer,Boolean> {
    private static final String TOAST_ERR_MAJ = "Impossible de trouver un itineraire";

    private Context context;
    private GoogleMap gm;
    private String Depart;
    private String Arrive;
    private TextView tvdirections;
    private final ArrayList<LatLng> lstLatLng = new ArrayList<LatLng>();
    private  NodeList nl1;
    private NodeList nl2;
    private  Node node1=null;
    private Node  node2=null;

    public ItineraryActivity(final Context context, final GoogleMap gMap, final String Depart, final String Arrive, final TextView tvdirections) {
        this.context = context;
        this.gm = gMap;
        this.Depart = Depart;
        this.Arrive = Arrive;
        this.tvdirections = tvdirections;
        //nl1 = null;
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    public Boolean doInBackground(Void... params) {
        try {
            //Construction de l'url a appeler
            final StringBuilder url = new StringBuilder("http://maps.googleapis.com/maps/api/directions/xml?sensor=false");
            url.append("&origin=");
            url.append(Depart.replace(' ', '+'));
            url.append("&destination=");
            url.append(Arrive.replace(' ', '+'));
            url.append("&alternatives=true&units=metric");


            final InputStream stream = new URL(url.toString()).openStream();


            final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setIgnoringComments(true);

            final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

            final  Document document = documentBuilder.parse(stream);
            document.getDocumentElement().normalize();

            final String status = document.getElementsByTagName("status").item(0).getTextContent();
            if (!"OK".equals(status)) {
                return false;
            }

            //On recupere les steps
            final Element elementLeg = (Element) document.getElementsByTagName("leg").item(0);
            final NodeList nodeListStep = elementLeg.getElementsByTagName("step");
            final int length = nodeListStep.getLength();
            //final NodeList distancelist= elementLeg.getElementsByTagName("distance");
            for (int i = 0; i < length; i++) {
                final Node nodeStep = nodeListStep.item(i);

                if (nodeStep.getNodeType() == Node.ELEMENT_NODE) {
                    final Element elementStep = (Element) nodeStep;

                    //On decode les points du XML
                    decodePolylines(elementStep.getElementsByTagName("points").item(0).getTextContent());
                }
            }
            nl1= document.getElementsByTagName("distance");
            node1=nl1.item(0);
            nl2=node1.getChildNodes();
            node2=nl2.item(getNodeIndex(nl2, "text"));


            return true;
        } catch (final Exception e) {
            return false;
        }
    }

    private int getNodeIndex(NodeList nl, String nodename) {
        for(int i = 0 ; i < nl.getLength() ; i++) {
            if(nl.item(i).getNodeName().equals(nodename))
                return i;
        }
        return -1;

    }


    private void decodePolylines(final String encodedPoints) {
        int index = 0;
        int lat = 0, lng = 0;

        while (index < encodedPoints.length()) {
            int b, shift = 0, result = 0;

            do {
                b = encodedPoints.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 = encodedPoints.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);

            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng;

            lstLatLng.add(new LatLng((double) lat / 1E5, (double) lng / 1E5));
        }
    }

    //List<HashMap<String, String>> path = result.get(i);
    protected void onPostExecute( final Boolean result) {
        /*String distance = "";
        String duration = "";*/
        if (!result) {
            Toast.makeText(context, TOAST_ERR_MAJ, Toast.LENGTH_SHORT).show();
        } else {

            final PolylineOptions polylines = new PolylineOptions();
            polylines.color(Color.BLUE);
            polylines.width(3);

                //On construit le polyline
                for (final LatLng latLng : lstLatLng) {
                    polylines.add(latLng);

                }

                final MarkerOptions markerA = new MarkerOptions();
                markerA.position(lstLatLng.get(0));
                markerA.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));


                final MarkerOptions markerB = new MarkerOptions();
            markerB.position(lstLatLng.get(lstLatLng.size() - 1));
            markerB.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));


            gm.moveCamera(CameraUpdateFactory.newLatLngZoom(lstLatLng.get(0), 10));
            gm.addMarker(markerA);
            gm.addPolyline(polylines);
            gm.addMarker(markerB);
            tvdirections.setText(""+node2);


        }
    }

1 个答案:

答案 0 :(得分:1)

使用 JSON

这个例子被认为只能获取一条路线的数据,但为了使用更多的选项,你应该知道的唯一事情就是每条路线都有一个“腿”JSONArray。

final String str = "http://maps.googleapis.com/maps/api/directions/json?"
                            + "origin=" + Start.latitude + "," + Start.longitude
                            + "&destination=" + End.latitude + "," + End.longitude
                            +"&language=" +getResources().getConfiguration().locale.getDefault().getLanguage()
                            + "&sensor=false&units=metric&mode=" + "walking"
                            + "&alternatives=true";


 URL url = new URL(str);
 HttpURLConnection conn =(HttpURLConnection) url.openConnection();
 InputStreamReader in = new InputStreamReader(conn.getInputStream());

 StringBuilder jsonResults = new StringBuilder();
 int read;
 char[] buff = new char[1024];
 while ((read = in.read(buff)) != -1) {
     jsonResults.append(buff, 0, read);
 }

 JSONObject jsonObj = new JSONObject(jsonResults.toString());
 JSONArray parentArray = jsonObj.getJSONArray("routes");
 final JSONArray legArray = parentArray.getJSONObject(0).getJSONArray("legs");

 //Distance     
 JSONObject distanceObj = legArray.getJSONObject(0).getJSONObject("distance");
 distance = distanceObj.getInt("value"); //Value of distance
 distance = distanceObj.getString("text"); //String that contains the distance value formated

 //With duration is the same changing getJSONObject("distance") with getJSONObject("duration")