kazuakix の日記

Windows Phone とか好きです

Windows Phone で MapControl を使う (その 2)

昨日は MapControl を貼って Windows Phone に地図を表示することができました。
今日はその続きで位置情報を取得して地図を動かしてみます。

ViewModel を作る

位置情報をバインドする

位置情報 (Geopoint) だけを保持する ViewModel を作ります。

public class MainPageViewModel : BindableBase
{
    private Geopoint _location;
    public  Geopoint Location
    {
        get { return _location; }
        set { SetProperty(ref _location, value); }
    }
}

これを昨日の MapControl の Center プロパティにバインドすれば OK す。
"Mode=TwoWay" とするのがミソ...かな?

<Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,9.5,19,0">
    <Maps:MapControl 
        MapServiceToken="{StaticResource MapServiceToken}" 
        Center="{Binding Location, Mode=TwoWay}" 
        ZoomLevel="15" />
</Grid>

 

位置情報を取得する

位置情報を扱うために Package.appxmanifest を開いて機能の「場所」を有効にします。

f:id:kazuakix:20141222231355j:plain

これで Geolocator クラスを使って位置情報を取得できるようになるので、コチラを参考に (というか丸写しで) ViewModel にコードを追加していきます

    private readonly CoreDispatcher _coreDispatcher;
    private Geolocator _geoLocator;

    public MainPageViewModel()
    {
        _coreDispatcher = Window.Current.CoreWindow.Dispatcher;
    }

    // 位置情報取得開始
    public void StartGeolocator()
    {
        if (_geoLocator == null)
        {
            _geoLocator = new Geolocator();
        }
        _geoLocator.MovementThreshold = 3.0;
        _geoLocator.PositionChanged += OnGeoLocatorPositionChanged;
    }

    // 位置情報取得終了
    public void StopGeolocator()
    {
        if (_geoLocator != null)
        {
            _geoLocator.PositionChanged -= OnGeoLocatorPositionChanged;
        }
    }

    // 位置情報取得
    private async void OnGeoLocatorPositionChanged(Geolocator sender, PositionChangedEventArgs args)
    {
        await _coreDispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            Location =
                new Geopoint(new BasicGeoposition
                {
                    Longitude = args.Position.Coordinate.Point.Position.Longitude,
                    Latitude = args.Position.Coordinate.Point.Position.Latitude
                });
        });
    }

実際に位置情報を取得している部分がちょっとややこしいですね。

動かしてみる

エミュレーターの位置情報を操作して それなりに都会と思われるところに移動してみました。こういったあたり Windows Phone は本当に使い勝手がいいですね。

f:id:kazuakix:20141222223403j:plain,w400

もっとも肝心の地図はこんな感じなんですけど...

f:id:kazuakix:20141222223409j:plain,w240

でもまぁ、
f:id:kazuakix:20141222224118j:plain
いや、アカンとは思うよ。