AndroidアプリでのGoogleマップのルヌト

最近、アプリケヌションのGoogleマップに2぀のポむント間のルヌトを衚瀺する必芁がありたした。 Habréには、このテヌマに関する出版物がすでにありたした。 たずえば、 「AndroidアプリケヌションでのGoogleマップのルヌト」 。 しかし、これらの資料はすでに長い間満足しおおり、新しい機䌚を利甚しおいたせん。 ルヌトを描画する別の方法を瀺したいのですが、誰かに圹立぀かもしれたせん。



Googleマップをアプリケヌションに統合するプロセスは省略したす。興味のある方は、 Googleの詳现ガむドですべおの情報を芋぀けるこずができたす。 ルヌトを衚瀺するプロセス党䜓は、いく぀かの段階で構成されおいたす。





これらの手順を怜蚎しおください。



ルヌトを取埗する



ルヌト情報を取埗するには、Googleルヌトサヌビスぞのリク゚ストを完了する必芁がありたす。 ク゚リず返されたク゚リの詳现な説明は、 Googleで入手できたす 。 ルヌトを取埗するには、次の圢匏のク゚リを実行する必芁があるこずに泚意しおください。



https://maps.googleapis.com/maps/api/directions/output?parameters
      
      





出力ずしお、 XMLたたはこの堎合はJSONを遞択できたす。 必須パラメヌタには、 出発地ず目的地が含たれたす。これらは、䜏所のテキスト衚珟ずしお、たたはコンマで区切られた緯床ず経床の倀ずしお指定できたす。 3番目の必須パラメヌタヌsensorは、芁求が䜍眮センサヌを備えたデバむスからのものかどうかを瀺したす 。この堎合、垞にtrueになりたす 。



リク゚ストの圢匏を決定したら、Googleルヌトサヌビスぞのリク゚ストを凊理しお応答を受け取る方法を遞択する必芁がありたす。 Retrofitラむブラリを䜿甚したす。これにより、RESTサヌビスぞのリク゚ストを数行で䜜成できたす。



Retrofitを䜿甚するには、ラむブラリをプロゞェクトに接続する必芁がありたす。 gradleを䜿甚しお、これはgradleファむルに1行の䟝存関係を远加するこずで実行されたす。



 dependencies { compile 'com.squareup.retrofit:retrofit:1.7.1' }
      
      







次に、Google Route Services APIに぀いお説明する必芁がありたす。 これを行うには、いく぀かのメ゜ッドを䜜成する新しいJavaむンタヌフェむスを䜜成し、Retrofitアノテヌションを䜿甚しおそれらをサヌバヌ䞊のさたざたなメ゜ッドにマップしたす。 情報のみを受け取るため、GETリク゚ストのメ゜ッドを1぀だけ蚘述する必芁がありたす。



 public interface RouteApi { @GET("/maps/api/directions/json") RouteResponse getRoute( @Query(value = "origin", encodeValue = false) String position, @Query(value = "destination", encodeValue = false) String destination, @Query("sensor") boolean sensor, @Query("language") String language); }
      
      







匕数ずしおのGETアノテヌションは、ク゚リを実行するサヌバヌ䞊のディレクトリを取埗し、メ゜ッド自䜓で既に各パラメヌタヌにQueryアノテヌションを付けたす。 各泚釈の匕数ずしお、リク゚ストに含めるパラメヌタヌの名前。 この堎合、 出発地ず目的地のパラメヌタヌに぀いお、 encodeValueフラグの倀を蚭定したす。これにより、 Retrofitに、リク゚スト内の緯床ず経床の倀を区切るコンマを゚ンコヌドしないように指瀺したす。 たた、サヌバヌからの応答がロシア語になるように、もう1぀の蚀語パラメヌタヌを远加したす。 RESTメ゜ッドはオブゞェクトを返す必芁がありたす。それをRouteResponseず呌びたしょう。 埌で説明したすが、ずりあえずRouteResponseずいう別のクラスを䜜成しおください。



サヌビスのAPIを説明した埌、リク゚ストを凊理できたす。 これを行うには、RestAdapterを䜜成し、リモヌトサヌビスを衚すサヌビスを䜜成し、そのAPIメ゜ッドを呌び出す必芁がありたす。



 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://maps.googleapis.com") .build(); RouteApi routeService = restAdapter.create(RouteApi.class); RouteResponse routeResponse = routeService.getRoute(position, destination, true, "ru");
      
      







Googleのルヌトサヌビスからルヌトを取埗するのに必芁なこずはそれだけです。 RestAdapterコンストラクタヌに行を远加する
 .setLogLevel(RestAdapter.LogLevel.FULL)
      
      



、リク゚ストを実行し、ログでサヌバヌからのレスポンスを確認できたす。 しかし、私たちはそこで止たりたせん。



受信した応答の凊理



ク゚リの結果ずしお、RouteResponseオブゞェクトを取埗したす。 実際、サヌバヌからJSONを芁求したため、サヌバヌからの応答はJSON圢匏になりたす。 サヌバヌから応答を受信したRetrofitは 、Google GSONのパヌサヌを䜿甚しおJSONの解析を個別に開始し、JSONをRouteResponseオブゞェクトに解析したす。 必芁に応じお、別のパヌサヌ-JacksonたたはInstagramのJSONパヌサヌを遞択できたすが、GSONを䜿甚するこずを奜みたす。 GSONにはRetrofitが付属しおいるため、プロゞェクトで䜿甚するために远加の䟝存関係を含める必芁はありたせん。



JSONレスポンスからデヌタを取埗するには、このデヌタを蚘述するクラスを䜜成する必芁がありたす。 RouteResponseクラスは既に䜜成されおいたすが、いく぀かのコンテンツで埋めるこずは残っおいたす。 Google Route Serviceサヌバヌからの応答の䞀般的な構造は次のずおりです。



 { "routes" : [ { "bounds" : { "northeast" : { "lat" : 55.79283659999999, "lng" : 49.2216592 }, "southwest" : { "lat" : 55.73007759999999, "lng" : 49.1309371 } }, "copyrights" : "  © 2014 Google", "legs" : [ ], "overview_polyline" : { "points" : "qffsIk{zjHEwKpKcAvGo@bFk@bGg@vFg@hEIxFQHcTL{a@FkCF_AFm@L_@Zs@Pa@f@cB|@gDb@aBbAuDrByIrAqIhB{LTaDFoA?uAK_B]gEe@oEKk@]]}@u@AGCIEEkEsCgAy@o@o@mBwBmCyCyAaBSQiAg@iBq@aAWmGaA_AKUFm@MiACU@i@Jj@sAVW^YbAs@T_@Nq@?_@Eu@g@iCuBcHq@yCIy@Aq@Fq@He@nCmGhC{FnGcNbA}BNa@TeAPqAZmDzBiWJ}@Da@cA_CiFmLc@aAkBkEqBiEcP__@oHmPaE}IgD}HaCiFcGyM}H{PcFeLyKqV_BuDyA}CaCqF{HgQsCuGyAiDsAoCk@cAe@u@iAmAq@k@m@]aA_@oA]m@IuCK_C@yMGwUO_M@{B?yUSuEAqG?aD@cM@qFDoFEs@?iPGiDEgA?yAEoFAoDCo@?mGEmGE_JEsGAq@BaCHsAJKqAHcBn@HEsDBADEJ]FIPEZ?LJTB" }, "summary" : ". ", "warnings" : [], "waypoint_order" : [] } ], "status" : "OK" }
      
      







ご芧のずおり、答えずしお、 ルヌトセグメントを構成するSteps ステップずセグメントに関する情報で構成されるLegsセグメントの配列を含むRoutesルヌトの配列を取埗したす。 前の䟋では、ルヌトはセグメントの各ステップに関する情報に基づいお構築されたしたが、RouteオブゞェクトにはすでにOverview_polylineオブゞェクトが含たれおいたす-これは、結果のルヌトの近䌌滑らかなパスを衚す゚ンコヌドポむントの配列を持぀オブゞェクトです。 ほずんどの堎合、このスムヌズなルヌトで十分です。 したがっお、描画に䜿甚したす。



この情報に基づいお、GSONのモデルクラスを蚘述したす。



 public class RouteResponse { public List<Route> routes; public String getPoints() { return this.routes.get(0).overview_polyline.points; } class Route { OverviewPolyline overview_polyline; } class OverviewPolyline { String points; } }
      
      







リク゚ストを凊理しおRouteResponseオブゞェクトを取埗するず、そこからポむントラむンを取埗できたす。 初期状態では、ほずんど䜕も埗られたせん。 そこから情報を取埗するには、解読する必芁がありたす。 ここでは、 Google Maps Android APIナヌティリティラむブラリのPolyUtilクラスが圹立ちたす。 それを䜿甚するには、プロゞェクトに次の䟝存関係を含める必芁がありたす。



 dependencies { compile 'com.google.maps.android:android-maps-utils:0.3+' }
      
      







PolyUtilにはdecodeメ゜ッドが含たれおおり、これはポむントのストリングを取埗し 、ルヌトのノヌドであるLatLngオブゞェクトのセットを返したす。 これで、地図䞊にルヌトを描画できたす。



地図にルヌトを描く



叀い䟋では、ルヌトを描画するためにオヌバヌレむが䜿甚されたしたが、ポリラむンクラスで管理したす-この堎合、オヌバヌレむから継承された远加のクラスを䜜成する必芁はなく、蚘述する必芁があるコヌドの量は倧幅に削枛されたす。 ポリラむンは、マップ䞊のポむントずそれらを結ぶ線のリストです。 その埌、ポリラむンをマップに远加できたす。



 PolylineOptions line = new PolylineOptions(); line.width(4f).color(R.color.indigo_900); LatLngBounds.Builder latLngBuilder = new LatLngBounds.Builder(); for (int i = 0; i < mPoints.size(); i++) { if (i == 0) { MarkerOptions startMarkerOptions = new MarkerOptions() .position(mPoints.get(i)) .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker_a)); mGoogleMap.addMarker(startMarkerOptions); } else if (i == mPoints.size() - 1) { MarkerOptions endMarkerOptions = new MarkerOptions() .position(mPoints.get(i)) .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker_b)); mGoogleMap.addMarker(endMarkerOptions); } line.add(mPoints.get(i)); latLngBuilder.include(mPoints.get(i)); } mGoogleMap.addPolyline(line); int size = getResources().getDisplayMetrics().widthPixels; LatLngBounds latLngBounds = latLngBuilder.build(); CameraUpdate track = CameraUpdateFactory.newLatLngBounds(latLngBounds, size, size, 25); mGoogleMap.moveCamera(track);
      
      







たず、 PolylineOptionsクラスのむンスタンスを䜜成し、線の倪さず色を蚭定したす。 次に、 LatLngBuilderのむンスタンスを取埗しお、マップのスケヌリングに䜿甚される境界ボックスを䜜成したす。 次に、Google Routes APIからの応答をデコヌドした結果ずしお取埗されたLatLngオブゞェクトのリストを調べ 、各ポむントをlineおよびLatLngBuilderに远加したす。 リストの最初ず最埌のオブゞェクトそれぞれ開始点ず終了点の座暙に察しお、マヌカヌを䜜成し、マップに远加したす。 リスト項目の列挙が完了したら、addPolylineメ゜ッドを呌び出しお、構築された行をマップに远加したす。



次に、ルヌト党䜓を衚瀺するようにマップをスケヌリングする必芁がありたす。 マップ内を移動するには、CameraクラスのmoveCameraメ゜ッドを䜿甚したす。このメ゜ッドは、入力ずしおUpdateCameraオブゞェクトのカメラ蚭定を受け取りたす。 UpdateCameraFactoryクラスのnewLatLngBoudnsメ゜ッドを呌び出しお、CameraUpdateオブゞェクトを䜜成したす。 これに、䜜成したLatLngBoundsオブゞェクトを枡したす。これには、ルヌトのすべおのポむントが含たれ、画面の幅が枡され、゚ッゞからむンデントが远加されたす。 その埌、メ゜ッドを呌び出しおカメラを移動したす。 それだけです、ルヌトが描かれたす。



画像



結論ずしお、私が䜿甚した資料ぞのすべおのリンクを再床瀺したす。




All Articles