[Windows Phone] 緯度・経度を取得する


Windows Phoneで緯度・経度を取得するには System.Device.Location 名前空間が必要です。

System.Device.Location 名前空間を使用するには、最初に System.Deviceの参照を追加する必要があります。

次に、using ディレクティブに System.Device.Location を追記します。

using System.Device.Location;

経度・緯度を取得するには GeoCoordinateWatcherクラスを使用します。

まずは GeoCordinateWatcherのインスタンスを作成します。

コンストラクタは2つあり、既定の精度を利用するか、取得する精度を指定するかで使用するコンストラクタは異なってきます。

コンストラクタ
名前 説明
GeoCoordinateWatcher() 既定の精度を利用する
GeoCoordinateWatcher(GeoPositionAccuray) 取得する精度レベルを使用する

精度レベルはを指定する場合には GeoPositionAccuracy 列挙体の値を指定します。

最も正確な精度が必要な場合には High を指定しますが、デバイスのパフォーマンスが低下する場合があるので注意が必要です。

GeoPosiotionAccuray 列挙体
メンバー名 説明
Default 電力、パフォーマンス、その他のコストを考慮し最適化する
High 最も正確な情報を取得する。パフォーマンスが低下する場合がある。

インスタンスの作成例は下記の通りです。

GeoCoordinateWatcher gcw;

// コンストラクター
public MainPage()
{
    InitializeComponent();

    // インスタンスを作成
    gcw = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
}

位置情報の取得を開始するには Startメソッドを使用し、情報取得を終了するには Stopメソッドを使用します。Startメソッドは PositionChangedイベントを有効にして Positionプロパティにアクセスできるようにします。
位置情報が変化すると、PositionChangedイベントが発生します。

StartメソッドとPostionChangedイベントの使用例

// コンストラクター
public MainPage()
{
    InitializeComponent();

    // インスタンスを作成
    gcw = new GeoCoordinateWatcher(GeoPositionAccuracy.High);

    // イベントハンドラの作成
    gcw.PositionChanged += new EventHandler>(gcw_PositionChanged);

    // データ取得の開始
    gcw.Start();
}

// ポジション変化時の処理
void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs e)
{

}

経度・緯度を取得するにはPositionChangedイベントの中で、引数である GeoPositionChangedEventArgs の Posiotion.Location.Latitude(緯度) と Position.Location.Longitude(経度) から取得できます。

緯度ど経度は10進法で表されるため、60進法で表示したい場合は変換が必要です。ということで10進→60進の自作関数(Degree2Dms)を作成してみました。

緯度・経度を取得して60進で表示する

// ポジション変化時の処理
void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs e)
{
    // 緯度を取得
    txtLatitude.Text = Degree2Smd(e.Position.Location.Latitude);
    // 経度を取得
    txtLongitude.Text = Degree2Smd(e.Position.Location.Longitude);
}

// 度(10進)を60進に変換
string Degree2Smd(double deg)
{
    double dd = Math.Floor(deg);
    double mm = (deg - dd) * 60;
    double ss = mm - Math.Floor(mm);
    mm = Math.Floor(mm);
    ss = (ss * 60 * 1000) / 1000;
    return dd.ToString() + "°" + mm.ToString() + "′" + Math.Round(ss).ToString() + "″";
}

上記の実行例は下記の通りです。