4
votes

Comment dessiner un itinéraire et calculer la distance entre plusieurs marqueurs sur Google Map dans Android

Dans mon application, l'utilisateur peut insérer plusieurs emplacements et les afficher sur la carte. Comment puis-je atteindre cet objectif? Je sais comment dessiner un itinéraire entre deux emplacements mais je veux dessiner un itinéraire entre plusieurs marqueurs comme une image. entrez la description de l'image ici

Dans le marqueur d'image, afficher l'emplacement entré par l'utilisateur. Je veux aussi calculer la distance entre les marqueurs comme calculer la distance entre B à C et C à D.

Comment puis-je y parvenir?


0 commentaires

4 Réponses :


0
votes

En utilisant l'API de direction, vous pouvez y parvenir. il vous suffit de passer le marqueur inséré par l'utilisateur comme waypoints comme suit

 api.getDirectionWithWayPoints(startPoint, endPoint, stringBuilder.toString(), getString(R.string.API_KEY))
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribeWith(new Observer<DirectionResults>() {
                                @Override
                                public void onSubscribe(Disposable d) {

                                }

                                @Override
                                public void onNext(DirectionResults directionResults) {
                                    hideDialog();
                                    if (null == directionResults) {
                                        return;
                                    }


                                    ArrayList<LatLng> routelist = new ArrayList<>();
                                    routelist.add(latLngStart);
                                    if (directionResults.getRoutes().size() > 0) {
                                        List<LatLng> decodelist;
                                        RoutesItem routeA = directionResults.getRoutes().get(0);

                                        if (routeA.getLegs().size() > 0) {

                                            for (int j = 0; j < routeA.getLegs().size(); j++) {


                                            List<StepsItem> steps = routeA.getLegs().get(j).getSteps();

                                            StepsItem step;
                                            Location location;
                                            String polyline;
                                            for (int i = 0; i < steps.size(); i++) {
                                                step = steps.get(i);


                                                polyline = step.getPolyline().getPoints();
                                                decodelist = DirectionsJSONParser.decodePoly(polyline);
                                                routelist.addAll(decodelist);


                                            }
                                        }
                                        }
                                    }

                                    if (routelist.size() > 0) {


                                        routelist.add(latLngEnd);

                                        rectLine = new PolylineOptions().width(12).color(
                                                Color.CYAN);

                                        for (int i = 0; i < routelist.size(); i++) {
                                            rectLine.add(routelist.get(i));
                                        }
                                        // Adding route on the map

                                        if (null != mMap) {
                                            mMap.addPolyline(rectLine);

                                            fixZoom(rectLine, mMap);
                                            getVehicleId();

                                        }
                                    }

                                }

                                @Override
                                public void onError(Throwable e) {
                                    hideDialog();
                                    e.printStackTrace();
                                }

                                @Override
                                public void onComplete() {

                                }
                            });
                }


            }

vous obtiendrez la liste des routes qui ont la distance entre les points

// retrofit

  @GET("https://maps.googleapis.com/maps/api/directions/json")
    Observable<DirectionResults> getDirectionWithWayPoints(@Query("origin") String origin, @Query("destination") String destination, @Query("waypoints") String wayPoints, @Query("key") String key);

// logique de traçage

https://maps.googleapis.com/maps/api/directions/json?
origin=sydney,au&destination=perth,au
&waypoints=via:-37.81223%2C144.96254%7Cvia:-34.92788%2C138.60008
&key=YOUR_API_KEY


0 commentaires

1
votes

Utilisez une API de direction qui renvoie des directions en plusieurs parties à l'aide d'une série de points de cheminement.

Documentation de l'API Direction

public void drawRoute(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)
        );

    } catch (JSONException e) {

    }
}  

Lorsque vous obtenez une réponse de la demande ci-dessus. vous devez tracer une route à partir de la réponse

private static final LatLng LOWER_MANHATTAN = new LatLng(40.722543,-73.998585);
private static final LatLng BROOKLYN_BRIDGE = new LatLng(40.7057, -73.9964);
private static final LatLng WALL_STREET = new LatLng(40.7064, -74.0094);

    private String getMapsApiDirectionsUrl() {
        String origin = "origin=" + LOWER_MANHATTAN.latitude + "," + LOWER_MANHATTAN.longitude;
        String waypoints = "waypoints=optimize:true|" + BROOKLYN_BRIDGE.latitude + "," + BROOKLYN_BRIDGE.longitude + "|";
        String destination = "destination=" + WALL_STREET.latitude + "," + WALL_STREET.longitude;

        String sensor = "sensor=false";
        String params = origin + "&" + waypoints + "&"  + destination + "&" + sensor;
        String output = "json";
        String url = "https://maps.googleapis.com/maps/api/directions/"
                + output + "?" + params;
        return url;
    }
}

Vous obtiendrez plus de détails à ce sujet sur Draw-route-github

Pour calculer la distance, vous devez l ' API Distance Matrix est un service qui fournit la distance et le temps de voyage pour une matrice d'origines et de destinations


0 commentaires

0
votes

Google fournit des bibliothèques prêtes à l'emploi pour résoudre ce type de problèmes.

Je structurerais mon application de la manière suivante.

  1. Utilisez Retrofit 2 pour vous connecter au réseau. ( https://square.github.io/retrofit/ )
  2. Utilisez les API Google, vous aurez besoin de plus d'une API pour accomplir les deux tâches.

    2.a Pour connaître les distances entre deux points, utilisez l'API Google Distance Matrix ( https://developers.google.com/maps/documentation/distance-matrix/start ).

    2.b Pour ajouter plusieurs marqueurs, vous pouvez vous référer à la réponse suivante API Google Maps JS v3 - Exemple simple de marqueurs multiples


0 commentaires

0
votes
For draw route you can use :

PolylineOptions options = new 
      PolylineOptions().width(5).color(Color.BLUE).geodesic(true);
      for (int z = 0; z < list.size(); z++) {
      LatLng point = list.get(z);
      options.add(point);
    }
   line = myMap.addPolyline(options);

And calculating distance for usimg **Google Maps Direction API**

0 commentaires