2014-11-05 36 views
1

我想重新格式化地址。如何使用PHP从Google Geocoding API获取街道名称,电话号码,城市,州名?

所以我想使用Google地理编码API。 这里是一个输出

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "301", 
       "short_name" : "301", 
       "types" : [ "subpremise" ] 
      }, 
      { 
       "long_name" : "880", 
       "short_name" : "880", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "N Street", 
       "short_name" : "N St", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "South Addition", 
       "short_name" : "South Addition", 
       "types" : [ "neighborhood", "political" ] 
      }, 
      { 
       "long_name" : "Anchorage", 
       "short_name" : "Anchorage", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Anchorage", 
       "short_name" : "Anchorage", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Alaska", 
       "short_name" : "AK", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "99501", 
       "short_name" : "99501", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "880 N Street #301, Anchorage, AK 99501, USA", 
     "geometry" : { 
      "location" : { 
       "lat" : 61.21391800000001, 
       "lng" : -149.908357 
      }, 
      "location_type" : "ROOFTOP", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 61.21526698029151, 
        "lng" : -149.9070080197085 
       }, 
       "southwest" : { 
        "lat" : 61.2125690197085, 
        "lng" : -149.9097059802915 
       } 
      } 
     }, 
     "partial_match" : true, 
     "types" : [ "subpremise" ] 
     } 
    ], 
    "status" : "OK" 
} 

我如何获得门牌号,街道地址,套房#(如果有的话),城市,州,邮编。

令我困惑的部分是address_component具有不同的组件。我怎么能说出每个人的立场?

我想我可以做这样的事情让我需要什么

<?php 
$obj = json_decode($json, true); 

$c = $obj['results'][0]['address_components']; 
echo '</pre>'; 
echo 'BUILDING NAME: ' . $c[1]['long_name'] . "<br>\n"; 
echo 'BUILDING NUMBER: ' . $c[2]['long_name'] . "<br>\n"; 
echo 'STREET NAME: ' . $c[3]['long_name'] . "<br>\n"; 
echo 'CITY: ' . $c[5]['long_name'] . "<br>\n"; 
echo 'COUNTY: ' . $c[6]['long_name'] . "<br>\n"; 
echo 'STATE: ' . $c[7]['short_name'] . "<br>\n"; 
echo 'COUNTRY: ' . $c[8]['short_name'] . "<br>\n"; 
echo 'POSTAL CODE: ' . $c[9]['short_name'] . "<br>\n"; 
?> 

但是这不会对所有地址工作。使用上面的地址是我的输出。因为你可以告诉标签不符合数据。

BUILDING NAME: 880 
BUILDING NUMBER: N Street 
STREET NAME: South Addition 
CITY: Anchorage 
COUNTY: Alaska 
STATE: US 
COUNTRY: 99501 

我怎样才能得到理想的结果,每次都是正确的? 我的假设,我会不知何故必须检查类型值,但我不知道如何以及我需要看什么规则。

+0

这就是 “类型” 指数是什么。 – 2014-11-05 18:44:36

+0

什么是“类型”索引拘留?在某些情况下,我看到了administrative_area_level_2,administrative_area_level_1,administrative_area_level_3,political,locality什么是所有可能的价值以及如何定义它们? – Jaylen 2014-11-05 18:48:09

+0

我认为这是我在寻找https://developers.google.com/maps/documentation/geocoding/#Types – Jaylen 2014-11-05 18:49:35

回答

0

这里有一个快速功能我扔在一起,这里有一个fiddle

function getAddress($elements){ 
    $addr = []; 
    foreach($elements as $e){ 
     if(isset($e['types']) && in_array("street_number",$e['types'])) $addr['street_number'] = $e['long_name']; 
     if(isset($e['types']) && in_array("street_number",$e['types'])) $addr['route'] = $e['long_name']; 
     if(isset($e['types']) && in_array("administrative_area_level_2",$e['types'])) $addr['city'] = $e['long_name']; 
    } 
    return $addr; 
} 

我没有做所有的工作你虽然。这只是给你一个如何去做的例子。你必须编辑它才能获得其余的信息。

使用范例:

$obj = json_decode($json, true); 
$c = $obj['results'][0]['address_components']; 
$address_parts = getAddress($c); 

输出一个简单的数组:

array(3) { ["street_number"]=> string(3) "880" ["route"]=> string(3) "880" ["city"]=> string(9) "Anchorage" } 
+0

谢谢。我真的很感激你没有为我做这项工作。我知道了。我唯一剩下的就是了解administrative_area_level_1,administrative_area_level_2,administrative_area_level_3,administrative_area_level_4,administrative_area_level_5和 – Jaylen 2014-11-05 19:12:33

+0

之间的区别。如果您的地址位于美国,administrative_area_level_1是州,即佛罗里达州,地点就是城市。其他administrative_area_level_ * Level_2是县,其余都不相关。 – 2014-11-05 19:18:10

相关问题