我有纬度和经度,我需要获取国家/地区。
我正在用这个:
$geocode_stats = file_get_contents("http://maps.googleapis.com/maps/api/geocode/json?latlng=".$deal_lat.",".$deal_long . "&sensor=false");
$output_deals = json_decode($geocode_stats);
$country = $output_deals->results[2]->address_components[4]->long_name;
有时它会给出正确的国家/地区名称,但有时会给出空白值,有时会返回城市名称。
有人可以帮忙吗?
我写了一个函数来简化它。只需传递您的地理地址即可,该地址可以是完整地址、邮政编码,也可以是纬度和经度(根据您的情况)。然后它将通过地址组件数组搜索该国家/地区。如果无法找到县,它将简单地返回 null,如果需要,您可以将其更改为空字符串 ("")。
function getGeoCounty($geoAddress) {
$url = 'http://maps.google.com/maps/api/geocode/json?address=' . $geoAddress .'&sensor=false';
$get = file_get_contents($url);
$geoData = json_decode($get);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \InvalidArgumentException('Invalid geocoding results');
}
if(isset($geoData->results[0])) {
foreach($geoData->results[0]->address_components as $addressComponent) {
if(in_array('administrative_area_level_2', $addressComponent->types)) {
return $addressComponent->long_name;
}
}
}
return null;
}
从纬度和经度获取完整地址。
$url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.trim($lat).','.trim($lng).'&sensor=false';
$json = @file_get_contents($url);$data=json_decode($json);
echo $data->results[0]->formatted_address;
$deal_lat=30.469301;
$deal_long=70.969324;
$geocode=file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?latlng='.$deal_lat.','.$deal_long.'&sensor=false');
$output= json_decode($geocode);
for($j=0;$j<count($output->results[0]->address_components);$j++){
$cn=array($output->results[0]->address_components[$j]->types[0]);
if(in_array("country", $cn)){
$country= $output->results[0]->address_components[$j]->long_name;
}
}
echo $country;
$deal_lat=30.469301;
$deal_long=70.969324;
$geocode=file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?latlng='.$deal_lat.','.$deal_long.'&sensor=false');
$output= json_decode($geocode);
for($j=0;$j<count($output->results[0]->address_components);$j++){
$cn=array($output->results[0]->address_components[$j]->types[0]);
if(in_array("country", $cn)){
$country= $output->results[0]->address_components[$j]->long_name;
}
}
echo $country;
我确实以 matwonk 的代码为基础。
function getGeoCounty($geoAddress) {
$url = 'http://maps.google.com/maps/api/geocode/json?address=' . urlencode($geoAddress) .'&sensor=false';
$get = file_get_contents($url);
$geoData = json_decode($get);
if(isset($geoData->results[0])) {
$return = array();
foreach($geoData->results[0]->address_components as $addressComponet) {
if(in_array('political', $addressComponet->types)) {
if($addressComponet->short_name != $addressComponet->long_name)
$return[] = $addressComponet->short_name. " - " . $addressComponet->long_name;
else
$return[] = $addressComponet->long_name;
}
}
return implode(", ",$return);
}
return null;
}
代码返回格式为:neighborhood, City, State, Country
如果检测到短名称(如国家/地区代码或州代码)以代码 - 名称格式出现。
$latlng = '22.7314,75.88243'; $request_url = "http://maps.googleapis.com/maps/api/geocode /xml?latlng=".$latlng."&sensor=true"; $xml = simplexml_load_file($request_url); if($xml->status == "确定") { $address = $xml->结果->formatted_address; foreach ($xml->结果->address_component as $address) { if("国家/地区" == 修剪($地址->类型)) { $国家= $地址->短名称; } } }
使用Harsh Patek的答案。我需要迭代结果以及澳大利亚的地址组成部分。我想要 2 个字母的国家/地区代码(简称)。
for ($i=0;$i<count($output->results);$i++) {
for($j=0;$j<count($output->results[$i]->address_components);$j++){
$cn=array($output->results[$i]->address_components[$j]->types[0]);
//error_log(date('Y-m-d H:i:s')."country ".print_r($output->results[$i]->address_components[$j],true)."\n", 3, 'chartlog.txt');
if(in_array("country", $cn)){
$country= $output->results[$i]->address_components[$j]->short_name;
break;
}
}
}