Google 地图地理编码从浏览器工作,但不是从 PHP 服务器工作
Google Maps geocoding working from browser but not from PHP server
当我从我的浏览器获取 Google 地图地理编码 API 时,它工作正常,但不是从我的 PHP 脚本获取。
Returns :
{
"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);
Returns:
{
"results" : [],
"status" : "ZERO_RESULTS"
}
有什么想法吗?
Update :有些人也没有从他们的浏览器中看到任何结果。 Google 可以利用我的位置来显示不错的结果吗?
有效
$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);
希望这对您有用。您的地址未按要求格式化。
感谢和问候
我认为与区域region biasing有关。
尝试添加 region
参数(尽管如果您有多个不同区域的请求,则在构建请求时可能需要 pre-calculate 它)。
例如,对来自西班牙马德里的我来说,此请求带来的结果为零:
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"
}
在 之后,基于区域偏差,我必须找到另一种方法到 link 前面和 back-end 位置,我使用 place_id
做到了。
这在以前是不可能的,因为 Google 没有从它的自动完成中返回 place_id,但现在 it works,所以我这样做:
echo file_get_contents('https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyA3U9jkQcF-Vplh6bpJNcVOWMSNImCPn04&place_id=ChIJZzDRRAX4ikcRnZ-vb1tnTgY');
(缺乏)语言偏好是这个问题最常见的原因。
当您从浏览器发送 API 请求时:
您的浏览器语言首选项可能会设置为首选法语作为第一语言,这会使您的浏览器包含发送 Accept-Language header 以及所有请求。
Google 地理编码 API 将检查 language
GET 参数,如果没有,它将检查 Accept-Language header 作为备份。如果您的浏览器设置为更喜欢法语内容,那应该使上述请求等同于
对我来说,因为我的浏览器设置为更喜欢英语,第一个请求 returns "La Perelle, 73130 Saint-François-Longchamp, France" 而第二个 returns "La Pérelle, 38380 Saint-Pierre-de-Chartreuse, France".
自 2016 年底引入新的地理编码器以来,region
参数不再是唯一影响结果的参数,language
参数现在确实影响结果:
The preferred language has a small influence on the set of results that
the API chooses to return, and the order in which they are returned.
The geocoder interprets abbreviations differently depending on
language, such as the abbreviations for street types, or synonyms that
may be valid in one language but not in another. For example, utca and
tér are synonyms for street in Hungarian.
也就是说,如果 "La Perelle, 73130 Saint-François-Longchamp, France" 只是上述查询(La Pérelle,Saint-Pierre-de-Chartreuse,法国)的错误结果,请考虑 filing a bug report。
这将正常工作。
$address = "La Pérelle, 38380, France";
$prepAddr = str_replace(' ','+',$address);
$url = 'https://maps.google.com/maps/api/geocode/json?key=YOUR_KEY&address='.$prepAddr.'&sensor=false';
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$contents = curl_exec($ch);
curl_close($ch);
$output = json_decode($contents);
我觉得我需要发表评论,因为我已经在这上面花了一些时间 - 我遇到了同样的问题,解决它的方法是添加“位置”和“半径”参数 - 我猜 Google 从浏览器 headers 猜测这些,但不能通过裸请求这样做。太糟糕了,他们的 API 没有指定这些参数在他们的文档中是强制性的,它们似乎是针对直接请求的。
当我从我的浏览器获取 Google 地图地理编码 API 时,它工作正常,但不是从我的 PHP 脚本获取。
Returns :
{
"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);
Returns:
{
"results" : [],
"status" : "ZERO_RESULTS"
}
有什么想法吗?
Update :有些人也没有从他们的浏览器中看到任何结果。 Google 可以利用我的位置来显示不错的结果吗?
有效
$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);
希望这对您有用。您的地址未按要求格式化。
感谢和问候
我认为与区域region biasing有关。
尝试添加 region
参数(尽管如果您有多个不同区域的请求,则在构建请求时可能需要 pre-calculate 它)。
例如,对来自西班牙马德里的我来说,此请求带来的结果为零:
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"
}
在 place_id
做到了。
这在以前是不可能的,因为 Google 没有从它的自动完成中返回 place_id,但现在 it works,所以我这样做:
echo file_get_contents('https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyA3U9jkQcF-Vplh6bpJNcVOWMSNImCPn04&place_id=ChIJZzDRRAX4ikcRnZ-vb1tnTgY');
(缺乏)语言偏好是这个问题最常见的原因。
当您从浏览器发送 API 请求时:
您的浏览器语言首选项可能会设置为首选法语作为第一语言,这会使您的浏览器包含发送 Accept-Language header 以及所有请求。
Google 地理编码 API 将检查 language
GET 参数,如果没有,它将检查 Accept-Language header 作为备份。如果您的浏览器设置为更喜欢法语内容,那应该使上述请求等同于
对我来说,因为我的浏览器设置为更喜欢英语,第一个请求 returns "La Perelle, 73130 Saint-François-Longchamp, France" 而第二个 returns "La Pérelle, 38380 Saint-Pierre-de-Chartreuse, France".
自 2016 年底引入新的地理编码器以来,region
参数不再是唯一影响结果的参数,language
参数现在确实影响结果:
The preferred language has a small influence on the set of results that the API chooses to return, and the order in which they are returned. The geocoder interprets abbreviations differently depending on language, such as the abbreviations for street types, or synonyms that may be valid in one language but not in another. For example, utca and tér are synonyms for street in Hungarian.
也就是说,如果 "La Perelle, 73130 Saint-François-Longchamp, France" 只是上述查询(La Pérelle,Saint-Pierre-de-Chartreuse,法国)的错误结果,请考虑 filing a bug report。
这将正常工作。
$address = "La Pérelle, 38380, France";
$prepAddr = str_replace(' ','+',$address);
$url = 'https://maps.google.com/maps/api/geocode/json?key=YOUR_KEY&address='.$prepAddr.'&sensor=false';
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
$contents = curl_exec($ch);
curl_close($ch);
$output = json_decode($contents);
我觉得我需要发表评论,因为我已经在这上面花了一些时间 - 我遇到了同样的问题,解决它的方法是添加“位置”和“半径”参数 - 我猜 Google 从浏览器 headers 猜测这些,但不能通过裸请求这样做。太糟糕了,他们的 API 没有指定这些参数在他们的文档中是强制性的,它们似乎是针对直接请求的。