Google 网络规范化地址的地理编码 API returns ZERO_RESULTS
Google Geocoding API returns ZERO_RESULTS for web-normalized address
我看到了几个关于获取用户认为正确的地址的 ZERO_RESULTS 的问题,这些问题已通过更正使用错误(例如未能 url 编码地址)解决,或者通过将地址调整为 google 期望的形式(例如拼写 "street" 而不是使用模棱两可的缩写 "st")。
但我在网络上看到 maps.google.com 更正了我的原始表格的几个地址,然后正确地显示了地图上的位置。但是将更正后的形式提供给地理编码 API 仍然会得到 ZERO_RESULTS.
我通过下面的示例反复试验发现,删除城镇名称 (Guilford),只留下 post 城镇 (Craigavon),允许它地理编码到街道地址。 google 地图 Web 应用程序在更正用户输入时包含了城镇(并更正了拼写)。地理编码结果中的 "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);
我post输入的值是从 xdebug 复制粘贴的 $result 变量的值。我注意到我正在使用的端点中不包含字符串 "v3" - 我使用的是过时的端点吗?如果没有,那么我想知道如何从该工具中获得不同的结果?也许是关于 curl 或我 运行 所在的服务器?
UPDATE2: 感谢 Molle 博士的评论使我成为 post 代码,我第 10,001 次再次检查我的代码并注意到我分离了密钥来自带有“;”的地址代替 '&'。解决了这个问题,现在我也得到了两种地址形式的正确结果。天哪,我的脸都红了,好在角落里的霰弹枪没有上膛 :-) 当然,这让我想知道无效的 url 如何为大多数地址产生正确的结果,并导致这个在城镇是已删除,但我想旧规则 "garbage in, garbage out" 适用。谢谢,Stack Overflow。
问题只是在地图 api 查询中,'key' 参数与 'address' 参数由“;”分隔而不是“&”。
我在问题的第二次更新中注意到了这一点,但后来我想我应该回答它,这样它才能有一个可接受的答案。功劳真的属于Dr.Molle.
这可能有点断章取义,但在我的场景中,我正在进行反向地理编码,我传递了纬度而不是经度,反之亦然,这导致了 ZERO_RESULTS 错误。
我看到了几个关于获取用户认为正确的地址的 ZERO_RESULTS 的问题,这些问题已通过更正使用错误(例如未能 url 编码地址)解决,或者通过将地址调整为 google 期望的形式(例如拼写 "street" 而不是使用模棱两可的缩写 "st")。
但我在网络上看到 maps.google.com 更正了我的原始表格的几个地址,然后正确地显示了地图上的位置。但是将更正后的形式提供给地理编码 API 仍然会得到 ZERO_RESULTS.
我通过下面的示例反复试验发现,删除城镇名称 (Guilford),只留下 post 城镇 (Craigavon),允许它地理编码到街道地址。 google 地图 Web 应用程序在更正用户输入时包含了城镇(并更正了拼写)。地理编码结果中的 "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);
我post输入的值是从 xdebug 复制粘贴的 $result 变量的值。我注意到我正在使用的端点中不包含字符串 "v3" - 我使用的是过时的端点吗?如果没有,那么我想知道如何从该工具中获得不同的结果?也许是关于 curl 或我 运行 所在的服务器?
UPDATE2: 感谢 Molle 博士的评论使我成为 post 代码,我第 10,001 次再次检查我的代码并注意到我分离了密钥来自带有“;”的地址代替 '&'。解决了这个问题,现在我也得到了两种地址形式的正确结果。天哪,我的脸都红了,好在角落里的霰弹枪没有上膛 :-) 当然,这让我想知道无效的 url 如何为大多数地址产生正确的结果,并导致这个在城镇是已删除,但我想旧规则 "garbage in, garbage out" 适用。谢谢,Stack Overflow。
问题只是在地图 api 查询中,'key' 参数与 'address' 参数由“;”分隔而不是“&”。
我在问题的第二次更新中注意到了这一点,但后来我想我应该回答它,这样它才能有一个可接受的答案。功劳真的属于Dr.Molle.
这可能有点断章取义,但在我的场景中,我正在进行反向地理编码,我传递了纬度而不是经度,反之亦然,这导致了 ZERO_RESULTS 错误。