谷歌地方雷达搜索最近的100个地方

时间:2017-03-02 16:35:36

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

Google Places API提供radarSearch method,可接受单一类型和区域约束。区域约束可以是latlng / radius对或latlng bounds ...

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将返回最多200个匹配位置。如果搜索实际匹配500个位置,则响应中仅包含500个位置中的200个位置。似乎没有明显的方法来影响返回200个位置。初步测试显示它是随机的,但可能偏向于返回离中心最远的地方。

问题是......我只对最近的 100个地方感兴趣。有没有一种支持的方法来排序500个匹配的地方并返回前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'酒吧','餐馆'或'咖啡馆'?随着Google的改变,现在需要花费10倍的时间来获得结果。

欣赏任何想法!

1 个答案:

答案 0 :(得分:0)

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

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

结果非常好。冷启动5-6秒,暖启动(使用缓存半径值)300-600ms。缓存还用于应用程序会话中的重复雷达搜索。这是一个比预期更好的结果,虽然是重构的投资。

祝所有阅读此内容的访客好运。希望这个额外的后续工作是有帮助的。