Php 来自谷歌API的一致结果
使用GoogleAPI根据纬度和经度从两个选项中的一个确定县,结果不一致。一个给县下键2;另一个钥匙是4。在这种不一致的情况下,我如何获取所需的信息 我只使用过几次Json,所以可能我误解了如何检索值,所以这里是我的PHP函数,用于解析它:Php 来自谷歌API的一致结果,php,arrays,json,Php,Arrays,Json,使用GoogleAPI根据纬度和经度从两个选项中的一个确定县,结果不一致。一个给县下键2;另一个钥匙是4。在这种不一致的情况下,我如何获取所需的信息 我只使用过几次Json,所以可能我误解了如何检索值,所以这里是我的PHP函数,用于解析它: function getCounty($LatLong) { global $googlekey; $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$LatLo
function getCounty($LatLong) {
global $googlekey;
$url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$LatLong&key=$googlekey";
$json = @file_get_contents($url);
$data = json_decode($json);
$status = $data->status;
if ($status === "OK") :
//return $data->results[0]->address_components[2]->long_name;
return $data->results[0]->address_components[4]->long_name;
else :
return FALSE;
endif;
}
换句话说,要获得一个县的名称,需要:
返回$data->results[0]->address\u components[2]->long\u name
。虽然需要此项才能获取其他县的名称:
返回$data->results[0]->address\u components[4]->long\u name
这违背了试图动态查找它在哪个县使用的目的
使用Json对其进行解析,给出一个县的部分输出片段,其中县的键为2
[2] => stdClass Object
(
[long_name] => Santa Cruz County
[short_name] => Santa Cruz County
[types] => Array
(
[0] => administrative_area_level_2
[1] => political
)
)
[3] => stdClass Object
(
[long_name] => California
[short_name] => CA
[types] => Array
(
[0] => administrative_area_level_1
[1] => political
)
)
[4] => stdClass Object
(
[long_name] => United States
[short_name] => US
[types] => Array
(
[0] => country
[1] => political
)
)
。另一个县的密钥为4:
[2] => stdClass Object
(
[long_name] => West Valley
[short_name] => West Valley
[types] => Array
(
[0] => neighborhood
[1] => political
)
)
[3] => stdClass Object
(
[long_name] => San Jose
[short_name] => San Jose
[types] => Array
(
[0] => locality
[1] => political
)
)
[4] => stdClass Object
(
[long_name] => Santa Clara County
[short_name] => Santa Clara County
[types] => Array
(
[0] => administrative_area_level_2
[1] => political
)
)
话虽如此,有没有办法直接从IP地址获取县?我在某个地方看到谷歌对此表示不满,但在谷歌API文档中,我看到了使用IP的参考资料,但没有任何例子,因此它对如何使用IP含糊其辞。正如@enricog所说;您需要的是根据特定类型提取值 根据文件: 以下是您可以做的一个想法: $data=json\u解码$json; $countries=[]; foreach$data->results as$result{ $countries=array\u merge$countries,array\u filter$result->address\u组件,函数$address{ 返回数组'administration\u area\u level\u 2',$address->types; }; } $countries=数组_映射函数$country{ 返回$country->long\u name; },$个县; echo内爆“,”,$countries; 我不使用GoogleMapAPI,我不知道是否可以在响应中包含多个县。JSON结构允许它,我想,根据请求的内容,它可能会有一些。 我在json中添加了虚构的值来验证这个原则 我相信这个片段是可以优化的。但至少它会从响应中返回每个县,并且不会得到未定义的索引 复习 在使用了一点API之后,我现在可以更精确地回答问题了。但这只是我的猜测。 当您请求位置时,它将返回许多靠近您位置的已知位置。第一个结果应该总是离你最近的 谷歌注释:反向地理编码不是一门精确的科学。地理编码器将尝试在一定公差范围内找到最近的可寻址位置 在此基础上,我们可以优化代码,使其只有一个结果,即正确的县
function getCounty($LatLong) {
// do stuff
$data = json_decode($json);
$counties = [];
if(!empty($data->results)){
$counties = array_merge($counties, array_filter($data->results[0]->address_components, function ($address) {
return in_array('administrative_area_level_2', $address->types);
}));
}
if(!empty($counties)){
return reset($counties)->long_name; // https://stackoverflow.com/a/3771228/8068675
}
return 'No county found';
}
我确实读过,你没有使用PHP7。但是,我将保持这段代码与PHP7的兼容性,因为它不应该再被使用。使用Cbaconier的循环并限制它只运行一次,它现在可以工作了!请注意,$countries=[];我在本地PHP7.2开发系统上工作,但没有在live server上的旧版本PHP上工作,因此我将其更改为$countries=array 谢谢你的帮助。现在,如果有一种方法可以直接从IP做,我想知道它是什么
function getCounty($LatLong) {
global $googlekey;
$url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=$LatLong&key=$googlekey";
$json = @file_get_contents($url);
$data = json_decode($json);
$status = $data->status;
if ($status === "OK") :
//$counties = []; // for later PHP versions but does not work on live server
$counties = array();
$i = 0;
foreach (range(1, 1) as $i) :
foreach($data->results as $result) :
if ($i++ > 1) break;
$counties = array_merge($counties, array_filter($result->address_components, function ($address) {
return in_array('administrative_area_level_2', $address->types);
}));
endforeach;
endforeach;
$counties = array_map(function ($county) {
return $county->long_name;
}, $counties);
return $counties[0];
else :
return FALSE;
endif;
}
我不明白你的问题。你能详细说明一下吗?这个问题是我需要使用return$data->results[0]->address\u components[2]->long\u name;查看一个县并返回$data->results[0]->address\u components[4]->long\u name;看到另一个,所以它的动态不够有用。注意,2和4个键是不同的,一个调出一个县,另一个调出另一个县,因此GoogleAPI根据位置对相同的值使用不同的键。这不可能是正确的,因此必须有其他方法来获得一致的结果。根据文档,API可以返回多个结果。您需要的是根据特定类型提取值。看见因此,您可以循环搜索结果,只提取包含通缉类型的结果。为了清楚起见,我要查找的是县,而不是国家。这个国家永远是美国。@DonP对不起,我想念里德。在这种情况下,您可以使用return strpos$address->long\u name,'country'!=错误的逻辑是一样的。我也不知道地址提前-这应该是自动的,当我从一个县到另一个县时,从一个县到另一个县。如果它可以直接从IP上完成会更好,但如果这不可能,那么就像我现在做的那样,通过纬度和经度。这样做需要另一个我不想使用的第三方插件,但显然我没有选择,尽管我对想法持开放态度。你的意思是,在这种情况下,你想要行政区级别2?从我最初的代码片段中,将country替换为administrative\u area\u level\u 2Not geting errors,but not geting output。$address变量的作用是什么?顺便说一句,这种需要
it’我只想说一个县,而不是全部,而且必须是我当时所在的县。@CBA我可能说得太快了。如果我使用echo$county->long\u name;它按预期显示在屏幕上,但如果我使用return$country->long\u name;函数不产生任何输出。返回$country->long\u name;您可以看到在闭包中返回long_名称。了解如何从函数返回$countries。从我的例子来看,它包含了一个数组中的所有长_名称。谢谢,我更正了上面的帖子以反映更正。我感谢你的帮助。它现在在一个县运行得很好,在接下来的一个小时左右,我将在另一个县再次测试它,但我不期待任何惊喜。这是可能的,我想,因为它使用IP为它提供一个附近的县,而不是我所在的县,但一旦我看到它可能会得到哪些县,我就可以对它进行编程以忽略它们,就像我在调用函数的县所做的那样。