周囲の無線LANのアクセスポイントの信号から現在位置を割り出すPlaceEngineをMacにインストールしてみました。
上記サイトからダウンロードできるアプリには、内部に簡易Webサーバが搭載されていて、HTTPプロトコルでアクセスすると電波を測定して結果を返してくれます(JSONP形式)。その計測結果をPlaceEngineのAPIに送れば、現在位置がわかるという仕掛け。またローカルDBを持っていて、アプリ単体でも現在位置を割り出せるようです。
せっかくAPIが公開されているので、rubyで実装してみました。結果がJSライクなので、置換してevalして楽を。HTTPもcurlを使ってるのでお手軽簡単(てかちょっと卑怯...)。ただこれだといろんな言語でcurl用のAppKeyを使い回せるので実験用にはよいです。楽しない場合はこういった感じになるのでしょうか。
アプリを立ち上げて以下のrubyスクリプト実行すると、こんな感じで現在地点の経度/緯度や住所などが出ます。
num: 8 #検出したアクセスポイント数 x: 139.532042 #経度[°] y: 35.589786 #緯度[°] range: 5 #誤差[m] addr: 神奈川県****** #住所 floor: ** #階数などの情報 msg: 位置が取得できました
これがiPod touchに載ったら楽しいだろうな。
↓ちなみにMac OS Xとかcygwinのrubyなど、curlの入ってる環境でしか動きません。
#!/usr/bin/ruby $appk_curl = '****' # PlaceEngineのWebページで取得したcurl用のアプリキー $ts = Time.now.to_i def recvLoc(x,y,range,info) if range > 0 then puts "x: #{x}" puts "y: #{y}" puts "range: #{range}" puts "addr: #{info["addr"]}" puts "floor: #{info["floor"]}" puts "msg: #{info["msg"]}" else puts "error: #{range}" end exit end def recvRTAG(rtag,numap,t) puts "num: #{numap}" return false if numap <= 0 ret = `curl -s 'http://www.placeengine.com/api/loc?rtag=#{rtag}&t=#{$ts}&appk=#{$appk_curl}'` if $? != 0 then puts "error: #{$?}" exit end ret.gsub!(/':/, "'=>") eval ret puts "error: #{ret}" end ret = `curl -s 'http://localhost:5448/rtagjs?t=#{$ts}&appk=#{$appk_curl}'` if $? != 0 then puts "error: #{$?}" exit end eval ret puts "error: #{ret}"