web-dev-qa-db-ja.com

ルートを描き、グーグルマップ上の複数のマーカー間の距離を計算する方法android

私のアプリでは、ユーザーは複数の場所を挿入して地図に表示できます。どうすればこれを達成できますか? 2つの場所の間のルートを描く方法は知っていますが、複数のマーカーの間のルートを画像のように描きたいです。 enter image description here

画像マーカーには、ユーザーが入力した場所が表示されます。また、BからCおよびCからDの間の距離を計算するように、マーカー間の距離も計算したいと思います。

どうすればこれを達成できますか?

4
Darshi Patel

Googleは、この種の問題を解決するためのライブラリをすぐに提供します。

私は次のようにアプリケーションを構成します。

  1. ネットワークへの接続にはレトロフィット2を使用します。 ( https://square.github.io/retrofit/
  2. Google APIを使用すると、両方のタスクを実行するために複数のAPIが必要になります。

    2.a 2点間の距離を見つけるには、Google Distance Matrix API( https://developers.google.com/maps/documentation/distance-matrix/start )を使用します。

    2.b複数のマーカーを追加するには、次の回答を参照できます Google Maps JS API v3-単純な複数のマーカーの例

0
AbdulMueed

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

                                }
                            });
                }


            }
0
akshay_shahane
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
Puja Kamate