从 PHP 对特定地址进行地理编码失败,在使用相同 URL 的浏览器中工作

Geocoding a specific address fails from PHP, works from browser using the same URL

我正在使用此代码片段对使用 Google 地理定位的地址进行地理编码 API:

<?php
$address = "Frazione Levà - 16030 Sori (GE)";
$url = 'http://maps.google.com/maps/api/geocode/xml?address='.urlencode($address).'&sensor=false';
echo $url."\n";
$xml = file_get_contents($url);
var_dump($xml);
?>

echo 命令显示调用的 URL 是:

http://maps.google.com/maps/api/geocode/xml?address=Frazione+Lev%C3%A0+-+16030+Sori+%28GE%29&sensor=false

和var_dump命令显示结果是:

string(107) "<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
 <status>ZERO_RESULTS</status>
</GeocodeResponse>
"

所以地址似乎无法进行地理定位。

如果我从浏览器调用完全相同的 URL (http://maps.google.com/maps/api/geocode/xml?address=Frazione+Lev%C3%A0+-+16030+Sori+%28GE%29&sensor=false),我会得到完全不同的结果(地址已正确定位):

<?xml version="1.0" encoding="UTF-8"?>
 <GeocodeResponse>
  <status>OK</status>
...

这怎么可能,我该如何解决?我需要从 PHP.

定位地址

请注意,我每天都在循环中使用相同的代码片段对数百个地址进行地理定位,并且它在大多数地址上都运行良好;仅在某些地址上它显示类似的问题。

在此处找到解决方案 https://whosebug.com/a/10302440/2717254 找到了线程,感谢边栏中建议的 Whosebug 相关问题:-)

问题是区域偏差。我将 ?region=it 添加到 URL,结果现在一致了。

在添加该参数之前,当我在 Web 浏览器中加载页面时,可能 Google 猜到了我,因为我的浏览器发送了 headers(Win7 意大利语中的意大利语语言)。当我从 PHP 发出请求时,发送的 headers 较少,可能 Google 认为这是一台 en-US PC 或类似的东西......:)

此外,从地址中删除邮政编码也让我在 PHP 脚本和网络浏览器中得到一致的结果,但我认为 ?region=it 是最干净且逻辑上正确的解决方案。

在我的例子中,我用语言而不是区域解决了它:language=it (https://developers.google.com/maps/faq#languagesupport)