はじめに
今回はBing Maps AJAX Controlの5回目です。1回目にあたる第13回のときに少しふれたように、Bing Maps AJAX Control 7.0から大幅にライブラリーの内容が変更され、機能が地図の表示に限定したコントロールライブラリーとなっています。住所から経緯度を得るジオコーディングなどを行いたい場合は、Bing Maps REST ServicesなどのWebサービスと組み合わせて使用します。今回は、Bing Maps AJAX ControlとBing Maps REST Servicesを連携したWebアプリケーションを作成してみましょう。
作成するWebアプリケーションは、Bing Mapsを単純にしたような、地図アプリケーションの基本、地図検索です。ユーザーが入力した地名の場所を検索し、検索結果の候補にプッシュピンを表示します(図1)。
ページの作成
まずは、これまでと同じように地図を表示するところまでコードを書いておきましょう。検索用のテキストエリアとボタンも用意しています。
BingMapsKeyの部分は、Bing Maps Keyに置き換えてください。
また今回は、JavaScriptのライブラリー、jQueryを使用します。上記コードではライブラリーの参照もしています。
以上のコードを元に地図検索用のコードを追記していきます。
Webサービスのリクエスト処理
Bing Maps REST Services
地名から経緯度を取得するには、Bing Maps REST ServicesのLocation APIを利用します。Bing Maps REST Servicesについては、第9回から第11回に渡って紹介しています。Location APIの詳細は第9回を参照してください。
Location APIは、ジオコーディング・逆ジオコーディングを提供するAPIです。地図検索のように住所や建物名などのクエリーからも地理情報を取得できます。今回のアプリケーションではクエリーから経緯度などの情報を得て利用します。
クエリーから情報を取得する場合、次のような形式のURLにアクセスします。
- http://dev.virtualearth.net/REST/v1/Locations?
query=東京タワー&
key=BingMapsKey&
c=ja-jp&o=xml
連載ではXML形式で取得していましたが、JavaScriptで扱いやすいJSON形式を利用します。またJSONPと呼ばれる一般的な仕組みを利用してAPIにアクセスし、レスポンス受信時に指定したJavaScriptの関数を呼び出して使います。これらの設定もLocation APIのURLのパラメーターに指定します。
- http://dev.virtualearth.net/REST/v1/Locations?
query=東京タワー&
key=BingMapsKey&
jsonp=callback&
o=json
c=ja-jp
セッションIDの取得
Bing Maps AJAX ControlおよびREST Servicesのどちらを利用するにもBing Maps Keyが必要です。それぞれにBing Maps Keyを設定してもよいですが、Bing Maps AJAX ControlのMapオブジェクトからBing Maps Keyとして使用できるセッションIDが取得できます。
Bing Mapsのライセンスの種別によって、一定期間に利用できるセッション数に制限があります。Bing Maps AJAX Controlのロードから、ユーザーがほかのWebページへ移動またはWebブラウザーを閉じるまでが1セッションとしてカウントされます。Bing Maps AJAX ControlからREST Servicesを利用する場合、セッションIDを利用するとセッションの消費を抑えられます。
セッションIDの取得には次のようにMapオブジェクトのgetCredentialsメソッドを使います。引数には、セッションIDを受け取る関数を指定します。
Location APIの呼び出し
さて以上を踏まえて、コードからLocation APIを利用してみましょう。先ほど示したコードに追記していきます。まず検索ボタンをクリックしたら呼ばれるsearch関数です。
次にセッションIDを受け取り、ジオコーディングを行う部分です。Location APIの呼出しは、jQueryを使って記述すると次のようになります。
非同期通信のためレスポンスは、geocodeCallback関数で受け取ります。
レスポンス処理
次はLocation APIのレスポンスを処理しましょう。通信に成功した場合、geocodeCallback関数が呼ばれるようにリクエストでは指定していました。受け取るJSON形式のデータは次のような内容になっています。
上記では2件目の地理情報を省略していますが、検索結果が2件ある場合の内容です。resources配列に結果の個数分の地理情報が含まれているのがわかります。今回使用する地理情報は、適切な表示範囲を示している矩形を表す2点の経緯度を含むbboxと、対象の地点を表すpointです。
何かしらのエラーが発生し検索結果が得られない場合は、次のようなレスポンスを得ます。エラーの内容がerrorDetails配列に格納されています。
それでは、レスポンスを処理するコードを記述します。エラーのレスポンスの場合はエラーメッセージを表示し、そうでない場合は、検索結果の件数分のプッシュピンを地図上に表示します。地図の表示する場所は、1件目のbboxの値を使います。
プッシュピンには1件目の検索結果から順にA、B、Cとテキストを表示するようにもしています。
ここまでを一度実行してみましょう。うまく動いたでしょうか。検索結果によっては、複数同じ経緯度の結果が得られる場合があります。その場合のチェックはしていませんので、プッシュピンが完全に重なった状態で表示される場合があります。
機能の追加
ここまでで、Bing Maps REST Servicesを利用した地図検索のWebアプリケーションができました。ここからはもう少し、アプリケーションをそれらしいものにするためブラッシュアップします。といっても大層な内容ではなく、プッシュピンにマウスポインターを合わせた時に地名を表示する、以前にも紹介したものです。今回はjQueryを使用しているので、簡単にフェードイン・フェードアウト効果も付けることができます。
まず地名を表示するためのdiv要素をHTMLのbody要素内に追加します。
次に、プッシュピンの追加時に、プッシュピンのイベントにイベントハンドラーを関連付けるよう処理します。geocodeCallback関数内のループ処理に、次の関数呼び出しを追記します。Pushpinオブジェクトと地名の文字列を渡しています。
イベントハンドラーの関連付けの処理は次の通りです。
最後にイベントハンドラー関連付けの削除処理も書いておきましょう。上記コードでは、プッシュピンのイベントハンドラー関連付けのとき、戻り値をmouseoverHandlerIdとmouseoutHandlerIdというプロパティに設定していました。これらは、Bing Maps AJAX Controlに用意されているものではなく、このアプリケーションで記憶用に拡張したものです。次のコードをGetMap関数内に追記します。
以上で、最初に示した図と同じWebアプリケーションの完成です。うまく動いたでしょうか。
ルートの探索
最後におまけとして、ドライビングルートの探索機能も追加してみましょう。ルート探索には、Bing Maps REST ServicesのRoutes APIを利用します。以前に紹介した通り、このAPIは日本語に対応していません。出発・到着地は英語で入力する必要があります。Routes APIの詳細は第11回を参照してください。
Webページに出発・到着地点を入力するテキストエリアと探索ボタンを追加します。
探索ボタンのクリックで呼び出されるroute関数、そしてリクエスト処理を行うcreateRouteRequest関数、最後にレスポンス処理を行うrouteCallback関数は、それぞれ次のようになります。
基本的な流れは、Location APIのときと変わりません。ルート探索ではプッシュピンの追加の代わりにポリラインを作成し、地図上に表示しています。実行結果は図2のようになります。
今回はここまでです。いかがでしたでしょうか。今回利用したBing Maps REST Servicesの代わりにほかのWebサービスを同様に利用すれば、マッシュアップ アプリケーションのできあがりです。Bing Maps AJAX Controlを活かしたアプリケーションをぜひ作成してみてください。