近くにある病院の場所をキャラクターが音声で教えてくれるアプリを作る[4ページ目]

WatermarkTextBoxに住所を入力して「OK」ボタンをタップした際に、エラーが発生した時の処理

メンバー変数flagをFalseで初期化し、警告メッセージを表示して、現在地を表示する画面に戻ります。

  Private Async Sub ErrorShow()
    flag = False
    Dim message As New MessageDialog("住所が不正です。現在位置を表示します。")
    Await message.ShowAsync
    resetButton_Click(Nothing, Nothing)
End Sub

Geolocatorの機能が変更された時に発生する処理

Geolocatorオブジェクトの更新後の状態を、変数positionStatusで参照します。

Select Case文で条件分岐を行います。
場所データを提供するGeolocatorオブジェクトがDisabledであった場合、つまり、場所プロバイダーが無効であった場合は、RunAsyncメソッドでディスパッチされたイベントの結果を非同期に返します。ディスパッチャの優先順位は標準のNormalを指定しています。

この場合は、「位置情報を取得できません。GPSおよび位置情報取得可能なPCでお試しください。」というメッセージボックスを表示させ、処理を抜けます。
非同期で行われるためメソッドの先頭にAsyncを追加します。

  Private Async Sub myGeolocator_StatusChanged(sender As Geolocator, args As StatusChangedEventArgs)
    Dim positionStatus = args.Status
    Select Case positionStatus
      Case Windows.Devices.Geolocation.PositionStatus.Disabled
        Await myCoreDispacher.RunAsync(CoreDispatcherPriority.Normal, Sub()
        TitleTextBlock.Text = "位置情報を取得できません。GPSおよび位置情報取得可能なPCでお試しください。"
        Exit Sub
          End Sub)
        End Select
  End Sub

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プロシージャを実行します。

  Private Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click
    If WatermarkTextBox1.Text <> String.Empty Then
      flag = True
      RemoveHandler myGeolocator.PositionChanged, AddressOf myGeolocator_PositionChanged
      RemoveHandler myGeolocator.StatusChanged, AddressOf myGeolocator_StatusChanged
      Dim addressUri = String.Format("http://www.geocoding.jp/api/?v=1.1&q={0}", WatermarkTextBox1.Text)
      Dim myHttpClient As New HttpClient
      Dim myResponse = Await myHttpClient.GetStringAsync(New Uri(addressUri, UriKind.Absolute))
      Dim xmldoc As XElement = XElement.Parse(myResponse)
      myAddressLatitude = xmldoc.Descendants("coordinate").Elements("lat").Value
      myAddressLongitude = xmldoc.Descendants("coordinate").Elements("lng").Value
      myAddressCoodinatePosition = myAddressLatitude & "," & myAddressLongitude
      myMap.Children.Clear()
      DataShow()
    Else
      flag = False
      Exit Sub
    End If
  End Sub

[リセット]ボタンがクリックされた時の処理

メンバー変数flagをFalseで初期化します。
RemoveHandlerステートメントで場所が変更された時に発生するイベントハンドラと、Geolocatorの機能が変更された時に発生イベントハンドラを無効にします。
地図内をクリアし、DataShowプロシージャを実行します。

  Private Sub resetButton_Click(sender As Object, e As RoutedEventArgs) Handles resetButton.Click
    flag = False
    RemoveHandler myGeolocator.PositionChanged, AddressOf myGeolocator_PositionChanged
    RemoveHandler myGeolocator.StatusChanged, AddressOf myGeolocator_StatusChanged
    myMap.Children.Clear()
    DataShow()
  End Sub
End Class

今回はここまでです。また次回の記事でお会いしましょう。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30