Геокодирование определенного адреса не работает из PHP, работает из браузера с использованием того же URL-адреса

Я использую этот фрагмент кода для геокодирования адреса с помощью 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.

Обратите внимание, что я использую один и тот же фрагмент кода в цикле для геолокации сотен адресов каждый день, и на большинстве из них он работает нормально; только на некоторых адресах он показывает такие проблемы.


person Marco Marsala    schedule 10.06.2015    source источник
comment
В моем браузере этот URL возвращает ответ ZERO_RESULTS.   -  person elixenide    schedule 10.06.2015
comment
php.net/manual/en/function.rawurlencode.php   -  person r3wt    schedule 10.06.2015
comment
@ r3wt Уже пробовал с rawurlencode, к сожалению, не работает   -  person Marco Marsala    schedule 10.06.2015
comment
@EdCottrell в моих IE, FF и Chrome я получаю ответ «ОК». Как это возможно? См. снимок экрана: snag.gy/K3vsl.jpg   -  person Marco Marsala    schedule 10.06.2015
comment
@EdCottrell попробовал этот URL-адрес также с моего 3G-соединения мобильного телефона (другой провайдер, другой IP-адрес, ...), и я тоже получил ответ «ОК».   -  person Marco Marsala    schedule 10.06.2015
comment
@MarcoMarsala, я не знаю, что тебе сказать. Это странно.   -  person elixenide    schedule 10.06.2015


Ответы (2)


Нашел решение здесь https://stackoverflow.com/a/10302440/2717254, найденный благодаря предложенным вопросам, связанным со StackOverflow в сайдбаре :-)

Проблема заключалась в предвзятости региона. Я добавил ?region=it к URL-адресу, и теперь результаты согласованы.

Прежде чем добавить этот параметр, Google, вероятно, догадался об этом, когда я загрузил страницу в веб-браузере из-за заголовков, отправленных моими браузерами (на итальянском языке на итальянском языке Win7). Когда я делаю запрос из PHP, отправляется меньше заголовков, и, вероятно, Google думает, что это ПК в США или что-то подобное... :)

Кроме того, удаление почтового индекса из адреса также дает мне согласованный результат в моем PHP-скрипте и веб-браузере, но я думаю, что ?region=it является наиболее чистым и логически правильным решением.

person Community    schedule 10.06.2015
comment
Я обнаружил еще один странный случай: использование дефисов в адресе приводит к разным результатам в API геолокации и Картах Google. Решение состояло в том, чтобы удалить дефисы из адреса, в то время как акцентированные буквы не являются проблемой при использовании urlencode. - person Marco Marsala; 10.06.2015

В моем случае я решил это с помощью языка вместо региона: language=it (https://developers.google.com/maps/faq#languagesupport)

person Carlos    schedule 16.05.2019