Когда я получаю API геокодирования Карт Google из своего браузера, он работает, но не из моего сценария PHP.
Возвращает:
{
"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 вместе со всеми запросами.
Google Geocoding API проверит наличие language
GET параметр, и при отсутствии этого он будет проверять наличие заголовка Accept-Language в качестве резервной копии. Если ваш браузер настроен на предпочтение контента на французском языке, это должно сделать вышеуказанный запрос эквивалентным
Для меня, поскольку мой браузер настроен на использование английского языка, первый запрос возвращает «La Perelle, 73130 Saint-Francois-Longchamp, France», а второй возвращает «La Pérelle, 38380 Saint-Pierre-de-Chartreuse, France».
С момента введения нового геокодера в конце 2016 года region
параметр больше не единственный, который влияет на результаты, language
Параметр теперь влияет на результаты:
Предпочтительный язык имеет небольшое влияние на набор результатов, которые
API выбирает возврат и порядок, в котором они возвращаются.
Геокодер по-разному интерпретирует сокращения
язык, такие как сокращения для типов улиц, или синонимы, которые
может быть действительным на одном языке, но не на другом. Например, utca и
есть синонимы для улицы на венгерском языке.
Тем не менее, если «La Perelle, 73130 Saint-Francois-Longchamp, France» является просто плохими результатами для вышеуказанного запроса (La Pérelle, Saint-Pierre-de-Chartreuse, France), пожалуйста, учтите подача отчета об ошибке.
Работает
$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);
Надеюсь, это сработает для вас. Ваш адрес не был отформатирован для запроса формата.
Спасибо и С уважением
После иви ответ, на основе смещения региона, я должен найти другой способ связать фронт & фоновые места, и я сделал это с помощью 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');