web-dev-qa-db-fra.com

Utilisation de PHP (curl) pour extraire des données de JSON (API Google Maps)

Je suis assez nouveau sur JSON et j'essaie d'obtenir la latitude et la longitude d'une ville géocodée à partir de l'API Google Maps en utilisant curl. La fonction que j'utilise est:

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

}

Le but de tout cela est d'extraire les valeurs lat et lng du tableau Résultats -> Géométrie -> Emplacement du JSON suivant:

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

Cependant, il n'imprime rien. Je sais que la fonction récupère avec succès le JSON de Google et l'apporte à mon serveur, car j'ai fait une instruction d'impression pour la valeur "status" et elle a renvoyé "OK". Le problème semble être lorsque j'essaie d'approfondir le JSON.

Désolé si c'est un problème simple, mais comme je l'ai dit, je suis nouveau dans ce domaine et ça me rend fou maintenant.

Merci beaucoup! :)

21
Jack W

Notez qu'il semble que results contient un tablea (avec un seul élément, ici) de résultats ; et geometry est un élément dans un résultat.

Ici, vous pouvez voir que le contenu des résultats est délimité par [] - qui indique qu'il s'agit d'un tableau.


Donc, vous devez d'abord accéder au premier résultat: $geoloc['results'][0]
À l'intérieur duquel vous aurez la géométrie: $geoloc['results'][0]['geometry']

Ce qui vous permettra d'obtenir la latitude et la longitude:

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


Je suppose que, selon l'adresse recherchée, vous aurez parfois plusieurs éléments dans le tableau results.

19
Pascal MARTIN

Vous avez juste besoin de ça:

$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