谷歌地理编码 API 为网络标准化地址返回 ZERO_RESULTS

Posted

技术标签:

【中文标题】谷歌地理编码 API 为网络标准化地址返回 ZERO_RESULTS【英文标题】:Google Geocoding API returns ZERO_RESULTS for web-normalized address 【发布时间】:2015-09-27 08:44:40 【问题描述】:

我看到了几个关于为用户认为正确的地址获取 ZERO_RESULTS 的问题,这些问题通过更正使用错误(例如未能对地址进行 urlencode)或通过将地址调整为谷歌期望的形式来解决(例如拼出“street”而不是使用模棱两可的缩写“st”)。

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

我通过以下示例的反复试验发现,删除城镇名称 (Guilford),只留下邮政城镇 (Craigavon),使其能够对街道地址进行地理编码。谷歌地图网络应用程序在更正用户输入时包括了城镇(并更正了拼写)。并且地理编码结果中的“formatted_address”字段实际上将城镇添加回(作为“locality”)。但是在地理编码的输入地址中存在城镇会导致它找不到任何结果。谁能解释一下?这是英国地址的特别之处吗? 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” - 我使用的是过时的端点吗?如果没有,那么我想知道如何从该工具中获得不同的结果?也许关于 curl 或我正在运行的服务器?

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

【问题讨论】:

我得到了两个结果:Original address - corrected address 【参考方案1】:

问题只是在 maps api 查询中,'key' 参数与 'address' 参数被一个 ';' 分开而不是“&”。

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于谷歌地理编码 API 为网络标准化地址返回 ZERO_RESULTS的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图地理编码器 API 的承诺

谷歌地理编码 API 不如使用地址的谷歌地图准确

如何在信息窗口中显示我的地理编码地址?谷歌地图 API

对地址进行地理编码并将其设置为谷歌地图的初始中心

谷歌地理编码 API 没有返回社区作为响应

如何从谷歌地图地理编码返回地址类型?