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 毫秒。缓存还用于应用程序会话中的重复雷达搜索。这比预期的结果要好,尽管重构需要相当多的投资。
祝所有阅读本文的访客好运。希望这个额外的跟进有帮助。
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 毫秒。缓存还用于应用程序会话中的重复雷达搜索。这比预期的结果要好,尽管重构需要相当多的投资。
祝所有阅读本文的访客好运。希望这个额外的跟进有帮助。