Release版 .NET Framework 4のSystem.Device.Loation

Techdays2010のセッションで、System.Device.Locationを説明するセッションを担当しました。
あの当時は、Beta2で公開されていたものをベースに説明して、ブログでも書いていた気がします。
そして、時は経ち、この間このライブラリーに関する仕事をしていたら、なんと、クラス構成から何から全然違うぢゃないですか。

ということで、再度最新の使い方を紹介します。

最新のクラス構成は、下図のようになっています。

 

これらのクラスは、System.Device.Locationという名前空間で提供されます。Visual Studio 2010で使う場合には、プロジェクトの参照に、System.Device.Locationアッセンブリーを追加してください。
勘の良い方だと、なんとなく使い方が想像できるような名前のクラス群ですね。基本的な使い方は、GeoCodinationWatcherインスタンスを作成して、このインスタンスの位置情報変更通知イベントにハンドラーを追加して、位置情報が変わったら通知を受けるというものです。コードで書くと以下のようになります。

using System.Device.Location;…GeoCoodinateWatcher wather = new GeoCoodinateWatcher();watcher.PositionChanged +=    new EventHandler<GeoPositionChangedEventArgs        <GeoCoodinate>>(LocationChanged);watcher.Start();…void LocationChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e){    GeoCoordinate current = e.Poisitoin.Location;    double longitude = current.Longitude;    double latitude = current.Latitude;    DateTime changedTime = e.Poisition.Timestamp;    …

GeoCoodinateWatcherクラスのプロパティを調べると、位置がどのくらい変わったら通知を受けるか等を指定するためのパラメータがあるのが判るでしょう。

また、位置情報はイベントハンドラーコール時に渡されるイベント引数の、Position.Locationに、GeoCoordinateクラスとして格納されています。上のサンプルコードに示すように、ここから緯度、経度、高度、位置情報変化時間を知ることができます。

更に、この位置情報をCivicAddressResolverインスタンスに喰わせると、論理レベルの住所情報が取得できるような構造になっています。

デフォルトでは、Microsoft Location Selectorが動いていないので、これらの機能は使えません。フル機能を使うには、
コントロールパネル→位置センサーとその他のセンサー を開き、左下の“既定の位置”をクリックします。
地域の項目に“Microsoft Location Selectorを起動してコンピュータの現在の位置を検出します。”という項目があり、これをクリックします。