2013-08-11 11 views
10

kullanarak ters coğrafi kodlama ile sokak, şehir ve ülke. Benim ev adresi için çalışır:

$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=".$lat.",".$lng."&sensor=true"; 
    $data = @file_get_contents($url); 
    $jsondata = json_decode($data,true); 
    if(is_array($jsondata) && $jsondata['status'] == "OK") 
    { 
      $city = $jsondata['results']['0']['address_components']['2']['long_name']; 
      $country = $jsondata['results']['0']['address_components']['5']['long_name']; 
      $street = $jsondata['results']['0']['address_components']['1']['long_name']; 
    } 

Fakat bu örnekteki gibi dizilerde daha verilerle farklı bir adrese için http://maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=true

: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=true çalışmıyor, json dizide fazla veri olduğundan ve eyaleti ülkeye yapar.

İhtiyacım olan türü nasıl seçebilirim (long_name)? cadde için

  • : long_name burada "türleri": [ "rota"] şehir için
  • : long_name burada "türleri": [ "yerellik", "siyasi"] ülkesi için
  • : long_name " türleri": [ "ülke", "siyasi"] coğrafi kod JSON'dan

Örnek çıkışı:

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "89", 
       "short_name" : "89", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Wieck De", 
       "short_name" : "Wieck De", 
       "types" : [ "establishment" ] 
      }, 
      { 
       "long_name" : "Industrieweg", 
       "short_name" : "Industrieweg", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Zutphen", 
       "short_name" : "Zutphen", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Zutphen", 
       "short_name" : "Zutphen", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Gelderland", 
       "short_name" : "GE", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "Nederland", 
       "short_name" : "NL", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "7202 CA", 
       "short_name" : "7202 CA", 
       "types" : [ "postal_code" ] 
      } 

Ben burada, ben düzelttim kendimi düşünüyorum kodum:

// street 
foreach ($jsondata["results"] as $result) { 
    foreach ($result["address_components"] as $address) { 
     if (in_array("route", $address["types"])) { 
      $street = $address["long_name"]; 
     } 
    } 
} 
// city 
foreach ($jsondata["results"] as $result) { 
    foreach ($result["address_components"] as $address) { 
     if (in_array("locality", $address["types"])) { 
      $city = $address["long_name"]; 
     } 
    } 
} 
// country 
foreach ($jsondata["results"] as $result) { 
    foreach ($result["address_components"] as $address) { 
     if (in_array("country", $address["types"])) { 
      $country = $address["long_name"]; 
     } 
    } 
} 

cevap

6

Sen ilişkisel dizi veri dönüştürmek ve

$data = array(); 
foreach($jsondata['results']['0']['address_components'] as $element){ 
    $data[ implode(' ',$element['types']) ] = $element['long_name']; 
} 
print_r($data); 

echo 'route: ' . $data['route'] . "\n"; 
echo 'country: ' . $data['country political']; 
3

Sizin kodu gibi onunla işe yarayabilir gayet iyi, ama 1 içinde bir anahtar kullanmak daha iyi olmaz foreach döngüleri yerine foreach? İşte tam aynı dizi ayrıştırmak nasıl:

$location = array(); 

    foreach ($result['address_components'] as $component) { 

    switch ($component['types']) { 
     case in_array('street_number', $component['types']): 
     $location['street_number'] = $component['long_name']; 
     break; 
     case in_array('route', $component['types']): 
     $location['street'] = $component['long_name']; 
     break; 
     case in_array('sublocality', $component['types']): 
     $location['sublocality'] = $component['long_name']; 
     break; 
     case in_array('locality', $component['types']): 
     $location['locality'] = $component['long_name']; 
     break; 
     case in_array('administrative_area_level_2', $component['types']): 
     $location['admin_2'] = $component['long_name']; 
     break; 
     case in_array('administrative_area_level_1', $component['types']): 
     $location['admin_1'] = $component['long_name']; 
     break; 
     case in_array('postal_code', $component['types']): 
     $location['postal_code'] = $component['long_name']; 
     break; 
     case in_array('country', $component['types']): 
     $location['country'] = $component['long_name']; 
     break; 
    } 

    } 
+0

Bu işe yaramaz çünkü ilk bileşen en güvenilir olanıdır, sadece 'case'leri,' if 'döngülerini yapın ve iyi olacaktır. –

2

Eğer Posta Kodu kodudur Google MAP API kullanarak i son oluşturulan gibi, sokak, şehir ülkeyi adresini bulmak için kullanıyorsanız:

$search_code = urlencode($postcode); 
     $url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' . $search_code . '&sensor=false'; 
     $json = json_decode(file_get_contents($url)); 
     if($json->results == []){ 
      return ''; 
     } 
     $lat = $json->results[0]->geometry->location->lat; 
     $lng = $json->results[0]->geometry->location->lng; 

     //Now build the actual lookup 
     $address_url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' . $lat . ',' . $lng . '&sensor=false'; 
     $address_json = json_decode(file_get_contents($address_url)); 

     $address_data = $address_json->results[0]->address_components; 
     //return $address_data = $address_json->results[0]->formatted_address; 

     $street = str_replace('Dr', 'Drive', $address_data[1]->long_name); 
     $town = $address_data[2]->long_name; 
     $county = $address_data[3]->long_name; 

     return $street.', '. $town. ', '.$county;