web-dev-qa-db-fra.com

Obtention de plus de 20 résultats avec l'API Google Adresses

Je souhaite développer une application cartographique qui affichera les berges à proximité d'un lieu donné.

J'utilise la bibliothèque Places pour rechercher et à chaque fois elle ne renvoie que 20 résultats. Que dois-je faire si je veux plus de résultats?

33
Demon

[~ # ~] mise à jour [~ # ~] : depuis que j'ai écrit cette réponse à l'origine, l'API a été améliorée, rendant cette réponse obsolète (ou , au moins incomplète). Voir Comment obtenir plus de 20 résultats à partir de l'API Google Adresses? pour plus d'informations.

RÉPONSE ORIGINALE :

documentation indique que l'API Places renvoie jusqu'à 20 résultats. Cela n'indique pas qu'il existe un moyen de modifier cette limite. Donc, la réponse courte semble être: vous ne pouvez pas.

Bien sûr, vous pourriez être en mesure de le truquer en faisant des requêtes pour plusieurs emplacements, puis en fusionnant/dédoublonnant les résultats. C'est une sorte de hack bon marché, et pourrait ne pas fonctionner très bien. Et je vérifierais d'abord pour vous assurer que cela ne viole pas les conditions d'utilisation.

16
Trott

Maintenant il est possible d'avoir plus de 20 résultats (mais jusqu'à 60), un paramètre page_token a été ajouté à l'API .

Renvoie les 20 résultats suivants d'une recherche précédemment exécutée. La définition d'un paramètre page_token exécutera une recherche avec les mêmes paramètres utilisés précédemment - tous les paramètres autres que page_token seront ignorés.

Vous pouvez également vous référer à la section accès à des résultats supplémentaires pour voir un exemple sur la façon de faire la pagination.

14
Eduardo

L'API de Google récupère le résultat 20 sur une page, supposons que vous souhaitiez utiliser le résultat de la page 20 suivante, puis nous utilisons le résultat next_page_token de google first 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

à la deuxième étape, vous utilisez les données next_Page_token de la première page

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

En réponse à Eduardo, Google l'a ajouté maintenant, mais la documentation Google Adresses indique également:

Le nombre maximal de résultats pouvant être renvoyés est de 60.

il a donc toujours un plafond. également pour info, il y a un délai pour que le "next_page_token" devienne valide, comme Google le déclare:

Il existe un court délai entre l'émission d'un next_page_token et sa validité.

et voici les documents officiels de l'API Places:

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

4
Mike Cottier

Voici un exemple de code qui recherchera des résultats supplémentaires

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

J'espère que cela vous fera gagner du temps.

2

Je ne suis pas sûr que vous puissiez en obtenir plus.

L'API Places retourne jusqu'à 20 résultats d'établissement.

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

0
Jason Gennaro

Si le problème est que toutes les banques qui existent à l'intérieur du rayon de recherche peuvent ne pas être renvoyées, je suggère de limiter le rayon de recherche au lieu d'émettre plusieurs requêtes automatisées.

Réglez le rayon sur une valeur dans laquelle il est impossible d'obtenir plus de 20 (60) banques. Ensuite, il est facile (au niveau de l'interface graphique) pour l'utilisateur de définir manuellement plus de requêtes - sorte de peindre une requête.

Le retour de milliers de banques dans une plus grande région nécessitera probablement que vous vous appuyiez sur votre propre base de données de banques - ce qui pourrait être réalisable si vous y travaillez systématiquement.

0
mipmap