なんとなくgithub page作った
Wifi location – Get your location with WiFi Mac Address and GoogleMap.
github page楽すぎる
前記事:Mac/LinuxのWiFiで位置情報を取得
wifi_locationというrubygemを作った。Mac (Lion, Mountain Lion)と Ubuntu 12.04で動く。
gem install wifi_locationwhereamiというコマンドが付属してるので、これを使うと
whereami --help
whereami --dump
{"towers":[{"bssid":"20:f3:a3:8c:66:ab","signal":-72},{"bssid":"00:0a:79:a5:7c:16","signal":-80},{"bssid":"1c:b1:7f:11:f8:c2","signal":-82},{"bssid":"20:f3:a3:32:58:f7","signal":-91},{"bssid":"の","signal":0},{"bssid":"00:24:a5:b8:90:e7","signal":-80},{"bssid":"10:c6:1f:ec:f8:49","signal":-56}],"location":{"latitude":35.640688,"longitude":139.6941365,"address":{"country":"日本","country_code":"JP","region":"東京都","city":"目黒区","street":"1丁目","street_number":"1"},"accuracy":40.0}}こういうのが出てくる。
WiFiアクセスポイントのBSSID(Macアドレス)と電波強度を http://www.google.com/loc/json に送ると位置情報が得られる。かなり精度高い。
参考
- linux のコマンドラインから、wi-fi の情報をつかって位置情報を得る – tokuhirom's blog.
- OSX のコマンドラインから、wi-fi の情報をつかって位置情報を得る – unknownplace.org
これをRubyで実装するとこうなる。
インストール
gem install wifi_location
Rubyから使う
#!/usr/bin/env rubyWiFiLocation.locationが返すhashに、緯度経度住所番地国名などなどが入っている。
require 'rubygems'
require 'wifi_location'
loc = WiFiLocation.location
puts "#{loc['latitude']}, #{loc['longitude']}"
p loc
whereami
gem installするとwhereamiコマンドが使える。whereami –map でgooglemapが開く
whereami –dump で全部表示
引数なしで、緯度経度のみ表示する。
オフラインで使う
WiFiLocation.towers でアクセスポイントのMacアドレスと電波強度だけを取得できる(googleには送らない)これはオフラインでも使える。
whereami –towers も同様。
ライフログ的な
crontabに*/5 * * * * ruby -e 'puts "#{Time.now.to_i}\t#{`whereami --towers`}"' >> ~/wifi-towers.txtとか書いておく。5分毎に~/wifi-towers.txt にunixtimeと電波状況が保存される。
インターネットに接続してからまとめて位置情報に変換してみる
cat ~/wifi-towers.txt | ruby -rjson -rwifi_location -lane 'a=$_.split(/\t/); time = Time.at a[0].to_i; loc = WiFiLocation.location JSON.parse a[1]; puts "#{time}\t#{loc.inspect}"'
結果が出てくる。
2012-08-03 20:05:00 +0900 {"latitude"=>35.5470762, "longitude"=>139.6434858, "address"=>{"country"=>"日本", "country_code"=>"JP", "region"=>"神奈川県", "city"=>"横浜市", "street"=>"3丁目", "street_number"=>"14"}, "accuracy"=>45.0}
2012-08-03 20:10:00 +0900 {"latitude"=>35.5823082, "longitude"=>139.663203, "address"=>{"country"=>"日本", "country_code"=>"JP", "region"=>"神奈川県", "city"=>"川崎市", "street"=>"1丁目", "street_number"=>"667"}, "accuracy"=>49.0}
2012-08-03 20:15:00 +0900 {"latitude"=>35.69384, "longitude"=>139.703549, "address"=>{"country"=>"日本", "country_code"=>"JP", "region"=>"東京都", "city"=>"新宿区", "street"=>"1丁目", "street_number"=>"4"}, "accuracy"=>166000.0}
WiFiのBSSID取得するコマンド、ネイティブアプリなら誰でも実行できるし、ブラウザやスマホと違ってダイアログも出ないからほんと変なアプリは入れないようにしたほうが良いと思う
以前自分でAndroid用のGPSロガーアプリを作っていたんだけど、収集した位置情報をAndroid内に持っていても特に面白いことが出来なくて悩んでた。
Android版のgoogle latitudeはもちろんサーバーに位置情報が溜まっているので、これを別の自分のサーバーから取得したほうが使い勝手がよい。
作ったもの https://github.com/shokai/google-latitude-logger
■google latitudeから位置情報を取る方法
GData APIからGoogle Latitude APIが使えるが、なんかわけがわからなかったのでgoogle latitude badgeからデータを取ることにした。
Google Latitude公開ロケーションバッジのページにgoogleアカウントにログインした状態で行き、「有効にして最新の現在地情報を表示する」にチェックを入れる。
webサイト用のembedコードから api?user=1234567890 の部分をメモする。
で、 http://www.google.com/latitude/apps/badge/api?user=1234567890&type=json を見ると自分の位置情報が書かれている。
位置情報を取得してMongoDBに保存するコードをlatitude-logger.rbに置いておいた。さくらVPSのサーバーで数分おきに動かして位置情報を保存している。
■保存した位置情報を使う
移動の方角と速度を計算してtwitterに投げるようにしてみた。
俺が元気に活動している様子がわかる。例えば、時速200km以上で西に移動するのが連続していたら新幹線に乗ってるのかなとか、そういう想像ができる。
位置情報をそのまま公開するのは気持ち悪いし危険だし誰も得しないので、何か加工して表示する必要があるのでちょっと抽象的な表現にしてみた。
地理的な知識があれば速度と方角だけでも結構何をしているかわかる。時速20〜40kmで東西に移動しているなら神奈川中央交通のバスに乗っているし、時速80kmぐらいだったら電車で東京に向かっている事が多い。けっこうわかる。
KMLで出力してGoogle Earthに表示してみた。これは先週木曜に学校に行こうとしてバスを乗り過ごして迷子になった時の移動のログ。
KMLファイルはAndroidで開いてもMapに描画されるので、サーバーで定期的に生成されてるようにしてあるからほぼ以前作ったAndroid用GPSロガーと同じ事ができている。
今後は俺が近くに来たら通知するアプリを作って配布しようかと思ったけどあまりうれしくないのでやめた。