【问题标题】:Google Place Search does not return result谷歌地方搜索不返回结果
【发布时间】:2019-01-30 16:58:00
【问题描述】:

我需要根据给定的文本获取位置数据。 例如,如果我在谷歌地图中搜索Aldi,它会向我显示大量带有分页的数据。我需要使用 google places api 获得该结果。

我尝试了两次 API 调用。但它返回我以下结果

https://maps.googleapis.com/maps/api/place/textsearch/json?query=Aldi&key=MY_KEY

结果

{
   "html_attributions" : [],
   "results" : [],
   "status" : "ZERO_RESULTS"
}

https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=ALDI&inputtype=textquery&fields=place_id,name,formatted_address,geometry&key=MY_KEY

结果

{
   "candidates" : [],
   "status" : "ZERO_RESULTS"
}

我需要根据给定的名称获取数据。谁能找出原因。

【问题讨论】:

    标签: google-maps google-places-api google-places


    【解决方案1】:

    Places API 提供三种类型的搜索:Find PlaceNearby SearchText Search。每个都允许您指定具有半径的位置以开始搜索。该位置被指定为纬度/经度对。您收到 ZERO_RESULTS 是因为您没有为请求指定位置。如果未指定 location 参数,则根据文档,“API 默认使用 IP 地址偏置”。因此,您的 IP 地址所在位置范围内没有 Aldi 商店。

    Find Place 只会返回一个结果,但根据我的经验,它有时会返回两个。 附近搜索文本搜索都将返回最多 60 个地点结果。所有三个地方搜索请求都允许在您的位置周围指定最多 50 公里的半径。如果您需要在全球范围内寻找 Aldi 门店,您需要提出很多要求。

    我花了数周时间进行一个类似的项目,以查找美国连锁餐厅列表的所有位置。我发现附近搜索对于我的用例来说是一个更好的选择,并且在提交项目的文本搜索之前应该始终考虑。我用附近搜索和文本搜索测试了 Aldi 搜索,发现它们提供了相同的 place_id 结果集。此附近搜索请求将查找纽约市 50 公里内的所有 Aldi 位置:

    https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.785276%2C-73.9651827&name=Aldi&radius=50000&key=MY_API_KEY
    

    这里与文本搜索相同:

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=Aldi&location=40.785276%2C-73.9651827&radius=50000&key=MY_API_KEY
    

    那么我们为什么要关心呢?根据 API 文档进行文本搜索“...返回所选地点的所有可用数据字段,您将被收取相应的费用。”此外,“......文本搜索服务会受到 10 倍乘数的影响。也就是说,您发出的每个文本搜索请求都将计为 10 个请求,而不是您的配额。”附近搜索请求的成本较低,并且不受 10 倍乘数的影响。它返回您可能认为足够的可用数据字段的子集。如果您需要额外的数据字段,您只能从 Places Detail 请求中获取您需要的内容。在选择文本搜索之前为您的应用程序进行数学计算。如果需要,使用“附近搜索”后跟“地点详细信息”请求可能会大大降低成本。在任何情况下,您都不想因为 10 倍乘数或计费交易成本超出您的预期而意外达到配额限制时感到震惊!

    我发现了一些其他障碍,对于试图在大范围内为企业寻找所有地点的项目来说,这些障碍应该是考虑因素:

    1. Places API 将首选您的半径范围内的地点,但如果确定它们相关且在 60 个地点限制内,则将包括您的半径范围之外的地点。从我请求的搜索位置返回超过 450 公里的地方。
    2. 将返回名称不是您搜索的名称的地点的结果。在我搜索西雅图的 Benihana 餐厅时,附近的搜索请求只返回一家名为 Hamansu 的餐厅。经调查,这是因为西雅图没有 Benihana,然而,Hamansu 与 Benihana 相似之处在于它提供日本料理烧烤桌边。 API 文档指出,您的搜索词将“与 Google 为该地点编制索引的所有内容匹配,包括但不限于名称、类型和地址,以及客户评论和其他第三方内容。”
    3. 一次返回 20 个结果。如果有更多结果,则提供 page_token 以请求获取最多 20 个结果的下一页。每个请求都是收费的。您需要为获得 60 个结果所需的 3 个请求付费。我并不是说这很糟糕,只是要注意使用此 API 所产生的费用和配额使用情况。
    4. 如果您的半径范围内的结果超过 60 个,那么您还没有在其中找到所有可能的位置。而且,您无法确定 60 个结果所覆盖的有效半径是多少。您需要使用足够小的半径进行搜索,以便为每个请求返回

    【讨论】:

    • 客户要求是找到与给定国家相关的所有地点。这就是为什么我不得不选择文本搜索。为此,我必须获取该国所有城市并根据城市搜索的搜索结果进行搜索。感谢您的详细解释。希望对某人有所帮助。
    • 您是如何建立要搜索的城市列表的?我的问题是我在美国有相同的项目,那里有大约 1,000 个“可能”位置的城市。另外,对于返回超过 60 个结果的搜索,我仍然没有可行的解决方案。如果我减小半径并对每个城市进行多次搜索,配额限制和成本就会成为问题。任何想法都将不胜感激。
    • 从 google api 中首先找到的城市。然后在基于城市搜索的迭代文本搜索之后,基于单次搜索可以获得600多个闪现。结果数量可能会因搜索国家/地区而异。如果您需要更多信息,我可以帮助您。将邮件发送至 e06widu@gmail.com。
    【解决方案2】:

    您应该知道,Places API 搜索并非旨在提供全球范围内的结果。在您的示例中,您仅指定文本值“Aldi”。但是,为了获得结果,您还应该指定搜索的位置。

    例如,如果我想将结果偏向西班牙的巴塞罗那地区,我必须在我的请求中添加位置和半径

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=Aldi&location=41.3850639%2C2.1734035&radius=10000&key=MY_API_KEY

    此请求将返回巴塞罗那地区的 Aldi 超市,如我的屏幕截图所示

    查找地点也是一样,你应该指定位置偏差

    https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=Aldi&inputtype=textquery&fields=formatted_address,geometry,name,place_id&locationbias=circle%3A1000%4041.3850639%2C2.1734035&key=MY_API_KEY

    另请注意,查找地点仅返回一个结果。

    我希望这能解决您的疑问。

    【讨论】:

    • 非常感谢。如何根据搜索键对数据进行分页。根据您的回答,我必须使用textsearch。但我需要来自世界各地的结果。有没有办法做到这一点?
    • Places API 搜索仅适用于指定区域。如果您需要全球范围内的结果,您应该对不同区域进行多次请求,还要注意 Places API 最多可以为一个区域返回 60 个结果,因此不能保证您获得所有可能的结果。此 API 仅根据 Google 标准返回突出的项目。
    • @xomena,您能告诉我如何像您在示例中那样指定位置和半径字段吗?
    【解决方案3】:

    @Art 答案,标有较高的赞成票,只是部分正确。答案表明 Find Place api(例如 maps/api/place/findplacefromtext)通常会返回 1 个结果,最多 2 个。我倾向于同意他的观点。即使您的搜索命中多个目标,Find Place api 也只会返回一个。因此,他建议使用“附近搜索”或“文本搜索”,这两种方法最多会产生 60 个结果。

    但是,这两个搜索需要某种形式的位置参数,否则它们可能会返回 0 个结果,默认使用您的 IP 地址,正如他所指出的那样。但他建议使用带有半径参数的位置。这个问题是半径参数有一个最大限制。因此,如果您在整个国家/地区(例如美国)进行搜索,它不会针对您想要的所有类型的内容。

    事实是您不需要使用位置和半径。还有另一个选项称为区域。并且您可以使用区域来搜索一个国家的整个距离。

    @Art 的建议:

    https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=25.7392%2C-80.3103&name=Law%Offices%of%Alex&radius=50000&key=KEY

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=Law%Offices%of%Alex&location=25.7392%2C-80.3103&radius=50000&key=KEY

    一个更全面的替代方案:

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=Law%Offices%of%Alex&region=us&key=KEY

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2015-06-05
    • 2019-09-03
    相关资源
    最近更新 更多