Google Places API getDetails()未返回地点评分字段问题排查
Google Places API 无评分字段返回问题排查
你遇到的问题由3个核心原因导致,对应修复方案如下:
- 匹配到的place实体类型错误
从你贴的接口返回结果可以看到,当前拿到的place_id对应实体的types值为["route"],属于道路类地理要素,并非时代广场景点/商圈这类POI实体。道路、行政区划、社区这类纯地理属性的实体,本身就不存在用户评分、商户联系电话这类经营类字段,自然不会返回相关内容。 - 评分字段名书写错误
Google Places API返回的平均评分字段为单数形式rating,你代码中写的place.ratings是不存在的复数字段名,即使接口正常返回评分,该写法也只能取到undefined。另外用户评论列表对应的字段是reviews,注意不要混淆命名。 - getDetails请求未指定返回字段列表
新版Places API的getDetails方法如果不在请求参数中显式声明fields字段列表,默认仅返回地址、坐标、place_id这类基础地理信息,不会主动返回评分、联系电话、评论这类扩展字段,必须明确声明需要的字段才会返回对应内容。
修复方案
- 源头过滤无效实体类型
在初始化Google Places Autocomplete控件时,添加types: ['establishment']配置,限制用户仅可选择商户、景点、公共服务类带经营属性的POI,避免选中道路、行政区这类无评分无电话的地理实体。如果是用Text Search接口搜索,也可以在请求参数中添加types=establishment做结果过滤。 - 修正getDetails请求配置,补全fields声明,修正字段名
参考如下修改你的请求代码:
var deetsreq = { placeId: res[0].place_id, // 按需填写你需要拉取的字段即可 fields: ["name", "address_components", "formatted_phone_number", "rating"] }; var service = new google.maps.places.PlacesService(map); service.getDetails(deetsreq, callback); function callback(place, status) { if (status == google.maps.places.PlacesServiceStatus.OK) { console.log(place); document.getElementById("table-title").innerHTML = res[0].name var table = document.getElementById("deets-entries"); var r = table.insertRow(); r.insertCell().innerHTML = place.address_components[1].short_name + ' ' + place.address_components[2].short_name; // 修正字段名为rating,做空值兜底 r.insertCell().innerHTML= place.rating ?? "暂无评分"; if(place.formatted_phone_number==null){ r.insertCell().innerHTML= "NA"; } else{ r.insertCell().innerHTML= place.formatted_phone_number; } } }
注意:如果某POI确实没有足够的用户评分,接口也不会返回
rating字段,代码里一定要做空值兜底,避免页面显示异常。
内容的提问来源于stack exchange,提问作者R S
相关产品推荐
相关产品推荐

