Php 使用谷歌反向地理编码获取街道、城市和国家

Php 使用谷歌反向地理编码获取街道、城市和国家,php,json,google-maps,geocoding,Php,Json,Google Maps,Geocoding,我正在尝试从谷歌json获取$street、$city和$country字符串。 它适用于我的家庭地址: 但对于数组中包含更多数据的不同地址,如本例所示: 它不起作用,因为json数组中有更多的数据,这使该省成为了一个国家 如何选择所需的类型(长名称) 对于街道:long_名称,其中“类型”:[“路线”] 对于城市:long_名称,其中“类型”:[“地区”、“政治”] 对于国家:long_名称,其中“类型”:[“国家”,“政治”] 地理代码JSON的输出示例: { "results"

我正在尝试从谷歌json获取$street、$city和$country字符串。 它适用于我的家庭地址:

但对于数组中包含更多数据的不同地址,如本例所示: 它不起作用,因为json数组中有更多的数据,这使该省成为了一个国家

如何选择所需的类型(长名称)

  • 对于街道:long_名称,其中“类型”:[“路线”]
  • 对于城市:long_名称,其中“类型”:[“地区”、“政治”]
  • 对于国家:long_名称,其中“类型”:[“国家”,“政治”]
地理代码JSON的输出示例:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "89",
               "short_name" : "89",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Wieck De",
               "short_name" : "Wieck De",
               "types" : [ "establishment" ]
            },
            {
               "long_name" : "Industrieweg",
               "short_name" : "Industrieweg",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Zutphen",
               "short_name" : "Zutphen",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Zutphen",
               "short_name" : "Zutphen",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Gelderland",
               "short_name" : "GE",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Nederland",
               "short_name" : "NL",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "7202 CA",
               "short_name" : "7202 CA",
               "types" : [ "postal_code" ]
            }
我想是我自己修好的,我的代码是:

// street
foreach ($jsondata["results"] as $result) {
    foreach ($result["address_components"] as $address) {
        if (in_array("route", $address["types"])) {
            $street = $address["long_name"];
        }
    }
}
// city
foreach ($jsondata["results"] as $result) {
    foreach ($result["address_components"] as $address) {
        if (in_array("locality", $address["types"])) {
            $city = $address["long_name"];
        }
    }
}
// country
foreach ($jsondata["results"] as $result) {
    foreach ($result["address_components"] as $address) {
        if (in_array("country", $address["types"])) {
            $country = $address["long_name"];
        }
    }
}

您可以将数据转换为关联数组,并像

 $data = array();
 foreach($jsondata['results']['0']['address_components'] as $element){
     $data[ implode(' ',$element['types']) ] = $element['long_name'];
 }
 print_r($data);

 echo 'route: ' . $data['route'] . "\n";
 echo 'country: ' . $data['country political'];

您的代码非常好,但是在1 foreach中使用开关而不是重复的foreach循环不是更好吗?下面是我如何解析完全相同的数组:

  $location = array();

  foreach ($result['address_components'] as $component) {

    switch ($component['types']) {
      case in_array('street_number', $component['types']):
        $location['street_number'] = $component['long_name'];
        break;
      case in_array('route', $component['types']):
        $location['street'] = $component['long_name'];
        break;
      case in_array('sublocality', $component['types']):
        $location['sublocality'] = $component['long_name'];
        break;
      case in_array('locality', $component['types']):
        $location['locality'] = $component['long_name'];
        break;
      case in_array('administrative_area_level_2', $component['types']):
        $location['admin_2'] = $component['long_name'];
        break;
      case in_array('administrative_area_level_1', $component['types']):
        $location['admin_1'] = $component['long_name'];
        break;
      case in_array('postal_code', $component['types']):
        $location['postal_code'] = $component['long_name'];
        break;
      case in_array('country', $component['types']):
        $location['country'] = $component['long_name'];
        break;
    }

  }

如果您使用邮政编码查找地址,正如我最近使用Google MAP API生成的street、city、country,则代码为:

$search_code = urlencode($postcode);
        $url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' . $search_code . '&sensor=false';
        $json = json_decode(file_get_contents($url));
        if($json->results == []){
            return '';
        }
        $lat = $json->results[0]->geometry->location->lat;
        $lng = $json->results[0]->geometry->location->lng;

        //Now build the actual lookup
        $address_url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' . $lat . ',' . $lng . '&sensor=false';
        $address_json = json_decode(file_get_contents($address_url));

        $address_data = $address_json->results[0]->address_components;
        //return $address_data = $address_json->results[0]->formatted_address;

        $street = str_replace('Dr', 'Drive', $address_data[1]->long_name);
        $town = $address_data[2]->long_name;
        $county = $address_data[3]->long_name;

        return $street.', '. $town. ', '.$county;

看起来像是JMESpath这样的集合解析器的工作

给定数组

{
  "locations": [
    {"name": "Seattle", "state": "WA"},
    {"name": "New York", "state": "NY"},
    {"name": "Bellevue", "state": "WA"},
    {"name": "Olympia", "state": "WA"}
  ]
}
一个JMESPath:

locations[?state=='WA'].name | sort(@){WashingtonCities:join(',',@)}

屈服

{
  "WashingtonCities": "Bellevue, Olympia, Seattle"
}

你必须重写你的案例,但是你知道这种语言有多强大。您可以使用
composer
为PHP安装JMESPath实现

这不会起作用,因为第一个组件是最可靠的,只需使
案例
if
循环即可。
{
  "WashingtonCities": "Bellevue, Olympia, Seattle"
}