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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18173242/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 17:05:44  来源:igfitidea点击:

Getting street,city and country by reverse geocoding using google

phpjsongoogle-mapsgeocoding

提问by Ruben

I'm trying to getting the $street, $city and $country string from google json. It works for my home address : http://maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=true

我正在尝试从 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'];
    }

But for a different address with more data in the arrays like this example: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=trueit doesn't work, because there is more data in the json array and it makes the province the country.

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

How can I select the type that I need (long_name)?

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

  • for street : long_name where "types" : [ "route" ]
  • for city : long_name where "types" : [ "locality", "political" ]
  • for country : long_name where "types" : [ "country", "political" ]
  • 对于街道:long_name 其中“类型”:[“路线”]
  • 对于城市:long_name 其中“类型”:[“地方”,“”]
  • 对于国家:long_name 其中“类型”:[“国家”,“”]

Example output from the geocode JSON:

地理编码 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" ]
            }

I think I fixed it myself, hereby my 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"];
        }
    }
}

采纳答案by lejlot

You could convert the data to the associative array and work with it like

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

 $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'];

回答by joseph-l

Your code is perfectly good, but wouldn't it be better to use a switch inside 1 foreach instead of repeated foreach loops? Here is how I parse the exact same array :

您的代码非常好,但是在 1 foreach 中使用 switch 而不是重复的 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;
    }

  }

回答by sudiptpa

If you use Postal Code to find the address, as i have recently generated street,city, country using Google MAP API the code is:

如果您使用邮政编码查找地址,因为我最近使用 Google MAP API 生成了街道、城市、国家/地区,代码为:

$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;

回答by Jonathan

Looks like the job for a set-parser like JMESpath http://jmespath.org/

看起来像 JMESpath http://jmespath.org/这样的集合解析器的工作

Given the array

给定数组

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

A JMESPath of:

一个 JMESPath:

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

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

yields

产量

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

You'd have to rewrite for your case, but you get the idea how powerful this language is. You can use composerto install a JMESPath implementation for PHP

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