Когда я извлекаю 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 использовать мою позицию, чтобы показать достойные результаты?
Я думаю, что это связано с смещением региона .
Попробуйте добавить параметр 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®ion=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 из своего браузера:
может случиться так, что предпочтения вашего браузера настроены на то, чтобы выбрать французский язык как первый, что делает ваш браузер включать отправку заголовка Accept-Language вместе со всеми запросами.
API Google Geocoding проверит параметр GET language
, и в отсутствие этого он будет проверять заголовок Accept-Language в качестве резервной копии. Если ваш браузер настроен на предпочтительный контент на французском языке, это должно сделать вышеупомянутый запрос эквивалентным
Для меня, потому что мой браузер настроен на предпочтительный английский, первый запрос возвращает «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');