御当地訪問を支援するAndroidアプリ Gotouchi をつくりました

昨今では、アニメやコミック、ゲームの御当地を訪問することが流行しているようですね。気になって、日本にどのくらいの御当地があるのかを調べて、Google マップ上にプロットしてみました。*1

うわぁ…。このように日本全国津々浦々どこにいっても何かしらの御当地にブチ当たるという具合です。このような状況では、自分の家の近くや旅の行く先々のもたくさんのアニメやコミックの御当地が存在しているはずです。

そんな御当地が近くにあるかを簡単に確認できれば便利です。そこで Androidアプリ Gotouchi を作ってみました。

Gotouchiを起動すると、現在位置を測定し、近くにどの作品の御当地があるかを一覧表示してくれます。

ためしに、滋賀県にある、うちの家でためしてみると、滋賀県大津市のちはやふるの御当地が最寄のようです。全然知りませんでした… ちはやふるはまだ読んだことがないので、今度読んで御当地を訪問してみたいと思います。


一覧から作品のタイトルをタッチすると、御当地訪問をするのに参考になりそうなWebサイトを検索して表示することができます。出先で急に御当地訪問がしたくなっても、安心です。

精度はGoogle先生の検索に依存しますが、だいたいどなたかがまとめてくださったページに簡単にたどりつけます。


こんな感じの御当地訪問アプリを作ってみました。ソースコードとアプリケーションパッケージをgithubで公開していますので、興味のある方はぜひ使ってみてください。

御当地の情報は、地域別リスト[東京都心部] - info - 舞台探訪アーカイブ を使わせていただいています。大変充実していて参考になりました。

技術的なメモ

今回の実装の技術的なメモです。

GeoHashの利用

ある位置とある位置が近くにあるかを判定する計算量を抑えるために、GeoHashを使ってみました。位置情報をGeoHashで表現すると、特定の範囲内にあれば先頭の文字列が一致するので、文字列比較だけで、近傍判定ができます。例えば、以下の二つは先頭3文字が一致しているため、それなりに近くにあることがわかります。

  • 滋賀県大津市: xn0x5qy61b
  • 京都府宇治市: xn0rdxn7mb

文字列の一致量で精度が調整できたりもできます。緯度経度を文字列で表すGeoHash – @masuidrive blog がたいへん参考になりました。

位置情報インデックスの作成

今回の実装では事前に位置情報と作品名のペアをJSON形式で保存しておき利用しています。事前にGeoHashを計算してインデックスに含めて、Androidアプリ側での計算を抑えています。ただし、100KBくらいのデータがメモリに乗っかるのが玉にキズです。

JSONではなく、MessagePackを利用したり、重複情報がなくなるように工夫すればもう少しメモリ効率が良くなりそうです。

Androidでの位置情報取得

Androidで位置情報を取得する際には、GPSの情報やネットワークの情報を使うことができました。ただ、GPSでの位置情報取得は遅いので、

  • 起動時にはネットワークから取得
  • メニューから再取得を実行した際には、GPSから取得

のようにしています。Androidはこの位置情報のプロバイダを選択する際に何を優先するのかを選択できるので、実際には以下のようなコードを使っています。

    private void setLocationManager(boolean fine) {
        if (mLocationManager == null) { return; }
        showLoadingDialog();
        
        Criteria criteria = new Criteria();
        if (fine) { criteria.setAccuracy(Criteria.ACCURACY_FINE); } // 精度を優先するか?
        
        mProvider = mLocationManager.getBestProvider(criteria, true);
       // 省略
    }