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 件のコメント:
コメントを投稿