当我的系统正在处理的地址只有一个匹配时,Google API地理编码服务对我很有用。如果有两个或两个以上的匹配,我想向用户提供找到的地址(可能是" formatted_address"),让他们选择他们想要的地址。
然而,Google会返回许多字段"类型"。因此,我想知道如何通过连接适当的" address_components"来构建不同类型数据的地址(字段)。我有兴趣将地址拆分为单独的字段(街道地址,城镇/城市,国家和邮政编码),以将其存储在数据库中。是否有一个页面说明了要使用的类型和顺序?
例如,我正在考虑使用" street_number"," route"和"地点"对于街道地址部分,这将适用于典型的地址,但我知道它不会一直工作。所以我正在寻找一个强大的,但不一定是详尽的解决方案。
答案 0 :(得分:1)
从api文档中:formatted_address
下
不要以编程方式解析格式化的地址。取而代之的是,您应该使用单独的地址组件,API响应除了已格式化的地址字段外,还应包括这些组件。
Link to quoted docs.
请从getDetails响应的address_components
部分中解析您的地址元素。在同一位置找到该文档。
-如果感觉正确,请投票并标记为正确。--
答案 1 :(得分:0)
地理编码器返回的每个GeocoderResult都有一个formatted_address
字段。使用它。
答案 2 :(得分:0)
这是一个来自php函数内部的代码段,该函数使用for / next循环提取地址组件。可以针对您感兴趣的内容进行扩展。
$parsed_json = json_decode($json_string, true);
//
foreach($parsed_json['results'] [0] ['address_components'] as $a){
if($a ['types'] [0] == 'postal_code') $zipcode = $a ['long_name'];
if($a ['types'] [0] == 'locality') $city = $a ['long_name'];
if($a ['types'] [0] == 'administrative_area_level_1') $state = $a ['short_name'];
}
答案 3 :(得分:0)
我遇到了Google地理编码响应对象,没有简单的方法来处理它。但是关于PHP解决方案,我创建了一个自定义控制器,该控制器适用于Laravel,但可以轻松适应任何其他PHP应用程序。
您可以在此处找到完整的要旨:https://gist.github.com/Gkiokan/510a04aadaeed911958cb17b6e62a38f
现在为您提供有关如何从Google Geocoding Response Object中整理数据的答案。您需要遍历address_components
数组,并将Needen值保存到新的Object或Array中。您可以在第43行的方法getAddress
中找到用于过滤数据的相应方法。 here
单独的解决方案如下:
// some php file
public function getAddress($response=[]){
// get the address_components Array here
$ac = $response['results'][0]['address_components'];
// predefine the final $address Array
$address = [
'address' => '',
'city' => '',
'postal_code' => '',
'country' => '',
'formatted' => $response['results'][0]['formatted_address'],
];
// Loop though the address_components and set matching values
foreach($ac as $item):
$name = $item['long_name'];
$type = $item['types'][0];
switch ($type):
case 'route':
$address['address'] = $name;
break;
case 'locality':
$address['city'] = $name;
break;
case 'postal_code':
$address['postal_code'] = $name;
break;
case 'country':
$address['country'] = $name;
break;
endswitch;
endforeach;
return $address;
}