前回のエントリで記したとおり、自分が道路上にいるかどうかを調べるためには、そもそも道路のデータを保持していなければなりません。
このデータを使って地図上に高速道路や国道のラインをプロットすることが出来ます。
最初、前回のエントリで作ったデモに組み込もうと思って試しにやってみたんですが、位置データが多すぎるため、blazedsを使って単純にサーバからクライアントにプッシュするとTomcatが落ちてしまいました…(たぶんシリアル化する時に落ちてる)。
GoogleMaps APIを調べてみると位置データをエンコード化して読み込ませるというオプションがあったので、サーバ側でデータをエンコードした上でクライアントにプッシュすることで、そちらを実装してみたらうまくいったので公開します。
あ、そうそう、前回のデモでは関東圏だけしか動きませんでしたが、DBをアップデートしたので、今は日本全国調べられます。
説明
前回のデモに追加で実装したので、前回のサイト(停止しました)を訪れて同じように動かすだけです。
前回は、地図中心点に道路があるかどうかを調べ、道路に名前がついていればその旨表示するだけでしたが、今回はそのあとに表示されている地図の範囲の道路位置データをダウンロードしてGoogleMaps上にプロットします。 ダウンロードするのに最大で10秒くらいかかるかもしれないので、気長にお待ちください。
また、ある程度地図の拡大率が低い場合には、中心付近を一部だけロードするようにしています。DBのロード、データエンコード、クライアントへのプッシュ、クライアント側での描画、ととんでもなく時間がかかるためです。
また、手抜きプログラミングのため、同じ場所を拡大したとしても再度全てのデータを読み込み直します。ほんとはバッファとか用意した方が良いんでしょうが、重複判定するのも面倒だったりします。クライアント側にDB持ってるとそのあたりも柔軟にできるかもですが。
なんでこんなの作ったか
前回の道路名を調べるデモですが、結構条件がシビアで、きちんと場所を合わせているつもりでも道路名が出てこないことがあり、(作った本人が)いらいらしておりました。
まぁ、どこまで判定をシビアにするかというのはパラメータをいじれば済むのですが、あると思っていた道路が95年現在はなかったため道路名が表示されない、とか、そもそも道路名が登録されていないために表示されない、といった場合には、その場では原因がよく分からず「おかしい…」と悩んでしまったのでした。
であれば、DBに登録してある道路を周辺地区だけでもプロットし、そもそもDBに登録されているのか否かを調べられるとよろしい、ということで作ったのでした。
その他
現在は高速から一般道まで全て同じ色で表示していますが、色を変えたり、チェックボックスで表示する道路を選択できたりすると面白いかもしれません。
位置データのエンコードは、エンコード化ポリライン アルゴリズム方式というGoogleのページで説明されているのですが、いまいち日本語がよくわからず…。 検索したら、こちらのサイトにて、まさに合点のいかないところがシンプルに説明されており助かりました。