ブリリアントなWP7 RSSフィード

2011-12-07

地図(Bing Map)で地名検索する方法

地名検索を行なって、該当地名を地図の中央へ表示する方法を解説します。
なお、地図表示方法につきましては前々回エントリーを参照ください。

地名検索する方法の概要説明

Bing Mapに地名検索機能はありません。
そのため、Bing Maps SOAP Servicesを利用して、地名から緯度/経度を取得出来ます。取得した緯度/経度をBing Mapへ設定して、地図の中央に地名検索した対象を表示します。

Bing Maps SOAP Servicesの利用準備

以下の手順に従って参照設定に追加してください。

  1. [ソリューション エクスプローラー]の[参照設定]を右クリックして[サービス参照の追加]を選択。
    f:id:bs-wp7:20111205140902p:image
  2. [アドレス]に http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc をコピペして、[移動]ボタンをクリックします。
    画像のようにサービスが見つかったら[OK]ボタンをクリックしてください。これで Service References が追加されます。
    f:id:bs-wp7:20111205140901p:image

主要API

GeocodeServiceClient API
イベント意味
GeocodeCompleted地名から緯度/経度の検索が終わった時に呼ばれるイベントです。
EventHandler<GeocodeCompletedEventArgs>イベントハンドラを設定する事になり、イベントが呼ばれる条件を満たした時に引数指定した名前のメソッドが呼ばれます。
メソッド意味
GeocodeAsync非同期で地名から緯度/経度を取得する処理が開始されます。
対象となるのは引数に指定したGeocodeRequestになります。
GeocodeRequest API
プロパティ意味
CredentialsBingMapKeyが設定されたCredentialsを設定します。
Query地名を設定します。今回は検索対象の地名を設定する事になります。
Credentials API
プロパティ意味
ApplicationIdBingMapKeyを設定します。

サンプルコード

以下のような動作を行うサンプルコードとなります。

  • 検索ボタンが押下されたら、テキスト入力された地名を元に緯度/経度を取得します。
  • 緯度/経度が取得できたら、該当ポイントが地図の中央になるよう移動します。
usingの追加

二行目のServiceReference1は、Bing Maps SOAP Servicesの参照追加した際の名前になります。

using Microsoft.Phone.Controls.Maps;
using PhoneApp1.ServiceReference1;
内部実装
private void btnSearch_Click(object sender, RoutedEventArgs e)
{
    var geocodeService = new GeocodeServiceClient("BasicHttpBinding_IGeocodeService");
    geocodeService.GeocodeCompleted += new EventHandler<GeocodeCompletedEventArgs>(geocodeService_GeocodeCompleted);

    // 地名から緯度/経度を取得するためのAPI初期設定
    var geocodeRequest = new GeocodeRequest();
    geocodeRequest.Credentials = new Credentials();
    geocodeRequest.Credentials.ApplicationId = ((ApplicationIdCredentialsProvider)map.CredentialsProvider).ApplicationId;
    geocodeRequest.Query = txt.Text;

    geocodeService.GeocodeAsync(geocodeRequest);
}


void geocodeService_GeocodeCompleted(object sender, GeocodeCompletedEventArgs e)
{
    // 緯度/経度が取得出来たかをチェック
    if (e.Result.Results.Count > 0 && e.Result.Results[0].Locations.Count > 0)
    {
        // 地名から緯度/経度が取得出来たので、該当ポイントをMap中央になるよう移動
        var geocodeLocation = e.Result.Results[0].Locations[0];
        map.Center = geocodeLocation;
    }
    else
    {
        // 地名から緯度/経度を取得する事に失敗
    }
}
画面キャプチャ

f:id:bs-wp7:20111205145515p:image
「品川駅」で検索した後の画面キャプチャになります。結果として地図の中央に品川駅が表示されています。
地図(Bing Map)にピンを立てる方法 エントリー内容を見て、結果のポイントにピンを立てると良い感じになりそうです。

Tips

緯度/経度から地名を取得する方法

GeocodeRequestの逆の事をするReverseGeocodeRequestと言うAPIが用意されています。ただし、日本の緯度/経度には対応していません

using PhoneApp1.ServiceReference1;
using Microsoft.Phone.Controls.Maps;
using Microsoft.Phone.Controls.Maps.Platform;
…省略…
        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            var geocodeService = new GeocodeServiceClient("BasicHttpBinding_IGeocodeService");
            geocodeService.ReverseGeocodeCompleted += new EventHandler<ReverseGeocodeCompletedEventArgs>(geocodeService_ReverseGeocodeCompleted);

            // 緯度/経度から地名を取得するためのAPI初期設定
            var reverseGeocodeRequest = new ReverseGeocodeRequest();
            reverseGeocodeRequest.Credentials = new Credentials();
            reverseGeocodeRequest.Credentials.ApplicationId = ((ApplicationIdCredentialsProvider)map.CredentialsProvider).ApplicationId;

            // ニューヨークの緯度経度を設定
            Location point = new Location();
            point.Latitude = 40.714353;
            point.Longitude = -74.005973;
            reverseGeocodeRequest.Location = point;

            geocodeService.ReverseGeocodeAsync(reverseGeocodeRequest);
        }

        void geocodeService_ReverseGeocodeCompleted(object sender, ReverseGeocodeCompletedEventArgs e)
        {
            if (e.Result.Results.Count > 0 && e.Result.Results[0].Locations.Count > 0)
            {
                Debug.WriteLine("郵便番号:" + e.Result.Results[0].Address.PostalCode);
                Debug.WriteLine("国名:" + e.Result.Results[0].Address.CountryRegion)
                Debug.WriteLine("都市名:" + e.Result.Results[0].Address.Locality);
            }
            else
            {
                // 緯度/経度から地名を取得する事に失敗
            }
        }

参考

Calculating a Route Using Bing Maps SOAP Services -MSDN
Developing a .NET Application Using Bing Maps SOAP Services -MSDN


技術部 かわかみひろき

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/bs-wp7/20111207/1323216269