Получение более 20 результатов с помощью Google Places API

Я хочу разработать приложение Карты, которое будет отображать банки рядом с заданным местом.

Я использую библиотеку мест для поиска и каждый раз, когда он просто возвращает 20 результатов. Что мне делать, если я хочу больше результатов?

7 ответов


обновление: поскольку я изначально написал этот ответ, API был улучшен, сделав этот ответ устаревшим (или, по крайней мере, неполным). См.как получить 20 + результат от Google Places API? для получения дополнительной информации.

ОРИГИНАЛЬНЫЙ ОТВЕТ:

на документация говорит, что API Places возвращает до 20 результатов. Это не означает, что существует какой-либо способ изменить этот предел. Итак, короткий ответ, кажется: Ты не можешь.

конечно, вы можете подделать его, выполнив запросы для нескольких местоположений, а затем слияние/де-дублирование результатов. Это своего рода дешевый Хак, хотя, и может не работать очень хорошо. И я бы сначала проверил, чтобы убедиться, что это не нарушает условия обслуживания.


теперь возможно чтобы иметь более 20 результатов (но до 60), параметр page_token был добавлен в API.

возвращает следующие 20 результатов из ранее выполненного поиска. Установка параметра page_token выполнит поиск с теми же параметрами, которые использовались ранее - все параметры, отличные от page_token, будут проигнорированы.

также вы можете обратиться к доступ к дополнительным результатам для см. пример того, как выполнить разбиение на страницы.


Google api получить результат 20 на одной странице предположим, вы хотите использовать следующий результат страницы 20, то мы используем next_page_token из google первый результат pag xml .

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

на втором шаге вы используете данные 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"

в ответ на Эдуардо Google добавил, что теперь, но в документации мест также говорится:

максимальное число результатов, которые могут быть возвращены в 60.

таким образом, у него все еще есть крышка. кроме того, FYI, есть задержка, когда "next_page_token" станет действительным, поскольку Google заявляет:

существует небольшая задержка между тем, когда выдается next_page_token, и когда он станет действительным.

и вот официальные места API docs:

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


вот пример кода, который будет искать дополнительные результаты

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;
            }
        }
    }
}

надеюсь, это сэкономит вам время.


Не уверен, что вы можете сделать больше.

API Places возвращает до 20 результатов установки.

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


Если проблема в том, что не все банки, существующие внутри радиуса поиска, могут не быть возвращены, я бы предложил ограничить радиус поиска вместо выдачи нескольких автоматических запросов.

установите радиус на некоторое значение, в котором невозможно получить более 20 (60) банков. Затем сделайте его легким (GUI-wise) для пользователя, чтобы выбить больше запросов вручную - вроде рисования запроса.

возвращение тысяч банков в более крупном регионе, вероятно, потребует от вас полагаться на собственную базу данных банков - что может быть достижимо, если вы работаете на нем систематически.