使用谷歌通过反向地理编码获取街道,城市和国家

Rub*_*ben 12 php json google-maps geocoding

我正试图从google json获取$ street,$ city和$ country字符串.它适用于我的家庭住址:http: //maps.googleapis.com/maps/api/geocode/json ?latlng = 52.108662,6.307370 &sensor = true

$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=".$lat.",".$lng."&sensor=true";
    $data = @file_get_contents($url);
    $jsondata = json_decode($data,true);
    if(is_array($jsondata) && $jsondata['status'] == "OK")
    {
          $city = $jsondata['results']['0']['address_components']['2']['long_name'];
          $country = $jsondata['results']['0']['address_components']['5']['long_name'];
          $street = $jsondata['results']['0']['address_components']['1']['long_name'];
    }
Run Code Online (Sandbox Code Playgroud)

但对于具有更多数据的不同地址,如下例所示:http: //maps.googleapis.com/maps/api/geocode/json?lalng = 52.154184,6.199592&sensor = true 它不起作用,因为有json数组中的更多数据,它使该省成为国家.

如何选择我需要的类型(long_name)?

  • for street:long_name其中"types":["route"]
  • for city:long_name其中"types":["locality","political"]
  • for country:long_name where"types":["country","political"]

地理编码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" ]
            }
Run Code Online (Sandbox Code Playgroud)

我想我自己修了一下,特此是我的代码:

// 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"];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

lej*_*lot 9

您可以将数据转换为关联数组并使用它

 $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'];
Run Code Online (Sandbox Code Playgroud)