GPSや写真を応用したアプリ作りのためのサンプルプログラム集 3

アイコンの作成

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

「OK」ボタンがクリックされた時の処理

メンバ変数flagをTrueで初期化します。RemoveHandlerステートメントで場所が変更された時に発生するイベントハンドラと、Geolocatorの機能が変更された時に発生イベントハンドラを無効にします。

住所から経度、緯度を取得するGeocoding APIを使用します。GeoCoding APIに関しては、下記のURLを参照してください。
→ Geocoding API

引数qに住所を指定します。この場合は、WatermarkTextBoxに入力された値を指定しています。

String.Format("http://www.geocoding.jp/api/?v=1.1&q={0}", WatermarkTextBox.Text)を変数addressUriに格納しておきます。

新しいHttpClientのインスタンスmyHttpClientオブジェクトを作成します。
GetStringAsyncメソッドでaddressUriの応答本体を文字列として受け取り、変数myResponseに格納します。
文字列として返された結果をResultプロパティで取得し、変数myContentに格納します。

XElement.Parseメソッドで結果XMLを格納しているmyContentを文字列として読み込みます。

メンバ変数myAddressLatitudeに要素の子要素の値(緯度)を格納します。

メンバ変数myAddressLongitudeに要素の子要素の値(経度)を格納します。

メンバ変数myAddressCoodinatePositionにmyAddressLatitude(緯度)とmyAddressLongitude(経度)をカンマで区切って格納しておきます。この値は前述の網掛け(B)で使用しています。

地図内を一度クリアして、DataShowプロシージャを実行します。

  Private Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click
    If WatermarkTextBox.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}", WatermarkTextBox.Text)
      Dim myHttpClient As New HttpClient
      Dim myResponse = myHttpClient.GetStringAsync(New Uri(addressUri, UriKind.Absolute))
      Dim myContent = myResponse.Result
      Dim xmldoc As XElement = XElement.Parse(myContent)
      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

アイコンの作成

ソリューションエクスプローラーのAssetsフォルダ内には、4つのpngファイルが入っています(表1)。

表1:Assetsフォルダ内に入っているpngファイルの種類

ファイル名 サイズ
Logo.png 150×150
SmallLogo.png 30×30
SplashScreen.png 620×300
StoreLogo.png 50×50

表1の画像はデフォルトでは、□に×の画像になっています。ストアの審査では、このままの画像では審査に受かりませんので、4種類のアイコンを作る必要があります。このサンプルは実際にストアで審査の通ったアプリですので、Assetsフォルダ内には筆者の作成したアイコンが収められています。見てみてください。SplashScreen.pngはアプリを起動した際に、一瞬最初に表示される画像です。スタート画面にピン止めされる画像はデフォルトでは150×150のLogo.pngが使用されます。これを長方形の画像にしたい場合は、310×150サイズのpng画像を作成し、WideLogo.png(任意の名前でOK)としてAssetsフォルダに追加しておきます。

詳細については、「自分の現在位置を取得して表示するサンプルプログラム」を参照してください。

今回はここまでです。ありがとうございました。

筆者からのお知らせ

筆者はWindowsストアでアプリを公開しています。チャームの検索からWindowsストアを選択して、検索欄に、kuniyasuまたはYakushijiKuniyasuと入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。

この記事をシェアしてください

人気記事トップ10

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