スマホが位置情報を取得する方法は大きく3つあります。
- GPS
- 携帯基地局
- wifi
このうち、携帯基地局とwifiは、スマホがGPSで取得した位置情報をGoogleなりAppleがサーバサイドで紐付けることで、位置情報を推定しているようです。
携帯基地局やwifiの情報から位置情報を逆引きするためには、Google Map APIを使えば出来るのですが、ルナスコープのようなGPSトラッキングをしているサービスでは、Google Mapプレミアムサービスへの申し込みが必須のため気軽に利用することが出来ません。
GPSトラッキングしていても無料で利用できるサービスを探したところ、OpenCelliD というものがありました。
OpenCelliDとは
OpenCelliDホームページ
世界中の基地局情報のデータベースを無料で公開するプロジェクト。位置情報はOpenCelliDのAndroidアプリを使ったユーザが登録するようになっています。
OpenCelliDのAndroidアプリ
ダウンロードできる基地局データ
無料でアカウントを作成してログインするとダウンロードページにアクセスできるようになります。
この時は、560MB程度のCSVファイルを提供していました。(時間がたつと大きくなるはず)
CSVは次のようなカラムに分かれています。
radio, mcc, net, area, cell, unit, lon, lat, range, samples, changeable, created, updated, averageSignal
カラムについては、こちらのwikiページに説明があるのですが、一部カラムについて過不足があるのようなのでwikiの更新が遅れているのかもしれません。
実際にデータベースに入れて試す
お試しでAWSのRDSにPostgreSQLのインスタンスを立ててデータをインポートしてみました。
DBが起動したら、CSVに合わせて次のようなテーブルを作りました。
CREATE TABLE cell_towers( radio varchar(16), mcc int, net int, area int, cell int, unit int, lon double precision, lat double precision, range int, samples int, changeable int, created int, updated int, averageSignal int );
試しで検索する部分についてインデックスも貼っておきます。
CREATE INDEX cell_index ON cell_towers (cell); CREATE INDEX mcc_index ON cell_towers (mcc);
先程ダウンロードしたファイル(560MB程度)を解凍して(3GB程度)から、pgadmin4でDBに接続して、インポートを実行しました。
pgadminを使うとCSVファイルを指定するだけでインポートが出来て便利です。
DBで必要な容量を見積もらずにやったのですが、おおよそ6GBくらいを使いました。(最初、DB容量が足りなくてインポートに失敗しました。。)
データが無事にインポートできたら次のようなSQLで検索すれば、基地局の位置情報が取得できます。
select * from cell_towers where cell = xxxxxxxxx limit 1;
日本の基地局の網羅状況について
都市部は割りと基地局のデータがあるようです。実際に東京の調布で取得した基地局データを2つテストしてみたところ、1つは見つかって、1つは見つからなかったです。
しかし、地方はまだまだスカスカなイメージです。
これからのデータ充実に期待しましょう。
※皆様、ぜひ一度 OpenCelliDのアプリをインストールして生活圏の基地局情報を送信してください!