如何让Google Maps Geocode返回场所名称?现有代码问题咨询
问题分析与解决方案
首先咱们得明确:Google地理编码API的核心定位是把文本地址解析为地理坐标,重点在地址的标准化匹配,而非专门返回商家/POI的名称信息。这就是为什么你搜索带商家名的地址时,返回的formatted_address只保留了标准化的街道/区域信息,自动去掉了商家名称。
一、能不能从当前地理编码API请求中获取商家名?
有一定概率可以,你可以检查地理编码API的返回响应里的隐藏字段:
在$resp['results']的每个结果对象中,看看是否存在以下内容:
- 有没有
name字段:如果搜索的商家被Google标记为POI,地理编码API可能会返回这个字段,值就是商家名称。 - 检查
address_components的types是否包含establishment或point_of_interest:如果有,对应的long_name/short_name就是商家名。
你可以给代码加一段提取逻辑试试:
foreach($resp['results'] as $res){ $loc = array( "zipcode"=>null, "formatted"=>null, "business_name" => null // 新增商家名字段 ); // 优先提取name字段 if(isset($res['name'])){ $loc['business_name'] = $res['name']; } else { // 从地址组件里找商家类型条目 foreach($res['address_components'] as $comp){ if(in_array("establishment", $comp['types']) || in_array("point_of_interest", $comp['types'])){ $loc['business_name'] = $comp['long_name']; break; } // 原有邮编提取逻辑 if(in_array("postal_code", $comp['types'])) $loc['zipcode'] = $comp['short_name']; } } // 原有字段赋值 $loc['formatted'] = $res['formatted_address']; $loc['lng'] = $res['geometry']['location']['lng']; $loc['lat'] = $res['geometry']['location']['lat']; $return[] = $loc; }
不过要注意:这种方法不是100%可靠,如果Google没把该商家标记为POI,就不会返回相关字段。
二、如果地理编码API不行,该用什么API?
要稳定获取商家名称,建议改用Google Places API的Text Search接口。这个API专门用于搜索商家、POI,输入带商家名的地址时,会优先返回对应的Place信息,包含完整的商家名称、标准化地址、坐标等。
示例请求URL(替换成你的API Key):
https://maps.googleapis.com/maps/api/place/textsearch/json?key=YOUR_API_KEY&query=ZOOM DIGITAL PRINT UNIT 36 BINLEY IND EST HOTCHKISS WAY COVENTRY CV3 2RL
返回结果里,results数组的每个对象都会有name(商家名)、formatted_address、geometry.location(坐标),完全满足你的需求。你可以修改原有代码,直接替换为Places API的请求逻辑,或者先尝试Places请求,无结果时再 fallback 到地理编码API。
小提醒
你的代码最后返回的是原始API响应$resp,而非你组装好的$return数组,这可能是个小bug,记得修正哦~
内容的提问来源于stack exchange,提问作者pee2pee
相关产品推荐
相关产品推荐

