Google地理编码API会返回ZERO_RESULTS以获取网络规范化地址

时间:2015-07-09 06:22:57

标签: google-maps google-maps-api-3 google-geocoder google-geocoding-api

我已经看到几个关于获取用户认为正确的地址的ZERO_RESULTS的问题,这些问题通过纠正使用错误(例如,无法对地址进行urlencode)或通过将地址调整为谷歌期望的形式来解决(例如拼写出“街道”而不是使用含糊不清的缩写“st”)。

但是我看到了几个地址,我的原始表单在网上被maps.google.com更正,然后正确显示地图上的位置。但是将纠正后的形式提供给地理编码API仍然会获得ZERO_RESULTS。

我通过下面的例子通过反复试验找到了删除城镇名称(Guilford),只留下邮政城镇(Craigavon),允许它地理编码到街道地址。在更正用户输入时,谷歌地图Web应用程序包括城镇(并更正其拼写)。并且地理编码结果中的“formatted_address”字段实际上将城镇添加回(作为“地点”)。但是在地理编码的输入地址中存在城镇会导致它找不到任何结果。有谁能解释一下?这是关于英国地址的特别之处吗? Google的文档中是否有可能解释此行为的内容?

这是一个具体的例子:

原始地址:30 Drumnascumph Rd,Guildford,Craigavon,United Kingdom,BT63 6DU 地图更正为:30 Drumnascamph Road,Gilford,Craigavon,United Kingdom,BT63 6DU

原始地址和更正地址都提供了与地理编码相同的结果:

{"results" : [], "status" : "ZERO_RESULTS" }

如果我更改已更正的表单只是为了删除城镇(地区),则地理编码结果将更改为:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "30",
               "short_name" : "30",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Drumnascamph Road",
               "short_name" : "Drumnascamph Rd",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Gilford",
               "short_name" : "Gilford",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Craigavon",
               "short_name" : "Craigavon",
               "types" : [ "postal_town" ]
            },
            {
               "long_name" : "Banbridge",
               "short_name" : "Banbridge",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "United Kingdom",
               "short_name" : "GB",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "BT63 6DU",
               "short_name" : "BT63 6DU",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "30 Drumnascamph Road, Gilford, Craigavon, Banbridge BT63 6DU, UK",
         "geometry" : {
            "location" : {
               "lat" : 54.3892242,
               "lng" : -6.3126861
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 54.3905731802915,
                  "lng" : -6.311337119708497
               },
               "southwest" : {
                  "lat" : 54.3878752197085,
                  "lng" : -6.314035080291502
               }
            }
         },
         "partial_match" : true,
         "place_id" : "ChIJnzmv0ELkYEgR12ArIQ1GTnk",
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}

更新: @ Dr.Molle我不知道地理编码工具,非常感谢!我得到了与你相同的结果,所以它必须是我的代码。这是:

    $address = implode(',', $address_array);
    $url_encoded = urlencode($address);
    require 'Phpclasses/Google/private/keys.php';
    $geo_url = "https://maps.googleapis.com/maps/api/geocode/json?address=$url_encoded;key=$GOOGLE_API_KEY";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $geo_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $result = curl_exec($ch);
    curl_close($ch);
    if ($result === false) {
        throw new Exception("curl_exec() failed, \$geo_url = '$geo_url'");
    }
    $response = json_decode($result);

我发布的值是从xdebug复制粘贴的$ result变量的值。我注意到我使用的终点不包含字符串“v3” - 我使用的是过时的终点吗?如果没有,那么我想知道如何从工具中获得不同的结果?也许关于卷曲或我正在运行的服务器?

UPDATE2:感谢Molle博士的评论让我发布了代码,我在10,001'时间再次检查了我的代码并注意到我将密钥与地址分开了';'而不是'&'。修正了,现在我也得到了两种地址形式的正确结果。男孩是我的脸红色,角落里的霰弹枪没有加载的好东西:-)当然,这让我想知道这个无效的网址如何为大多数地址产生正确的结果,并导致这个工作在城镇被移除时工作,但我猜测旧规则“垃圾进,垃圾出”适用。谢谢Stack Overflow。

2 个答案:

答案 0 :(得分:5)

问题只是在地图api查询中,'键'参数与'地址分开。参数由';'而不是'&'。

我在问题的第二次更新中注意到了这一点,但后来我想我应该回答它,以便它可以得到一个可接受的答案。信用真的属于Dr.Molle。

答案 1 :(得分:0)

可能有点脱离上下文,但是在我的场景中,我正在进行反向地理编码,因此我传递了纬度而不是经度,反之亦然,这导致了ZERO_RESULTS错误。