2011-04-02 18 views
20

Soy bastante nuevo en JSON, y estoy tratando de obtener la latitud y la longitud de una ciudad geocodificada de la API de Google Maps usando curl. La función que estoy usando es:Uso de PHP (curl) para extraer datos de JSON (Google Maps API)

function geocode($city){ 
    $cityclean = str_replace (" ", "+", $city); 
    $details_url = "http://maps.googleapis.com/maps/api/geocode/json?address=" . $cityclean . "&sensor=false"; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $details_url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $geoloc = json_decode(curl_exec($ch), true); 

    $step1 = $geoloc['results']; 
    $step2 = $step1['geometry']; 
    $coords = $step2['location']; 

    print $coords['lat']; 
    print $coords['lng']; 

} 

El objetivo de todo esto es para tirar de los valores de latitud y de GNL de los Resultados -> Geometría -> Localización conjunto de la siguiente JSON:

{ 
    "status": "OK", 
    "results": [ { 
    "types": [ "locality", "political" ], 
    "formatted_address": "Westminster, London, UK", 
    "address_components": [ { 
     "long_name": "London", 
     "short_name": "London", 
     "types": [ "locality", "political" ] 
    }, { 
     "long_name": "Westminster", 
     "short_name": "Westminster", 
     "types": [ "administrative_area_level_3", "political" ] 
    }, { 
     "long_name": "Greater London", 
     "short_name": "Greater London", 
     "types": [ "administrative_area_level_2", "political" ] 
    }, { 
     "long_name": "England", 
     "short_name": "England", 
     "types": [ "administrative_area_level_1", "political" ] 
    }, { 
     "long_name": "United Kingdom", 
     "short_name": "GB", 
     "types": [ "country", "political" ] 
    } ], 
    "geometry": { 
     "location": { 
     "lat": 51.5001524, 
     "lng": -0.1262362 
     }, 
     "location_type": "APPROXIMATE", 
     "viewport": { 
     "southwest": { 
      "lat": 51.3493528, 
      "lng": -0.3783580 
     }, 
     "northeast": { 
      "lat": 51.7040647, 
      "lng": 0.1502295 
     } 
     }, 
     "bounds": { 
     "southwest": { 
      "lat": 51.3493528, 
      "lng": -0.3783580 
     }, 
     "northeast": { 
      "lat": 51.7040647, 
      "lng": 0.1502295 
     } 
     } 
    } 
    } ] 
} 

Sin embargo, no imprime nada. Sé que la función recupera con éxito el JSON de Google y lo trae a mi servidor, como hice una declaración de impresión para el valor 'estado' y me devolvió 'OK'. El problema parece ser cuando trato de profundizar en el JSON.

Disculpa si es un problema sencillo, pero como dije, soy nuevo en esto y me está volviendo loco ahora.

¡Muchas gracias! :)

Respuesta

18

Tenga en cuenta que parece que results contiene una matriz(con sólo un elemento en él, aquí) de los resultados; y geometry es un elemento dentro de un resultado.

Aquí, puede ver que el contenido de los resultados está delimitado por [], lo que indica que es una matriz.


Por lo tanto, usted tiene que primero acceda al primer resultado: $geoloc['results'][0]
En el interior de los cuales tendrá la geometría: $geoloc['results'][0]['geometry']

que le permitirá obtener la latitud y longitud:

var_dump($geoloc['results'][0]['geometry']['location']['lat']); 
var_dump($geoloc['results'][0]['geometry']['location']['lng']); 


Supongo que, dependiendo de la dirección que haya buscado, a veces tendrá más de un elemento en la matriz results.

+0

Funciona muy bien, muchas gracias :) pensé que sería algo que ver con las matrices, como lo había utilizado anteriormente sólo JSON para obtener datos de los contenedores. ¡Gracias de nuevo! : D –

+0

De nada :-) Diviértete! –

+0

Hola, ¿hay forma de obtener latitud larga usando ip del usuario? –

17

Sólo se necesita esto:

$fullurl = "http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true"; 
$string .= file_get_contents($fullurl); // get json content 
$json_a = json_decode($string, true); //json decoder 

echo $json_a['results'][0]['geometry']['location']['lat']; // get lat for json 
echo $json_a['results'][0]['geometry']['location']['lng']; // get ing for json 
+1

que puede funcionar pero preguntó sobre curl, no file_get_contents. –

+0

Esta fue una buena idea, gracias. –

+0

Por cierto, debe usar https, la API de Google necesita solicitudes a través de SSL – Theodoros80