web-dev-qa-db-ja.com

Google Places APIで20を超える結果を取得する

特定の場所の近くの銀行を表示する地図アプリケーションを開発したい。

Placesライブラリを使用して検索すると、毎回20の結果が返されます。さらに結果が必要な場合はどうすればよいですか?

33
Demon

[〜#〜] update [〜#〜]:もともとこの回答を書いていたため、APIが強化され、この回答は古くなっています(または、少なくとも、不完全)。詳細については、 Google Places APIから20以上の結果を取得する方法 を参照してください。

オリジナルの回答

documentation は、Places APIが最大20個の結果を返すことを示しています。その制限を変更する方法があることを示すものではありません。だから、短い答えは次のように思われる:あなたはできない。

もちろん、いくつかの場所でクエリを実行し、結果をマージ/重複排除することで、偽物を並べ替えることができるかもしれません。しかし、それは一種の安価なハックであり、うまく機能しない可能性があります。そして、まず利用規約に違反しないことを確認します。

16
Trott

これで、possibleで20を超える結果(ただし最大60)を取得できるようになり、パラメーター page_token がAPIに追加されました。

以前に実行した検索の次の20の結果を返します。 page_tokenパラメータを設定すると、以前に使用したものと同じパラメータで検索が実行されます。page_token以外のすべてのパラメータは無視されます。

また、 追加の結果にアクセスする セクションを参照して、ページネーションを行う方法の例を確認することもできます。

14
Eduardo

Google APIは、1ページで20の結果をフェッチします。次のページ20の結果を使用する場合、google first pag xmlの結果からnext_page_tokenを使用します。

1) https://maps.googleapis.com/maps/api/place/search/xml?location=Enter latitude,Enter Longitude&radius=10000&types=store&hasNextPage=true&nextPage()=true&sensor=false&key=Enter Google_Map_key

2番目のステップでは、最初のページのnext_Page_tokenデータを使用します

2)https://maps.googleapis.com/maps/api/place/search/xml?location=Enter Latitude,Enter Longitude&radius=10000&types=store&hasNextPage=true&nextPage()=true&sensor=false&key=enter google_map_key &pagetoken="Enter the first page token Value"
7
Rushabh

Eduardoに応えて、Googleはそれを追加しましたが、Placesのドキュメントにも次のように記載されています。

返される結果の最大数は60です。

まだキャップがあります。また、Googleでは次のように「next_page_token」が有効になるまでに遅延があります。

Next_page_tokenが発行されてから有効になるまでには、わずかな遅延があります。

そして、ここに公式のPlaces APIドキュメントがあります:

https://developers.google.com/places/documentation/

4
Mike Cottier

追加の結果を探すコードサンプルを次に示します。

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Web.Script.Serialization;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var url = $"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={args[0]}&radius={args[1]}&type=restaurant&keyword={args[2]}&key={args[3]}";

            dynamic res = null;
            var places = new List<PlacesAPIRestaurants>();
            using (var client = new HttpClient())
            {
                while (res == null || HasProperty(res, "next_page_token"))
                {
                    if (res != null && HasProperty(res, "next_page_token"))
                    {
                        if (url.Contains("pagetoken"))
                            url = url.Split(new string[] { "&pagetoken=" }, StringSplitOptions.None)[0];
                        url += "&pagetoken=" + res["next_page_token"];

                    }
                    var response = client.GetStringAsync(url).Result;
                    JavaScriptSerializer json = new JavaScriptSerializer();
                    res = json.Deserialize<dynamic>(response);
                    if (res["status"] == "OK")
                    {
                        foreach (var place in res["results"])
                        {
                            var name = place["name"];
                            var rating = HasProperty(place,"rating") ? place["rating"] : null;
                            var address = place["vicinity"];
                            places.Add(new PlacesAPIRestaurants
                            {
                                Address = address,
                                Name = name,
                                Rating = rating
                            });
                        }
                    }
                    else if (res["status"] == "OVER_QUERY_LIMIT")
                    {
                        return;
                    }
                }
            }
        }

        public static bool HasProperty(dynamic obj, string name)
        {
            try
            {
                var value = obj[name];
                return true;
            }
            catch (KeyNotFoundException)
            {
                return false;
            }
        }
    }
}

これで時間を節約できることを願っています。

2

もっと入手できるかどうかはわかりません。

Places APIは、最大20の設立結果を返します。

http://code.google.com/apis/maps/documentation/places/#PlaceSearchResponses

0
Jason Gennaro

検索範囲内に存在するすべての銀行が返されない可能性があるという問題がある場合、複数の自動クエリを発行する代わりに検索範囲を制限することをお勧めします。

半径を20(60)を超えるバンクを取得できない値に設定します。次に、ユーザーが手動でより多くのクエリを簡単に(GUIごとに)作成できるようにします-クエリをペイントするようなものです。

より大きな地域で数千の銀行を返品するには、銀行の独自のデータベースに依存する必要があります。これは、体系的に作業を行う場合に実現可能です。

0
mipmap