2013-01-14 57 views
2

我有一個經緯度,我需要取國家。從經緯度獲取國名

我使用這個:

$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; 

有時它給出了一個正確的國家名稱,但有時它給空值,有時它返回一個城市的名字。

任何人都可以幫忙嗎?

+0

所以給我們的示例網址不明確的行爲。 PS:「它的緊急」永遠不會幫助 – zerkms

+0

通過代碼,你可以假設結果總是在同一個地方。但是,結果的結構方式可能有0個或更多個結果,每個結果都有一個或多個地址組件。該國可能並不總是處於結果2或adress_component 4中。但是您可以搜索country字段的結果數組。 – datasage

回答

6

我寫了一個函數讓它變得簡單。只需傳入您的地址,可以是完整的地址,郵政編碼,或者您的經緯度。然後它將搜索該國家的地址組件數組。在無法找到縣的情況下,它將簡單地返回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; 
} 
0

我確實以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; 
} 

格式的代碼回報:居委會,市,省,國家

如果檢測到短名稱(如國家代碼或國家代碼)出現在格式代碼 - NAME。

1

獲取完整地址從經度和緯度。

$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;
0
$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; 
+0

我怎樣才能得到這座城市? –

2
$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; 
+1

這將有助於爲此代碼添加一些解釋 – Bulat

+0

這是簡單的代碼,如果您需要查找城市名稱,然後將in_array(「country」,$ cn)替換爲in_array(「locality」,$ cn),如果您需要查找Zip然後將inin_array(「country」,$ cn)替換爲in_array(「postal_code」,$ cn)。 –

0
 

     $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 == "OK") { 
     $address = $xml->result->formatted_address; 
      foreach ($xml->result->address_component as $address) { 
      if("country" == trim($address->type)) { 
       $country = $address->short_name; 
      } 
      } 
     }