Как нарисовать маршрут и рассчитать расстояние между несколькими маркерами на карте Google в Android - PullRequest
0 голосов
/ 01 марта 2019

В моем приложении пользователь может вставить несколько мест и показать на карте.Как я могу достичь этого?Я знаю, как нарисовать маршрут между двумя точками, но я хочу нарисовать маршрут между несколькими маркерами как изображение.enter image description here

На маркер изображения указывает местоположение, введенное пользователем.Я также хочу рассчитать расстояние между маркерами, как вычислить расстояние между B и C и C и D.

Как мне этого добиться?

Ответы [ 4 ]

0 голосов
/ 01 марта 2019
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 голосов
/ 01 марта 2019

Используйте API направления, которые возвращают направления из нескольких частей, используя серию путевых точек.

API направления Документация

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

Когда вы получаете ответ из вышеуказанного запроса.вам нужно нарисовать маршрут из ответа

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) {

    }
}  

Подробнее об этом вы узнаете из Draw-route-github

Для расчета расстояния вам нужно Матрица расстояний API - это сервис, который предоставляет расстояние и время в пути для матрицы происхождения и назначения

0 голосов
/ 01 марта 2019

Google предоставляет библиотеки "из коробки" для решения подобных проблем.

Я бы структурировал свое приложение следующим образом.

  1. Используйте Retrofit 2 для подключения к сети.(https://square.github.io/retrofit/)
  2. Используйте API Google, вам потребуется более 1 API для выполнения обеих задач.

    2.a Чтобы узнать расстояния между двумя точками, используйте Google DistanceMatrix API (https://developers.google.com/maps/documentation/distance-matrix/start).

    2.b Чтобы добавить несколько маркеров, вы можете обратиться к следующему ответу Google Maps JS API v3 - Пример простого нескольких маркеров

0 голосов
/ 01 марта 2019

Используя направление API, вы можете достичь этого.вам просто нужно передать введенный пользователем маркер в виде путевых точек следующим образом:

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

вы получите список маршрутов с расстоянием между точками

// дооснащение

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

// логика построения

 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() {

                                }
                            });
                }


            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...