Google 放置 radarSearch 以获得最近的 100 个位置

Google Places radarSearch to get closest 100 places

Google Places API 提供了一个 radarSearch method 接受单一类型和区域约束。面积约束可以是 latlng/radius 对或 latlng 边界...

var request = {
    location: latlng,  // where latlng is a google.maps.LatLng
    radius: 2000,      // meters
    type: placeType    // e.g. 'restaurant' or 'gas_station', etc.
}

var request = {
    bounds: latlngbounds,  // google.maps.LatLngBounds
    type: placeType        // e.g. 'restaurant' or 'gas_station', etc.
}

具有上述任一请求的 radarSearch 将 return 最多匹配 200 个位置。如果搜索实际匹配 500 个地点,则响应中仅包含 500 个地点中的 200 个地点。似乎没有明显的方法可以影响 哪些 200 个地方被 return 编辑。初步测试表明它是随机的,但可能偏向于 return 离中心最远的地方。

问题是...我只对 最近的 100 个地点感兴趣。是否有支持的方法对 500 个匹配位置和 return 前 200 个进行排序?我试过使用 'rankBy' 属性,但它似乎被忽略了...

var request = {
    bounds: latlngbounds,  // google.maps.LatLngBounds
    type: placeType        // e.g. 'restaurant' or 'gas_station', etc.
    rankby: google.maps.places.RankBy.DISTANCE,
}

唯一能保证正确回答的方法就是先小范围搜索,然后逐步增加范围重新搜索,直到我得到至少100个地方,但不超过200个地方。然后我可以在 JS 中排序并切片到 100 以获得我的 100 个最接近的位置。是否有性能更高的算法来获得相同的结果?

Google 最近弃用了 'types' 属性,其中可以指定多个匹配类型的数组。目前只支持'type' 属性,只能指定一种搜索类型。我需要支持少数地方类型,现在必须对每个地方类型进行单独搜索并合并。此更改极大地影响了我的应用程序的性能。使用上述方法,少数地点类型需要 1-3 秒,而对每种地点类型进行单独搜索则需要 20-30 多秒,这是令人无法接受的。

是否有更好的方法来获取最接近的 100 个 'bars'、'restaurants' 或 'cafes',例如?通过 Google 的更改,现在需要 10 倍的时间才能得到结果。

感谢任何想法!

在没有进一步指导的情况下,我能够实施以下解决方案...

  • 使用仅包含位置、半径和单一地点类型的雷达搜索请求
  • 针对每个感兴趣的地点类型并行启动雷达搜索
  • 每个radarSearch调整半径并递归调用自己 直到响应计数在 100 和 200 之间
  • 在所有搜索完成后合并响应数组,按距离排序,并切片到 100
  • 每个 radarSearch 的最终半径缓存在 localStorage 中 相同类型的后续搜索

效果还不错。冷启动 5-6 秒,热启动(使用缓存的半径值)300-600 毫秒。缓存还用于应用程序会话中的重复雷达搜索。这比预期的结果要好,尽管重构需要相当多的投资。

祝所有阅读本文的访客好运。希望这个额外的跟进有帮助。