2013-08-11 7 views
10

Próbuję uzyskać ciąg $ street, $ city i $ country string z google json. Działa na mój adres domowy: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=trueUzyskiwanie ulicy, miasta i kraju przez odwrotne geokodowanie za pomocą google

$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']; 
    } 

Ale na inny adres z większą liczbą danych w tablicach jak w poniższym przykładzie: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=true to nie działa, ponieważ nie ma więcej danych w tablicy json i czyni to prowincję krajem.

Jak wybrać typ, którego potrzebuję (long_name)?

  • na ulicy: long_name gdzie "typów": [ "Trasa"]
  • dla miasta: long_name gdzie "typów": [ "stanowisko", "polityczne"]
  • dla kraju: long_name gdzie " typy”: [ "Kraj", "polityczny"]

Przykâadowa z JSON Geokodując:

{ 
    "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" ] 
      } 

myślę ustalone to sam, niniejszym mój kod:

// 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"]; 
     } 
    } 
} 

Odpowiedz

6

Można konwertować dane do tablicy asocjacyjnej i pracować z nim jak

$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

kod jest doskonale dobry, ale czy nie byłoby lepiej użyć przełącznika wewnątrz 1 foreach zamiast powtarzających się pętli foreach? Oto w jaki sposób analizować dokładnie taką samą tablicę:

$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

To nie zadziała, ponieważ pierwszy komponent jest najbardziej niezawodny, po prostu wykonaj pętle 'cases',' if' i wszystko będzie dobrze. –

2

Jeśli używasz kod pocztowy, aby znaleźć adres, tak jak ja niedawno generowane ulica, miasto, kraj, używając mapy Google API kod jest:

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