【问题标题】:How to get 20+ result from Google Places API?如何从 Google Places API 获得 20 多个结果?
【发布时间】:2012-03-25 17:38:44
【问题描述】:

我正在开发一个应用程序,我可以在其中获取用户附近的 ATM 列表。为此,我使用的是 Google Places API,但每次它只返回 20 个结果。我想得到更多的结果。在 API 文档中提到它将返回 20 个结果,但我想知道有什么方法可以获得更多数据,或者我必须为此创建自己的数据库?
我在 API 中还发现它没有印度的所有 ATM。某些位置的信息也不准确。所以请给我一些想法,我应该使用自己的数据库吗?
我知道我可以在 Google Places 中注册地点,但问题是每次它只返回 20 个结果。如果无论如何解决了这个问题,那么使用 Places API 会很棒..

请帮帮我.....

【问题讨论】:

  • 您想为一次需要 20 多个结果的用户提供什么?如果您提供有关您要实现的目标的更多详细信息,我可能会为您提供更好的解决方案。
  • @ChrisGreen,我想向我的用户提供附近的 ATM,但它不是只有 20 个最近的。我已经看到 Google 提供的 Places 应用程序,当您到达 ATM 列表的末尾(在我的情况下)时,它会显示更多结果。我希望向用户显示 40-50 个结果。 Google Places API 提供的数据对于印度来说并不准确,因为我发现我所在地区附近的许多 ATM 和银行在列表中不可用。我在那做了一些研发,发现我可以向 Places API 添加地点,或者我也可以使用我自己的数据库。你建议我应该使用什么?我很困惑..
  • Places 应用程序不使用 Places API,因此它不限于 20 个结果。尝试下面描述的解决方法来帮助找到更多的 ATM。如果您仍然没有任何运气,可能是因为 Google 没有该区域的数据。您可以执行地方报告请求来添加您自己的数据,或者您可以上传批量数据:google.com/local/add/g?gl=US&hl=en-US#uploadfeed 与其向您的用户显示所有 ATM 的大型列表,为什么不向他们提供选择的银行以搜索 ATM。在您的地点搜索请求中使用银行名称作为 keyword
  • @ChrisGreen,非常感谢您提供此链接和您的建议。但我想知道的另一件事是,如果我上传数据,那么它只能通过 Places API 获得,对吧?我希望添加更多服务,例如食品、餐厅、咖啡馆等等。所以在某些服务中,我希望显示超过 20 多个结果。

标签: android google-places-api google-places


【解决方案1】:
【解决方案2】:

根据文档:

https://developers.google.com/places/web-service/search#PlaceSearchResponses

编辑: Place API 现在支持对多达 60 个结果进行分页。详情见下文。

Places API 每次查询最多返回 20 个场所;但是,每次搜索最多可以返回 60 个结果,分成三个页面。如果您的搜索将返回超过 20 个,则搜索响应将包含一个附加参数 — next_page_token。将 next_page_token 的值传递给新地点搜索的 page_token 参数,以查看下一组 20 个结果。

还有严格的服务条款规定您不能预取、缓存或存储内容,除非它是您被允许存储的内容标识符或密钥,即来自地点搜索的参考令牌:

https://cloud.google.com/maps-platform/terms/?_ga=#3-license

关于在印度找不到 ATM 机。所有地点都归类为 establishment 类型,直到 Google 有足够的关于地点的元数据将其分类为更具体的地点类型,如 ATMcafebar 等。可能会找到更多结果的解决方法是在您的请求中使用keyword 参数,并将“ATM”、“银行”或“金融”等内容作为值。 根据文档:

https://developers.google.com/places/web-service/search#PlaceSearchRequests

keyword 参数与所有可用字段匹配,包括但不限于姓名、类型和地址,以及客户评论和其他第三方内容。

【讨论】:

  • 访问下一个 20 结果的参数应该是“pagetoken”,值为 next_page_token。
  • 这是否适用于付费用户?
  • @Chris 你能告诉我如何获取 60 多个位置吗,是否可以在付费 api 中使用?
【解决方案3】:

您可以从下一页令牌中获得更多结果:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=[your search key word]&location=latitude,longitude&radius=value&key=[your API key]&next_page_token=next_page_token value

【讨论】:

  • 它是 pagetoken= 而不是 next_page_token=
【解决方案4】:

Google API 在一个页面中获取 20 结果 假设您想使用下一页 20 结果,那么我们使用来自 google 的 next_page_token结果是第一页 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"

【讨论】:

  • 这很棒。但是如果我使用的是android api怎么办?它是否提供下一页选项?我找不到它。
  • @ Malik Saad Bin Tariq 是的,您也可以在 android google map api 中以这种方式找到它
  • 我们可以一次得到所有 60 条记录吗?
  • 您可以通过 3 个 API 调用获得 60 个结果,而不是一个。
【解决方案5】:

请使用以下参数尝试以下网址

网址 = "http://www.google.com/maps?q=restaurant&ie=UTF8&hl=en&sll=0.000000,0.000000&sspn=0.000000,0.000000&vps=3&sa=N&start=20"

其中 start = No of results 例如从 0 或 10 0r 20 开始 -

【讨论】:

    【解决方案6】:

    在 Google 地方页面上:https://developers.google.com/places/documentation/search 在“雷达搜索请求”下,它声明使用:https://maps.googleapis.com/maps/api/place/radarsearch/output?parameters 使用此调用可以获得 200 个结果,但请注意,每个调用使用 5 个请求来限制您的配额。

    【讨论】:

      【解决方案7】:

      您可以使用 Google API JAVA 客户端执行此操作 - 这是一个使用 java 客户端获取所有 60 个结果的示例。

      public PlacesList search(double latitude, double longitude, double radius, String types)
                  throws Exception {
      
              try {
      
                  HttpRequestFactory httpRequestFactory = createRequestFactory(HTTP_TRANSPORT);
                  HttpRequest request = httpRequestFactory
                          .buildGetRequest(new GenericUrl("https://maps.googleapis.com/maps/api/place/search/json?"));
                  request.getUrl().put("key", YOUR_API_KEY);
                  request.getUrl().put("location", latitude + "," + longitude);
                  request.getUrl().put("radius", radius); 
                  request.getUrl().put("sensor", "false");
                  request.getUrl().put("types", types);
      
                  PlacesList list = request.execute().parseAs(PlacesList.class);
      
                  if(list.next_page_token!=null || list.next_page_token!=""){
                               Thread.sleep(4000);
                               /*Since the token can be used after a short time it has been  generated*/
                      request.getUrl().put("pagetoken",list.next_page_token);
                      PlacesList temp = request.execute().parseAs(PlacesList.class);
                      list.results.addAll(temp.results);
      
                      if(temp.next_page_token!=null||temp.next_page_token!=""){
                          Thread.sleep(4000);
                          request.getUrl().put("pagetoken",temp.next_page_token);
                          PlacesList tempList =  request.execute().parseAs(PlacesList.class);
                          list.results.addAll(tempList.results);
                    }
      
                  }
                  return list;
      
              } catch (HttpResponseException e) {
                  return null;
              }
      
          }
      

      【讨论】:

      • PlaceList 类在哪里?
      • 谢谢 - 你解决了我的问题。下一页无法立即使用!我看到了你的“Thread.sleep(4000);”并意识到为什么 pagetoken 有时只能在我的代码中工作 - 通常代码在请求下一页时太快了。当然,当我通过逐步调试它时,它总是有效的。
      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2017-12-19
      • 2023-02-03
      相关资源
      最近更新 更多