谷歌地图地理编码api不会回复国家/地区

时间:2016-12-08 08:32:49

标签: php google-maps google-maps-api-3

我使用Google Geocode api从我发送的自定义区域设置中获取坐标和国家/地区。

https://maps.googleapis.com/maps/api/geocode/json?address=13+Vernon+Park+Singapore+367835&key=############################

我从中得到的回应是

{
 "results" : [
  {
     "address_components" : [
        {
           "long_name" : "13",
           "short_name" : "13",
           "types" : [ "street_number" ]
        },
        {
           "long_name" : "Vernon Park",
           "short_name" : "Vernon Park",
           "types" : [ "route" ]
        },
        {
           "long_name" : "Toa Payoh",
           "short_name" : "Toa Payoh",
           "types" : [ "neighborhood", "political" ]
        },
        {
           "long_name" : "Singapore",
           "short_name" : "Singapore",
           "types" : [ "locality", "political" ]
        },
        {
           "long_name" : "367835",
           "short_name" : "367835",
           "types" : [ "postal_code" ]
        }
     ],
     "formatted_address" : "13 Vernon Park, Singapore 367835",
     "geometry" : {
        "location" : {
           "lat" : 1.340062,
           "lng" : 103.880577
        },
        "location_type" : "ROOFTOP",
        "viewport" : {
           "northeast" : {
              "lat" : 1.341410980291502,
              "lng" : 103.8819259802915
           },
           "southwest" : {
              "lat" : 1.338713019708498,
              "lng" : 103.8792280197085
           }
        }
     },
     "place_id" : "ChIJbXRmsZAX2jERv_hlVeqBXtM",
     "types" : [ "street_address" ]
  }
 ],
 "status" : "OK"
}

我写的用于从响应中获取国家/地区的PHP代码是

foreach($response['results'][0]['address_components'] as $addressComponet){
    if(in_array('country', $addressComponet['types'])) {
        if($addressComponet['short_name'] != $addressComponet['long_name'])
            $country = $addressComponet['long_name'];
        else
            $country = $addressComponet['long_name'];
    }
}

$geometry = $response['results'][0]['geometry'];
$longitude = $geometry['location']['lng'];
$latitude = $geometry['location']['lat'];

$array = array(
    'latitude' => $latitude,
    'longitude' => $longitude,
    'location_type' => $geometry['location_type'],
    'country' => $country
);

其中$response包含curl_exec响应。这似乎一直工作到昨天。但是,从今天开始,我没有在数组中获取国家/地区字符串。我不知道的api响应是否有任何变化?

2 个答案:

答案 0 :(得分:1)

我认为响应已更改,因此我继续在Google Maps API问题部分提交了一个错误。

https://code.google.com/p/gmaps-api-issues/issues/detail?id=11024

原来他们在地理编码api中添加了一个新的前向地理编码器。他们还添加了一个标志,将请求重定向到该api中的旧前向地理编码器。

现在重点是,由于他们升级了地理编码API,我们应该如何处理数据库中存在的这种语言环境?我们已经在使用谷歌地图自动完成功能来防止随机无用的错误语言环境通过API。

答案 1 :(得分:0)

通常,地理编码API会返回与相关国家/地区的地址格式相关的地址组件。

新加坡的典型地址是:

Block 123 Marina Avenue 2 #15-222 Singapore 123456

6 Ayer Rajah Crescent Singapore 139962

它们不包含国家/地区名称,因此Geocoding API不会返回此地址组件,因为它与地址格式无关。

<强>更新

如果您需要检查特定区域设置的国家/地区,可行的解决方法是对区域设置的坐标进行反向地理编码,并将结果类型设置为country。

E.g。

搜索'6 Ayer Rajah Crescent Singapore 139962'

https://maps.googleapis.com/maps/api/geocode/json?address=6%20Ayer%20Rajah%20Crescent%20Singapore%20139962&key=YOUR_API_KEY

您将获得坐标1.294947,103.787603。现在执行反向地理编码,结果类型等于country。

https://maps.googleapis.com/maps/api/geocode/json?latlng=1.294947%2C103.787603&result_type=country&key=YOUR_API_KEY

回复将是

{
    "results":[
{
  "address_components":[
    {
      "long_name":"Singapore",
      "short_name":"SG",
      "types":[
        "country","political"
      ]
    }
  ],
  "formatted_address":"Singapore",
  "geometry":{
    "bounds":{
      "northeast":{
        "lat":1.4784001,"lng":104.0945001
      },
      "southwest":{
        "lat":1.1496,"lng":103.594
      }
    },
    "location":{
      "lat":1.352083,"lng":103.819836
    },
    "location_type":"APPROXIMATE",
    "viewport":{
      "northeast":{
        "lat":1.4707592,"lng":104.0884808
      },
      "southwest":{
        "lat":1.1587023,"lng":103.6055575
      }
    }
  },
  "place_id":"ChIJdZOLiiMR2jERxPWrUs9peIg",
  "types":[
    "country","political"
  ]
}
  ],
  "status":"OK"
}