我看到过几个关于用户认为正确的地址获得ZERO_RESULTS的问题,这些问题通过纠正使用错误(例如未能对地址进行urlencode)或通过将地址调整为google期望的形式(例如拼出"street"而不是使用歧义缩写"st")来解决。
但是我看到了几个地址,我的原始表单在网络上被maps.google.com更正,然后在地图上正确显示位置。但是将正确的形式输入到地理编码API仍然得到ZERO_RESULTS。
我发现,通过下面的例子的反复试验,删除城镇的名称(Guilford),只留下邮政城镇(Craigavon),允许它的地理编码到街道地址。谷歌地图web应用程序在纠正用户输入时包括了城镇(并纠正了其拼写)。地理编码结果中的"formatted_address"字段实际上将城镇添加回去(作为"locality")。但是,在地理编码的输入地址中出现城镇导致它找不到结果。有人能解释一下吗?这是英国地址的特殊之处吗?谷歌的文档中有什么可以解释这种行为吗?
下面是一个具体的例子:
原地址: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我不知道geocoder工具,非常感谢!我得到的结果和你一样,所以一定是我的代码。
$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或者我运行的服务器?
UPDATE2:感谢Dr. Molle的评论让我发布了代码,我再次检查了我的代码第1001次,并注意到我用';'而不是'&'将密钥与地址分开。修正了这个问题,现在我也得到了两种形式的地址的正确结果。男孩是我的脸红了,好在角落里的猎枪没有装子弹:-)当然,这让我想知道无效的url如何为大多数地址产生正确的结果,并导致这个在城镇被移除时工作,但我猜旧的规则"垃圾进,垃圾出"适用。谢谢,Stack Overflow
问题在于,在map api查询中,'key'参数与'address'参数之间用';'分隔,而不是'&'。
我在问题的第二次更新中注意到这一点,但后来我想我应该回答它,以便它可以有一个可接受的答案。这是molle博士的功劳。
这可能有点脱离上下文,但在我的场景中,我正在进行反向地理编码,我传递的是纬度而不是经度,反之则是纬度,这导致了ZERO_RESULTS错误。