0

Google Places API提供了一个radarSearch method,它接受单一类型和面积约束。面积约束可以是经纬度/半径对或经纬度范围...Google Places radarSearch获取最接近的100个地方

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倍的时间才能获得结果。

欣赏任何想法!

回答

0

在缺乏进一步的指导,我是能够实现以下解决方案......

  • 使用radarSearch请求包括唯一的位置,半径和单放型
  • 启动radarSearches并行的每个地方型的兴趣
  • 每个radarSearch调整半径,直到响应数是100和200
  • 之间的合并响应阵列时,所有搜索完成递归调用自己 ,排序上至100
  • 每个radarSearch的最终半径的localStorage被缓存 后续搜索在相同类型的距离,和切片

的结果是相当不错的。冷启动5-6秒,热启动(使用缓存的半径值)300-600ms。 Cache也用于应用程序会话中的重复radarSearches。这比预期的结果好,尽管这是一个重构投资。

祝所有参观者都读好消息。希望这个额外的跟进是有帮助的。