iPhoneのSafariを使って走行中の道路名をtweetしてみた

というわけで、サーバに展開した国交省のデータを使って、実際にTwitterでつぶやくようなアプリを作ってみました。

といっても、専用アプリを書くのは面倒なので、ひとまずはiPhoneのSafariからGPS情報をサーバに送りつぶやくようにしてみました。

仕組み

iPhoneのSafariは、JavaScriptを利用して現在位置を取得するGeolocation APIに準拠しています。そこで、定期的にiPhoneから現在位置をサーバに投げてやり、サーバ側で道路名を解析してTwitterにツイートさせてやるような仕組みを作りました。 iPhoneのSafariでGPS情報を扱う方法は、Ascii.jpのiPhoneのGPSをJavaScriptで操ろうという記事が参考になります。

…というか、今回やったことはこの6ページ目にあるサンプル03をちょいといじっただけです。

ここのソースコードにupdate関数があり、位置情報が更新された際に呼び出されます。結構これは頻繁に呼び出されるので、たとえば10分おきにサーバに情報を伝えたい、なんてときには、update関数の最後あたりに

var now = new Date();
if ((now.getTime() - before.getTime() ) > (1000 * 60 * 10)){
    before = new Date();
    updateStatus();
}

こんなのを埋め込んで、10分おきにupdateStatus関数が呼ばれるようにすれば良いです。

そして、updateStatus関数内では、lat変数とlng変数を利用してサーバ側にデータを渡してやります。ここではXMLHttpRequestを使います。たとえばこんな感じに。

var url = "http://your_site.com/rest.jsp?lat=" + lat + "&lng=" + lng;
var myRequest = new XMLHttpRequest();
myRequest.open("GET", url);
myRequest.onreadystatechange = function(){ 
    //readyState値は4で受信完了
    if (httpoj.readyState==4){ 
        getServerResponse(httpoj)
    }
}
myRequest.send(null);

そしてまぁ、urlからの返答如何によっては再送したりなんなりをgetServerResponse内で実装してやれば良いです。

サーバ側では、前回までに作ったDBでHibernateを利用しつつ道路名を割り出し、Twitter4Jを使ってツイートをしています。

できばえ

まず大学まで、いつもとは全然違う道をとおって走ってみましたが、うまくいきませんでした。これは単純に道路名割り出しルーチン内で、しきい値がやたらシビアだったためでした。

そのため大学でちょっとプログラムを書き直し、またいつもとは全然違う道を走って動作確認をしたところ、そこそこうまくいっているようです(それが上の図)。 ただまぁ、例によって15年前のデータなので「浦和東村山線」なんて道路名が出てきたりしてますが、現在は「さいたま東村山線」だったりするようです。

最新のデータについては、先日国交省にもらえないのかメールしてみました。担当者に確認の後返事を頂けるようですが、どうも「公開していない理由」を担当者に確認するみたいな雰囲気なので、あまり期待せずに待っています^^;

まとめ

常にツイートし続けるのはどうかと思いますが、どっか遠出するときとかはおもしろいかもしれません。そこそこうまくツイートできてるっぽいですし。 今は一定間隔でツイートしてますが、道路が変わったらツイートする、なんてのも面白いかもしれませんね。

緯度経度から、その場所を走っている道路名を調べる

うわー、これまたタイトルからしてニッチ(笑

最近、「流行っている」と形容するのも恥ずかしいtwitterですが、「○○なう」などとつぶやいている人が結構見受けられます。「○○」にはその時訪れた場所だったり、その際やっている行動だったりが入るわけなんですが。

これ、車の運転中にはできないですよね、危なくて。なので、つぶやきをそれっぽく自動化できないか考えてみた訳なんですが…。

前回のエントリでは車の中を流れる各種データを取り出すことが出来たので、たとえば、エンジンを切らずに速度0が一定時間続いた回数をして「(ほぼ)信号待ちの回数」としてカウントし、「信号待ち100回目なう」などとつぶやくことは出来そうです。あるいは、制限速度を超えたら「現在XXkm/hで巡航中。○○県警かかってこいや」とつぶやくことも可能でしょう(よい子はまねしちゃいけません)。

…ただまぁ、大がかりなわりにはあまり面白そうなつぶやきのネタにはならなそうですし、第一この設備が一般的ではないので、他の人にとっては「ふーん」程度であまり参考にならないです(自分で運転を解析するにはとても面白い情報なんですけどね)。

そんなわけで、もう少し一般的なGPSから得られる位置情報を利用してなんかできないか考えてみました。それが、このタイトルにあるような技術を利用して「国道○○号線なう」みたいなことをつぶやくというものです。

ひとまずお披露目

とりあえず関東地区だけなのですが、緯度経度から道路名を調べるプログラムを組んでみました。こちらのページ (停止しました)でそれを体験することが出来ますので、ぜひ一度お試しください(適当に立てたTomcatサーバなので、落ちてたらごめんなさい)。ではいってらっしゃいませ。

…あ、おかえりなさい。使い方は分かったでしょうか? 地図の中心部に調べたい道路を合わせると、その地点の道路名を吹き出しに表示するものです。デフォルトの倍率だとうまく道路上に中心があわないので、少し拡大すると良いです。地図上だとあまりずれてないと思っても、拡大率によっては数ピクセルで10m以上ずれていることもあります。それでも現れない場合には別の原因が考えられます(後述します)。

さてさて、今は手動で位置を合わせているわけですが、当然ながら携帯やPCのGPS位置情報を利用して、自動的にその位置の道路名を割り出すこともできます。 なんとなく、定期的に携帯から位置情報を送信し、その都度道路名を調べて「国道○○号から首都高へ」とかつぶやけそう、じゃないですか?

どうやって道路名を調べるか

ちょろっと調べた限りでは、位置情報から道路名に変換する既存のサービスはなさそうでした。

位置情報から住所を割り出すサービスはあります。「逆ジオコーディング」と呼ばれますが、Finds.jpが無料でサービスを公開していますし、最近ではGoogleもGoogleMaps APIにてサービスを提供し始めました。ただ、住所じゃないんですよね、必要なのは…。あくまで道路。

Googleの逆ジオコーディングは、道路上の緯度経度を入力してやると、有名な道路の場合にはそのむね返答をしてくれることがあるようです。ただまぁ、どの程度入っているかわかりませんし、建物名や地名など混ざった状態で返答されてもちょっと…という気がします。

仕方ないので今回は、国土交通省が公開している国土数値情報を使って自分で調べるプログラムを組むことにしました。

国土交通省は、以前から無料で国土数値情報をデータで公開しています。数年前に気づいてブログのエントリにもしているのですが、エントリ先くらいのクオリティのデータはすぐに手に入るわけです。ただ、道路情報に限っては1995年版が最新で、そこは非常に残念なのですが…。 国交省内部では必ずデータはあるはずで、他のデータは新しいモノもあるので、しばらく待てば/担当者にかけあえば新しいデータを閲覧できるかも知れませんが、まぁひとまずはいいでしょう。誰がどのくらい使いたいかも分からないですし^^;

この道路情報には、道路の線分データと、その線分に対応する道路名と種別(高速・国道・県道・…)などが含まれています。 なので、与えられた緯度経度に対して、近い道路の線分データがあればその道路名を返答する、というプログラムを書いてやれば良いということになります(久しぶりに点と直線の距離を求める公式とか思い出した^^;)。

応用

今はGoogleMapsアプリという形になっていますが、WebサービスやiPhoneアプリ化することで実際に自動でつぶやけるようになります。…自分以外にこんなものを使う人がいれば、ですが^^; ひとまず今は乗りかかった船なので、関東以外のデータをDBに突っ込んでいる最中です。

また、いわゆる一般的な逆ジオコーディングを使って、「埼玉県に突入なう」などとつぶやくことも出来るので、組み合わせると面白いかも知れません。

問題点

問題点、あります。

まずは上の方に書きましたが、データが1995年のものということです。首都高は一部開通してませんし、アクアラインもありません。千葉の館山道もないっぽいです。上で紹介したGoogleMapsアプリを使ってどうしても道路名が出なかった方は、もしかしたらその時代にはまだ道路がなかった(あるいは名前が付いてなかった)のかもしれません。 これはまぁ、国交省が新しいものをリリースしてくれるのを待ったり、あるいは自力で最新データに書き換えるしかありませんね。

あとは、道路名が法定名なので、微妙に違和感があります。たとえば池袋や渋谷を走っている通称「明治通り」は、「芝新宿王子線」と出てきます。 国道は全て「国道○○号線」となっているのでまぁ問題ないですが、それより細かい範囲の道路に関しては「??」となる可能性があります。環七は「環状七号線」なんだけどなー。 これも、必要ならば頑張ってデータを加えていく必要があります。

副産物

95年産ではありますが、高速・国道等の線分データが得られます。 下の写真は、首都高のデータを抜き出してプロットしたものです。

GoogleMapsやGoogleEarthにプロットしたり出来るので、もしかしたらそういったものが必要な人には役に立つかも知れません。これらのデータは再配布可能らしいので、自由に使えるようです。

まとめ

国交省が配布しているデータを使って、緯度経度からその地点の道路名を割り出すプログラムを作りました。今のところ関東のみ・GoogleMapsでの動作確認デモプログラムしかありませんが、他の地域も現在DBに突っ込んでいます。また今度遠出したときにでも、PCあるいはiPhoneを利用して実際につぶやいてみようと思います。

データが古く道路の名称もなじみのないもの、と問題点がないわけではないですが、もし使ってみたい・興味があるという方はご連絡ください。このウィンドウの右側に常に出ているtwitterリンクから僕のアカウントに飛べます。

あと、なにかこのデータを使って面白いことができるといったアイディアがあったら教えてください^^;

DarwiinRemote 0.5をリリースしました

ごぶさたしております、Hiroakiでございます。

やっとこさVersion 0.5のご案内です。
今回のバージョンでは、クラシックコントローラのサポートおよび、これまで懸案の一つであったPPCマシンでの不具合の修正が行われています。
ダウンロードはこちらよりどうぞ。


そういえば、先月末に発売されたMac People 2007年4月号にWii関連の特集が組まれてDarwiinRemoteも紹介されました。
DarwiinRemoteの動作に関する質問や、ゲラ刷り原稿が編集の方からPDFで送られていてチェックを頼まれたりしたので、てっきり献本等のお話があるかと思いきや…。結局特に何もなく。
こちらから何か言うのもなんなので、自分では結局買わないままです。読みはしましたけど、ね。

記事自体はとても簡潔に操作法などが纏められているので、DarwiinRemoteの使い方が分からないなどの場合にはご参考になさってください。分かりやすいと思います。

DarwiinRemote and WiiRemoteFramework 0.5 have been released!

Hi all,

I’m very sorry that I was far away from developing DarwiinRemote…
anyway, I’ve released new version of DarwiinRemote and WiiRemoteFramework.


The latest DarwiinRemote supports classic controller, and some critical bugs including PPC issue were fixed. Please download the software from here. Enjoy!


In this version, especially Jasen made great efforts to improve the framework 😉

DarwiinRemote 0.4をリリースしました

なんか、Nobiさんに「なお、現行のバージョンは、やや技術スキルがある人を対象にしたものなので注意が必要だ。」と書かれてしまって、まぁ、確かに英語だけしかなければ普通の人は使うのを躊躇するかなぁ、なんて思ってしまった最近です。
というわけで、日本語でもリリースを書くことにします。日本語はFAQ以来なので少々詳しく書きます(あと、「日本語だから」ってのもありますけど^^;)。

DarwiinRemoteはご存じの通り任天堂のWiiについてくるWiiリモコン(単品でも買えます)をMacで使うようにするためのソフトウェアです。
今回のバージョン0.4では、以下のことが出来るようになりました。

  1. 拡張コントローラの一つであるヌンチャクに対応しました。
  2. 今までは自分でセンサの値をキャリブレーションする必要がありましたが、Wiiリモコン内部の値も使うことが出来るようになりました。
  3. Wiiリモコンのボタンを押した際に起こるイベントをカスタマイズできるようになりました。カスタマイズデータを保存することも出来るので、場面場面で切り替えることが出来ます。DarwiinRemoteメニューから、Preferences…を選んでください。
  4. マウスの移動速度を調整できるようになりました。

ダウンロードはこちらからどうぞ。この中にある、DarwiinRemote0.4.dmgというのがそれです。クリックすると、どこからダウンロードするか選べるはずですので、リストの中からどれかを選んで「Download」をクリックしてください。


クラシックコントローラへの対応とか、ヌンチャクのジョイスティックの対応とかやることはたくさんあったのですが、あまり間を開けるのもどうかなと思い、実用性があがって一段落ついたものをリリースしました。
ちなみに一般の方にはどうでも良いことですが、キーのカスタマイズはCoreDataとCocoa Bindingという比較的新しい技術を使って実装しました。初めて使いましたが、なかなか便利で良いですね。ただ逆に、10.3では確実に動かなくなってしまいました(今までのやつは、おそらくちょっとファイルを変えれば動いたはず)。まぁ来月には10.5も発表されるので大目に見てください。


P.S.
これまで微妙にamazonへのアフィリエイトリンクを貼っていましたが、このエントリだけはずいぶん貼ってあります(笑
もしまだWiiリモコンを持ってないという方は、よろしければこちらのエントリのリンクから飛んでamazonで購入してもらえると嬉しいです。いくばくかのお金(売り上げの3%くらい)がHiroakiのもとへ入ってきます。
ただまぁ、そんなことをいっても実際のところあまり期待はしていないのです。というのも、これまでのエントリで得られた紹介料は130円ですから(笑


次のバージョンではクラシックコントローラへの対応をやりたいです。
しかし、DarwiinRemoteで使うとなると「ジョイスティック」は何に使えばいいんでしょうね。もう一方のWiiRemoteFrameworkではいろいろ遊べそうですけれど。

DarwiinRemote and WiiRemoteFramework 0.4 have been released!

Hi all,
We’ve just released DarwiinRemote 0.4 and WiiRemoteFramework 0.4.

New features of DarwiinRemote are…

  • supports Nunchuk (sorry still not Classic Controller, but will support soon)
  • supports custom key mappings; you can customize mappings, save and load it.
  • supports mouse sensitivity
  • supports motion sensor auto calibration

New features of WiiRemoteFramework are…

  • supports communicating with Exspansion devices (now Nunchuk only)
  • posts notification when Expansion port is plugged and unplugged
  • post notification when battery is low
  • can retrieve calibration data

Enjoy them and please let me know what you notice about these software.

Download from here!

DarwiinRemote 0.3.1 and WiiRemoteFramework 0.3.1 are released!

Hi all,
We’ve just released a new version of DarwiinRemote.

This version supports battery status and fixes some bugs. Please use this version for all users.
You can download it from here(SourceForge.net)


The most important feature for developers is that DarwiinRemote has been divided into 2 parts, App part and Framework part. Now you can use WiiRemote Framework in your projects independently.
Please check sources of DarwiinRemote and WiiRemoteFramework at sourceforge.net.
If you are interested, develop your projects and introduce us at public forum in SourceForge.net.

WiiリモコンをMacからいじる

tokkyoくんに遅れること数日。

昨日から始めたWiiRemoteをMacで操るプログラミングですが、とりあえずこんな感じに。
グラフがふにゃっとなってるのは、OpenGLのキャプチャがうまくいかないからです。

ビットマスクとかせにゃならんボタンはとりあえず置いといて、

  • 3軸加速度センサのデータ
  • LEDのOn/Off
  • バイブレータのOn/Off
  • Wii RemoteのInquiry

は完成。

ボタンの判定のコードを書いたらひとまず公開して、他の誰かにきっちりしたのを作ってもらいたいところです^^;


しかし、Phidgetsなんかと比べてもかなり精度の良い値が返ってきますね。
これが4000円しないってのは凄いことだと思います。
これから、学会発表のプレゼンでWiiRemoteを見ることが増えたりするかも(笑

DarwiinRemote 0.3 is released!

It’s time to buy 2 candles 😉

Hi all!
DarwiinRemote 0.3 is released!! This version supports IR sensor and motion sensor calibration. Enjoy!

From this version, DarwiinRemote is hosted on SourceForge.net. Please download binary and sources of this version from here (sourceforge.net).

For developers:

I plan to divide Wii Remote Framework from DarwiinRemote.app. By using the framework, you might be able to use Wii Remote in your projects easily. It will include some additional functions such as various analyzing method like gesture recognition.

What do you think about this plan? I’m still not sure whether I can do that, please help
 this project if you interest.

Project site is here (sourceforge.net)

DarwiinRemote 日本語FAQ

なんか、海の向こうで大変盛り上がってしまったようで、作った本人がびっくりしております。次のバージョンでは遂にIRセンサが組み込まれるので楽しみにしていてください。SourceForgeで公開する予定です。
あと、加速度センサの値の変換もあまりに適当だったのでやり直します。

さて、ちょっとDarwiinRemoteでFAQ的なものを日本語で書いておきます。

  • これは何なのか
    • 任天堂のWiiに付属する(単品でも購入可能)WiiリモコンでMacを操作するものです
    • 現在のところ、三軸加速度センサとボタン、LED、バイブレーションモーターなどをサポートしています
    • AppleRemoteっぽいこともできます
  • 動作環境
    • Mac OS X 10.4以上
    • Bluetoothを接続できるマシン(某所で言われたIRポートはいりません)
    • Intel CoreでもPowerPCでもOK
  • マウスモードでカーソルがきちんと動かない
    • Wiiリモコンの加速度の値は個体差があるようです。次のバージョンではキャリブレーションの仕組みを導入します
    • そもそも傾けて操作するのは難易度が高いです。次のバージョンではセンサーバーを使ったポインティングも導入します
  • キーバインディングが変
    • できればキーバインドをコンフィグレーションできるようにしたいです
  • WiinRemoteの移植なのか
    • 違います。作者のtokkyoくんは同じ研究室の後輩ですが、コードを共有しているわけではありません。WiinRemoteの実装言語はDelphi、DarwiinRemoteの実装言語はObjective Cです
  • Wiiリモコンをハックするのは難しいのか
    • 単にデータを読み取るだけであれば全然難しくありません。ドライバを書こうとするとちょっと大変かもしれません
    • WiiLi.orgの情報だけでデータ取得できます
  • なんで英語の情報がメインなのか
    • WiiLi.orgで得た情報なので、まずは成果を還元すべきという思いから英語をメインにしました
    • 英語で書くと、アメリカだけではなくて多くの国の人が読めるというのもあります

では、今後ともよろしくお願いします。
技術的なこと、それ以外のことでも、何かありましたらコメントを残してもらえると嬉しいです。