WatermarkTextBoxに住所を入力して「OK」ボタンをタップした際に、エラーが発生した時の処理
メンバー変数flagをFalseで初期化し、警告メッセージを表示して、現在地を表示する画面に戻ります。
1 | Private Async Sub ErrorShow() |
3 | Dim message As New MessageDialog("住所が不正です。現在位置を表示します。") |
4 | Await message.ShowAsync |
5 | resetButton_Click(Nothing, Nothing) |
Geolocatorの機能が変更された時に発生する処理
Geolocatorオブジェクトの更新後の状態を、変数positionStatusで参照します。
Select Case文で条件分岐を行います。
場所データを提供するGeolocatorオブジェクトがDisabledであった場合、つまり、場所プロバイダーが無効であった場合は、RunAsyncメソッドでディスパッチされたイベントの結果を非同期に返します。ディスパッチャの優先順位は標準のNormalを指定しています。
この場合は、「位置情報を取得できません。GPSおよび位置情報取得可能なPCでお試しください。」というメッセージボックスを表示させ、処理を抜けます。
非同期で行われるためメソッドの先頭にAsyncを追加します。
01 | Private Async Sub myGeolocator_StatusChanged(sender As Geolocator, args As StatusChangedEventArgs) |
02 | Dim positionStatus = args.Status |
03 | Select Case positionStatus |
04 | Case Windows.Devices.Geolocation.PositionStatus.Disabled |
05 | Await myCoreDispacher.RunAsync(CoreDispatcherPriority.Normal, Sub() |
06 | TitleTextBlock.Text = "位置情報を取得できません。GPSおよび位置情報取得可能なPCでお試しください。" |
WatermarkTextBoxに住所を入力して、[OK]ボタンがタップされた時の処理
メンバー変数flagをTrueで初期化します。RemoveHandlerステートメントで場所が変更された時に発生するイベントハンドラと、Geolocatorの機能が変更された時に発生イベントハンドラを無効にします。
住所から経度、緯度を取得するGeocoding APIを使用します。GeoCoding APIに関しては、下記のURLを参照してください。
> http://www.geocoding.jp/api/
引数qに住所を指定します。この場合は、WatermarkTextBoxに入力された値を指定しています。
String.Format("http://www.geocoding.jp/api/?v=1.1&q={0}", WatermarkTextBox.Text)を変数addressUriに格納しておきます。
新しいHttpClientのインスタンスmyHttpClientオブジェクトを作成します。
GetStringAsyncメソッドでaddressUriの応答本体を文字列として受け取り、変数myResponseに格納します。
XElement.Parseメソッドで結果XMLを格納しているmyResponseの内容を文字列として読み込みます。
メンバー変数myAddressLatitudeに要素の子要素の値(緯度)を格納します。
メンバー変数myAddressLongitudeに要素の子要素の値(経度)を格納します。
メンバー変数myAddressCoodinatePositionにmyAddressLatitude(緯度)とmyAddressLongitude(経度)をカンマで区切って格納しておきます。この値は前述の網掛け(B)で使用しています。
地図内を一度クリアして、DataShowプロシージャを実行します。
01 | Private Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click |
02 | If WatermarkTextBox1.Text <> String.Empty Then |
04 | RemoveHandler myGeolocator.PositionChanged, AddressOf myGeolocator_PositionChanged |
05 | RemoveHandler myGeolocator.StatusChanged, AddressOf myGeolocator_StatusChanged |
07 | Dim myHttpClient As New HttpClient |
08 | Dim myResponse = Await myHttpClient.GetStringAsync(New Uri(addressUri, UriKind.Absolute)) |
09 | Dim xmldoc As XElement = XElement.Parse(myResponse) |
10 | myAddressLatitude = xmldoc.Descendants("coordinate").Elements("lat").Value |
11 | myAddressLongitude = xmldoc.Descendants("coordinate").Elements("lng").Value |
12 | myAddressCoodinatePosition = myAddressLatitude & "," & myAddressLongitude |
13 | myMap.Children.Clear() |
[リセット]ボタンがクリックされた時の処理
メンバー変数flagをFalseで初期化します。
RemoveHandlerステートメントで場所が変更された時に発生するイベントハンドラと、Geolocatorの機能が変更された時に発生イベントハンドラを無効にします。
地図内をクリアし、DataShowプロシージャを実行します。
1 | Private Sub resetButton_Click(sender As Object, e As RoutedEventArgs) Handles resetButton.Click |
3 | RemoveHandler myGeolocator.PositionChanged, AddressOf myGeolocator_PositionChanged |
4 | RemoveHandler myGeolocator.StatusChanged, AddressOf myGeolocator_StatusChanged |
今回はここまでです。また次回の記事でお会いしましょう。