Геокодирование Google Maps работает от браузера, но не от PHP-сервера

Когда я извлекаю API геокодирования Google Maps из своего браузера, он работает, но не из моего PHP-скрипта.

Работа : https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyDqIj_SXTf5Z5DgE_cvn5VF9h5NbuaiCbs&address=La%20P%C3%A9relle,%20Saint-Pierre-de-Chartreuse,%20France

Возврат:

{ "results" : [ { "address_components" : [ { "long_name" : "La Pérelle", "short_name" : "La Pérelle", "types" : [ "colloquial_area", "political" ] }, ], "formatted_address" : "La Pérelle, 38380, France", // other stuffs "partial_match" : true, "place_id" : "ChIJZzDRRAX4ikcRnZ-vb1tnTgY", "types" : [ "colloquial_area", "political" ] } ], "status" : "OK" } 

Не работает :

 <?php $url = 'https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyDqIj_SXTf5Z5DgE_cvn5VF9h5NbuaiCbs&address=La%20P%C3%A9relle,%20Saint-Pierre-de-Chartreuse,%20France'; echo file_get_contents($url); 

Возвращает:

 { "results" : [], "status" : "ZERO_RESULTS" } 

Есть идеи?

Обновление : некоторые люди также не видят результатов в своем браузере. Могла ли Google использовать мою позицию, чтобы показать достойные результаты?

Related of "Геокодирование Google Maps работает от браузера, но не от PHP-сервера"

Я думаю, что это связано с смещением региона .

Попробуйте добавить параметр region (хотя вам может потребоваться предварительно рассчитать его при создании запроса, если у вас есть запросы для разных регионов).

Например, для меня, из Мадрида, Испания, эта просьба приносит нулевые результаты:

 https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyDqIj_SXTf5Z5DgE_cvn5VF9h5NbuaiCbs&address=La%20P%C3%A9relle,%20Saint-Pierre-de-Chartreuse,%20France 

Но, если я добавлю параметр region=fr

 https://maps.google.com/maps/api/geocode/json?sensor=false&region=fr&key=AIzaSyDqIj_SXTf5Z5DgE_cvn5VF9h5NbuaiCbs&address=La%20P%C3%A9relle,%20Saint-Pierre-de-Chartreuse,%20France 

Я получил:

 { "results" : [ { "address_components" : [ { "long_name" : "Chartreuse Mountains", "short_name" : "Chartreuse Mountains", "types" : [ "establishment", "natural_feature" ] }, { "long_name" : "Saint-Pierre-d'Entremont", "short_name" : "Saint-Pierre-d'Entremont", "types" : [ "locality", "political" ] }, { "long_name" : "Isere", "short_name" : "Isere", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "Auvergne-Rhône-Alpes", "short_name" : "Auvergne-Rhône-Alpes", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "France", "short_name" : "FR", "types" : [ "country", "political" ] }, { "long_name" : "73670", "short_name" : "73670", "types" : [ "postal_code" ] } ], "formatted_address" : "Chartreuse Mountains, 73670 Saint-Pierre-d'Entremont, France", "geometry" : { "location" : { "lat" : 45.3773525, "lng" : 5.827970700000001 }, "location_type" : "APPROXIMATE", "viewport" : { "northeast" : { "lat" : 45.3787014802915, "lng" : 5.829319680291503 }, "southwest" : { "lat" : 45.3760035197085, "lng" : 5.826621719708499 } } }, "place_id" : "ChIJSXJWFav4ikcREQZmf4QdYMc", "types" : [ "establishment", "natural_feature" ] } ], "status" : "OK" } 

(Отсутствие) языкового предпочтения чаще всего стоит за этой проблемой.

Когда вы отправляете запрос API из своего браузера:

https://maps.google.com/maps/api/geocode/json?address=La%20P%C3%A9relle,%20Saint-Pierre-de-Chartreuse,%20France

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

API Google Geocoding проверит параметр GET language , и в отсутствие этого он будет проверять заголовок Accept-Language в качестве резервной копии. Если ваш браузер настроен на предпочтительный контент на французском языке, это должно сделать вышеупомянутый запрос эквивалентным

https://maps.google.com/maps/api/geocode/json?address=La%20P%C3%A9relle,%20Saint-Pierre-de-Chartreuse,%20France&language=fr

Для меня, потому что мой браузер настроен на предпочтительный английский, первый запрос возвращает «La Perelle, 73130 Saint-François-Longchamp, France», а второй – «La Pérelle, 38380 Saint-Pierre-de-Chartreuse, Франция».

Начиная с введения нового геокодера в конце 2016 года параметр region уже не единственный, который влияет на результаты, теперь параметр language влияет на результаты:

Предпочтительный язык мало влияет на набор результатов, которые API хочет вернуть, и порядок, в котором они возвращаются. Геокодер интерпретирует аббревиатуры по-разному в зависимости от языка, такие как аббревиатуры для типов улиц или синонимы, которые могут быть действительными на одном языке, но не в другом. Например, utca и tér являются синонимами для улицы на венгерском языке.

Тем не менее, если «La Perelle, 73130 Saint-François-Longchamp, France» является лишь плохим результатом по вышеуказанному запросу (La Pérelle, Saint-Pierre-de-Chartreuse, Франция), пожалуйста, подумайте о подаче отчета об ошибке .

Работает

 $url = 'https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyDqIj_SXTf5Z5DgE_cvn5VF9h5NbuaiCbs&address='.urlencode('La Pérelle, 38380, France'); 
 <?php $address="La Pérelle, 38380, France"; $url = 'https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyDqIj_SXTf5Z5DgE_cvn5VF9h5NbuaiCbs&address='.urlencode($address); echo file_get_contents($url); 

Надеюсь, это сработает для вас. Ваш адрес не был отформатирован для запроса формата.

Спасибо и с уважением

После ответа yivi , основанного на смещении области, мне нужно найти другой способ связать передние и задние места, и я сделал это, используя place_id .

Это было невозможно, так как Google не возвращал place_id из автозаполнения, но теперь он работает , поэтому я делаю:

 echo file_get_contents('https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyA3U9jkQcF-Vplh6bpJNcVOWMSNImCPn04&place_id=ChIJZzDRRAX4ikcRnZ-vb1tnTgY');