【问题标题】:Geocoding a specific address fails from PHP, works from browser using the same URL从 PHP 对特定地址进行地理编码失败,在使用相同 URL 的浏览器中工作
【发布时间】:2015-06-10 06:18:18
【问题描述】:

我正在使用此代码 sn-p 使用 Google Geolocation 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 定位地址。

请注意,我每天都在循环中使用相同的代码 sn-p 来定位数百个地址,并且大多数地址都可以正常工作;仅在某些地址上显示此类问题。

【问题讨论】:

  • 在我的浏览器中,该 URL 返回 ZERO_RESULTS 响应。
  • @r3wt 已经用 rawurlencode 试过了,很遗憾没有用
  • @EdCottrell 在我的 IE、FF 和 Chrome 中我得到了 OK 回复。怎么可能?见截图:snag.gy/K3vsl.jpg
  • @EdCottrell 也从我的手机 3G 连接(另一个提供商,另一个 IP,...)尝试了该 URL,我也得到了 OK 回复

标签: php google-geocoding-api


【解决方案1】:

在这里找到解决方案 https://stackoverflow.com/a/10302440/2717254 线程,感谢侧边栏中建议的 StackOverflow 相关问题 :-)

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

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

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

【讨论】:

  • 我发现了另一个奇怪的情况,在地址中使用连字符 ' 会导致地理定位 API 和谷歌地图的不同结果。解决方案是从地址中删除连字符,而如果使用 urlencode,重音字母不是问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多