Mapboxで逆ジオコーディングしたい

スポンサーリンク
スポンサーリンク
サンタレーダー - Apps on Google Play
クリスマスだろうがなんだろうが サンタさんが今どこにいるか表示するよ。 音楽も鳴るよ。 サンタさんを呼び寄せられるよ。 高速移動だよ。 サンタさんとあなたの距離を測れるよ。 住所は微妙なところだよ。 サンタさんの位置を共有できるよ。 だからといってあなたのところに サンタさんがくるとはかぎらないよ。

スポンサーリンク

逆ジオコーディング

ジオコーディングっていうのが、住所から緯度経度を求めるやつで、その逆だから、緯度経度から住所を求める。なるほ。サンプルがあったので、コピペしたろと思ったのだけれど、コピペも一筋縄ではいかなかった。

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を使うのを便利にしてくれる、非同期処理もしてくれる。ぐらいしか分からん。頭も追いつかず、いつか分かる日が来るといいな…。

参考

https://www.tsurutan.com/entry/2016/10/04/003929
Retrofit2使ってみる - Qiita
概要 Square製のRESTクライアントライブラリであるRetrofit2の基本的な使い方とか設定とか一連の流れを備忘録的に書きます。Rxjavaには今回触れません。 標準的な設定から使用まで リクエストheaderの追...
Retrofit を使ってAPIを呼びだす - Qiita
AndroidのライブラリであるHTTPクライアント「Retrofit」を使ってWeb APIを呼び出す。 呼び出すもの Zaif APIでビットコインのティッカー情報

理解できたと思われること

上から。

  1. Point.fromLngLatで住所を取得したい地点の座標からPointを作る。
  2. MapboxGeocoding.builder()で設定する。
    • accessToken – 自分のトークンを書く。
    • query – 座標をPoint型で書く。
    • country – 国を限定する。自分の場合いらんかも。
    • geocodingTypes – 住所の形式。TYPE_PLACEで市町村名まで。ここ参照。
    • builder – 実行みたいなやつ、多分。
    • 他にもあるけど俺はいんなかった。
  3. encueCallでデータ取りに行く。
  4. onResponceが成功した場合の処理…なのかな。API用のGeoJSON型みたいなので返ってくるので、それを受けてあげて、自分のしたい処理を書く。FeatureのgetplaceNameで住所が取得できる。
  5. 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消してもずっと出るんですけど。なんなの。

それから

取得できた住所をマーカーに設定しようとしてもできない。ここはもう全然分からんな。どうやって表現しよっかなー。

参考

Geocoder
Official documentation on the Mapbox Java SDK Geocoding API.
Introduction
An introduction to the Mapbox web services APIs.
https://www.mapbox.com/android-docs/java/examples/geocoding-java-service/

コメント

タイトルとURLをコピーしました