昨日は 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 を開いて機能の「場所」を有効にします。
これで 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 は本当に使い勝手がいいですね。
もっとも肝心の地図はこんな感じなんですけど...
でもまぁ、
いや、アカンとは思うよ。