Google Places API rankby=distance参数异常:结果缺失且排序错误
Hey,我来帮你拆解下遇到的这两个问题,刚好对Google Places API的nearbySearch逻辑比较熟~
首先得说你的keyword参数写法有问题!Google Places API的nearbySearch不支持你写的(xxx)OR(xxx)这种布尔逻辑格式,这种写法会被当成一整个完整的关键词去匹配,自然找不到对应的酒店。另外,你把酒店名称连写了(比如courtyardbymarriot),但官方名称是带空格的Courtyard by Marriott,这种连写的匹配度会很低,也是搜不到的原因之一。
给你两个解决思路:
思路一:用Text Search替代nearbySearch
Text Search的query参数支持更灵活的多关键词匹配,你可以直接用OR(注意前后加空格)分隔所有酒店名称,再结合type=lodging缩小范围,同时指定radius来限定搜索区域。比如修正后的请求大概是这样:https://maps.googleapis.com/maps/api/place/textsearch/json?location=41.711586,44.748187&radius=5000&type=lodging&query=tbilisimarriot OR courtyard by marriott OR ambassadori OR mercure OR ibis hotel OR holiday inn OR city avenue OR hotel city这里把连写的名称改成了更贴近官方的写法,匹配成功率会高很多。
思路二:调整nearbySearch的keyword参数
如果坚持用nearbySearch,就把所有关键词用空格分隔(API会匹配包含任意一个关键词的场所),同时加上type=lodging过滤无关结果。比如:https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=41.711586,44.748187&rankby=distance&type=lodging&keyword=tbilisimarriot "courtyard by marriott" ambassadori mercure "ibis hotel" "holiday inn" "city avenue" "hotel city"这里用双引号把带空格的名称括起来,能实现精准匹配。
你用了rankby=distance但排序失效,大概率是踩了API的参数互斥坑:当使用rankby=distance时,绝对不能加radius参数!这两个参数是互斥的,如果同时存在,API会忽略rankby=distance,默认用「知名度」排序,自然就不是按距离来了。
解决方法很简单:
- 检查你的请求URL,删掉
radius参数; - 确认
rankby=distance拼写正确(别写成rank_by或者其他错误格式); - 另外,
rankby=distance要求必须指定keyword、name或type中的至少一个,你已经加了keyword,这部分没问题。
最后再提两个小细节:
- 确保你的API密钥已经启用了Places API,并且设置了正确的 billing(免费额度用完或者没开billing的话,结果会被限制);
- 如果某家酒店在Google Maps上都搜不到,那API肯定也返回不了,先去地图上确认下该酒店是否被收录。
内容的提问来源于stack exchange,提问作者Shako Tskhadadze




