构建地址字段来自" address_components"在Google Maps API中?

时间:2017-03-20 00:09:05

标签: google-maps

当我的系统正在处理的地址只有一个匹配时,Google API地理编码服务对我很有用。如果有两个或两个以上的匹配,我想向用户提供找到的地址(可能是" formatted_address"),让他们选择他们想要的地址。

然而,Google会返回许多字段"类型"。因此,我想知道如何通过连接适当的" address_components"来构建不同类型数据的地址(字段)。我有兴趣将地址拆分为单独的字段(街道地址,城镇/城市,国家和邮政编码),以将其存储在数据库中。是否有一个页面说明了要使用的类型和顺序?

例如,我正在考虑使用" street_number"," route"和"地点"对于街道地址部分,这将适用于典型的地址,但我知道它不会一直工作。所以我正在寻找一个强大的,但不一定是详尽的解决方案。

4 个答案:

答案 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;
    }