Я пытаюсь получить $ street, $ city и $ country string из google json. Он работает для моего домашнего адреса: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=true
$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']; }
Но для другого адреса с большим количеством данных в массивах, подобных этому примеру: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=true, он не работает, потому что есть больше данных в массиве json, и это делает провинцию страной.
Как выбрать тип, который мне нужен (long_name)?
Пример вывода из геокода JSON:
{ "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" ] }
Я думаю, что я исправил это сам, настоящим мой код:
// 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"]; } } }
Вы можете преобразовать данные в ассоциативный массив и работать с ним подобно
$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'];
Ваш код отлично подходит, но не лучше ли использовать переключатель внутри 1 foreach вместо повторяющихся петель foreach? Вот как я разбираю тот же самый массив:
$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; } }
Если вы используете почтовый код для поиска адреса, так как я недавно создал улицу, город, страну, использующую API Google MAP, код:
$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;