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.
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?
4 Réponses :
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
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
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.
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
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**