2024/06/06

クラス化に挑戦: #10)Google マップ - Place API の NearBySearch をクラス化 ②

Google マップ の Place API の検索機能のクラス化に挑戦する第2回です。今回は、検索メソッドを NearBySearch クラスに追加します。


検索機能作成の方針

第 8 回 に作成した GetNearestPlace とその関連関数を NearBySearch クラス内に移植します。

この関数は、検索を実行して、一番近い場所を返す関数でした。今回クラス化するにあたり、検索の実行と n 番目に近い場所を返す機能に分離したいと思います。

まずは、検索結果を保持するためのメンバ変数を作成します。

   Private zjnavResults As NotesJSONNavigator   '検索結果
   Private zjaResults As NotesJSONArray   '検索結果(地点情報の配列)


検索メソッドの作成

それでは、検索を実行するメソッドを作成します。GetNearestPlace をベースに検索して結果をメンバ変数に保持するまでがこのメソッドの役割です。

以下がサンプルプログラムです。赤字の部分が修正箇所となります。

   Public Function Search() As Boolean
      Dim sURL As String
      Dim sPram As String
      Dim http As NotesHTTPRequest
      Dim jnav As NotesJSONNavigator
      Dim jeResults As NotesJSONElement

      If zoLocation Is Nothing Then Exit Function
      On Error GoTo Proc_Err


      'URL の準備
      sURL = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
      sPram = zxGetPram()
      sURL = sURL & "?" & sPram

      'API に接続しレスポンスを JSON で取得
      Set http = xns.CreateHttpRequest()
      http.PreferJSONNavigator = True
      Set jnav = http.Get(sURL)

      '検索結果を取得
      Set jeResults = jnav.GetElementByName("results")
      If jeResults.Type = Jsonelem_type_array Then
         '検索結果をメンバ変数に保存
         Set zjnavResults = jnav
         Set zjaResults = jeResults.Value
         Search = True
      End If

Proc_Exit:
      Exit Function

Proc_Err:
      Resume Proc_Exit

   End Function

主な作業内容は2つです。

まず、検索に必要な情報は、前回の作業でクラス内(メンバ変数)に保持されています。保持した値を利用するので、関数に引数で渡す必要がなくなりますので、引数が各所で省略されています。

もう一点がエラー処理です。クラス内のエラーはクラス内で処理する前提で、エラー発生時はメソッドの戻り値を False とし、検索結果数を 0 となるようにしています。


また、このメソッドでは zxGetPram というサブ関数をコールしています。API コール時の URL パラメータを作成する関数で、ベースとなるのは xGetPram 関数です。

クラスへの移植にあたり修正した箇所を赤字としています。

   Private Function zxGetPram() As String
      Dim s As String
      Dim v As Variant

      s = "key=" & GoogleAPIKey

      '座標の指定
      s = s & "&" & "location=" & CStr(zoLocation.Latitude)
      s = s & "," & CStr(zoLocation.Longitude)

      '検索キーワードの指定
      If zsKeyword <> "" Then
         v = Evaluate(|@URLEncode("UTF-8"; "| & zsKeyword & |")|)
         s = s & "&" & "keyword=" & v(0)
      End If

      'プレイスタイプの指定

      If zsType <> "" Then
         v = Evaluate(|@URLEncode("UTF-8"; "| & zsType & |")|)
         s = s & "&" & "types=" & v(0)
      End If


      '固定パラメータの指定

      s = s & "&" & "language=ja"
      s = s & "&" & "rankby=distance"

      zxGetPram = s
   End Function

メンバ変数を使用する修正以外では、プレイスタイプ(zsType)を URL パラメータに付加する機能を追加しています。


検索結果を返すメソッド

最後に、検索結果から地点情報を返すメソッドを作成します。初めに記載したように n 番目に近い情報を取得できるメソッド GetPlace_Nth として作成します。

   Public Function GetPlace_Nth(ByVal viIndex As Integer) As Place
      Dim jePlace As NotesJSONElement

      'エラーチェック
      If zjaResults Is Nothing Then Exit Function
      If viIndex < 1 Then Exit Function
      If zjaResults.Size < viIndex Then Exit Function

      'n 番目の地点情報を取得
      Set jePlace = zjaResults.GetNthElement(viIndex)

      '地点情報からPlaceインスタンスを取得して返す
      Set GetPlace_Nth = New Place(jePlace)
   End Function


また、ヒットした件数を返すプロパティも併せて作成します。

   Public Property Get Count As Integer
      On Error Resume Next
      Count = zjaResults.Size
   End Property

なお、このプロパティでは、メンバ変数 zjaResults が Nothing である可能性があるので、エラーを無視するようにしています。


次回の予定

これで NearBySearch クラスは完成です。次回はこのクラスを組み込んでテストします。


前回 クラス化に挑戦 次回


0 件のコメント:

コメントを投稿