逆ジオコーディング
ジオコーディングっていうのが、住所から緯度経度を求めるやつで、その逆だから、緯度経度から住所を求める。なるほ。サンプルがあったので、コピペしたろと思ったのだけれど、コピペも一筋縄ではいかなかった。
Point searchLocationPoint = Point.fromLngLat(mll.getLongitude(), mll.getLatitude());
if (!(searchLocationPoint == null)) { try { MapboxGeocoding reverseGeocode = MapboxGeocoding.builder() .accessToken("token") .query(searchLocationPoint) .country("JP") .geocodingTypes(GeocodingCriteria.TYPE_PLACE) .build(); reverseGeocode.enqueueCall(new Callback<GeocodingResponse>() { @Override public void onResponse(Call<GeocodingResponse> call, Response<GeocodingResponse> response) { List<CarmenFeature> results = response.body().features(); if (results.size() > 0) { CarmenFeature feature = results.get(0); Log.d("debug", feature.placeName()); } else { } } @Override public void onFailure(Call<GeocodingResponse> call, Throwable throwable) { throwable.printStackTrace(); } }); } catch (ServicesException servicesException) { } }
ほぼコピペだー。けどこれが動くまで結構難儀した。
勘違いその①-GeocodingAPI入れてない
MapboxのSDKが入ってりゃ使えるもんだと思ってた。Mapboxgeocodingが赤字になってなんでだーなんでだーっとやっていたのだけれど、それ用のライブラリを追加するために、gradleに追記しなきゃいけなかった。
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-core:4.1.1' implementation 'com.mapbox.mapboxsdk:mapbox-sdk-geojson:4.1.1' implementation 'com.mapbox.mapboxsdk:mapbox-sdk-services:4.1.1'
をappレベルのdependencies {}に追記したら使えるようになった。
勘違いその②-Retrofit2が必要だった、多分
サンプルコードをコピペしてAlt+Enterとかやってると、いつの間にか
import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response;
というのがimportされる。勝手にされたので、もう使えるもんだと思っていたらそうじゃないみたい。これもやっぱりgradleに追記しなきゃダメだった。
implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
これに気づくまで、サンプル通りに書いてんのになんで取得できんのじゃと思い悩んでいた。初心者には厳しいよう。で、これは何なの、と思い調べてみたけどAPIを使うのを便利にしてくれる、非同期処理もしてくれる。ぐらいしか分からん。頭も追いつかず、いつか分かる日が来るといいな…。
参考


理解できたと思われること
上から。
- Point.fromLngLatで住所を取得したい地点の座標からPointを作る。
- MapboxGeocoding.builder()で設定する。
- accessToken – 自分のトークンを書く。
- query – 座標をPoint型で書く。
- country – 国を限定する。自分の場合いらんかも。
- geocodingTypes – 住所の形式。TYPE_PLACEで市町村名まで。ここ参照。
- builder – 実行みたいなやつ、多分。
- 他にもあるけど俺はいんなかった。
- encueCallでデータ取りに行く。
- onResponceが成功した場合の処理…なのかな。API用のGeoJSON型みたいなので返ってくるので、それを受けてあげて、自分のしたい処理を書く。FeatureのgetplaceNameで住所が取得できる。
- onFailureが失敗した時の処理かな。ここで何すればいいのか分からんのでサンプルのまま。
Log.dで見てみたら、ちゃんと取得できてた。上の画像ね。
どっかにLogの代わりにTimberっていうのを使ってるコードを見かけたけど、それ使ったら
Since Timber is included in the project, it is likely that calls to Log should instead be going to Timber.
って嫌味言われるんだけど。import消してもずっと出るんですけど。なんなの。
それから
取得できた住所をマーカーに設定しようとしてもできない。ここはもう全然分からんな。どうやって表現しよっかなー。
参考

コメント