谷歌地图地理编码工作从浏览器,但不是从PHP服务器

谷歌地图地理编码工作从浏览器,但不是从PHP服务器,php,google-maps,google-geocoding-api,Php,Google Maps,Google Geocoding Api,当我从浏览器中获取GoogleMaps地理编码API时,它正在工作,但不是从我的PHP脚本 工作: <?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'; ech

当我从浏览器中获取GoogleMaps地理编码API时,它正在工作,但不是从我的PHP脚本

工作

<?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" : [
      {
         "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);
有什么想法吗

更新:有些人也看不到他们浏览器的任何结果。谷歌能利用我的位置来显示不错的结果吗?

它正在工作

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

我认为与地区有关

尝试添加
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"
}
之后,基于区域偏差,我必须找到另一种方法来链接前端和后端位置,我使用
place\u id
实现了这一点

这以前是不可能的,因为谷歌没有从自动完成中返回place_id,但现在,我这样做了:

echo file_get_contents('https://maps.google.com/maps/api/geocode/json?sensor=false&key=AIzaSyA3U9jkQcF-Vplh6bpJNcVOWMSNImCPn04&place_id=ChIJZzDRRAX4ikcRnZ-vb1tnTgY');
(缺乏)语言偏好是这个问题背后最常见的原因

从浏览器发送API请求时:

您的浏览器语言首选项可能设置为首选法语作为第一语言,这使得您的浏览器在发送所有请求时包含“发送接受语言”标题

谷歌地理编码API将检查
language
GET参数,如果没有,它将检查Accept language头作为备份。如果您的浏览器设置为首选法语内容,则上述请求应与

对我来说,因为我的浏览器设置为更喜欢英语,所以第一个请求返回“La Perelle,73130 Saint François Longchamp,France”,而第二个请求返回“La pérelle,38380 Saint Pierre de Chartrese,France”

自2016年末引入新的地理编码器以来,
区域
参数不再是唯一影响结果的参数,
语言
参数现在确实影响结果:

首选语言对生成的结果集影响很小 API选择返回,以及返回顺序。 地理编码员根据不同的情况对缩写进行不同的解释 语言,如街道类型的缩写或 可能在一种语言中有效,但在另一种语言中无效。例如,utca和 tér在匈牙利语中是street的同义词


P说,如果“拉佩雷尔,73130圣徒弗兰South-LangZip,法国”只是对上述质疑的一个不好的结果(La Pe Relle,圣彼埃尔de Calthue,法国)请考虑。

< P>这将是正确的。< /P>
$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);

我觉得我需要发表评论,因为我已经花了一些时间在这个问题上-我有同样的问题,解决的是添加“位置”和“半径”参数-我猜谷歌猜测这些从浏览器标题,但不能通过一个裸体的请求。太糟糕了,他们的API没有指定这些参数,这些参数在他们的文档中是强制性的,它们似乎是用于直接请求的。

你确定它可以工作吗?我没有结果。在你的浏览器中?它现在对我有效。请求结果为零。只需单击浏览器或卷曲上的链接即可:(是的,但不是。地址已经格式化:
La%20P%C3%A9relle,%20Saint Pierre de chartrese,%20France
我刚刚测试了这段代码,它在这里工作。问题似乎出在其他地方。我想你的答案重复了问题的代码。我想,它无法解决这个问题,Yivi,谢谢你的回答。)告诉我这些,但正如你所看到的,我的评论和其他评论介于分数之间,我没有重复他的答案…希望可以理解…谢谢你的完整答案。不幸的是,这不是我预期的结果…(不在同一地区)。我要寻找place_ids,我认为这与地区偏见+不完整的搜索输入有关。你得到了你期望的结果,因为你的位置帮助谷歌“猜测”正确的位置。你不可能也传递邮政编码吗?这是对我进行地址地理编码时最有用的提示。@HugoH,我也看到了“Saint-Pierre de Chartrese”是您请求的一部分,但不是您响应的一部分。同样,由于您所在的位置,谷歌基本上是猜对了。在我为了清楚起见删除部分内容之前,它就已经出现在结果中了。;)
$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);