Intereting Posts
как сделать валидацию с помощью ajax Laravel 5.3 HEREDOC вмешивается в отступы кода Как загрузить tmp_name загруженного файла в Laravel 5.0 Как получить часовую зону пользователя с помощью jquery? изменить пароль администратора (необходимо сделать форму) Получение значения из файла, вызванного запросом ajax с использованием json Открыть график | Опубликовать действие | Использование PHP для cURL вместо терминального WooCommerce 2.6 – Скрытие оплачиваемой доставки, когда бесплатная доставка запускается путем достижения определенной суммы Любой файл .php, вызывающий ОШИБКУ ВНУТРЕННЕГО СЕРВЕРА Исправить заголовок 3gp для потокового видео через сокет Удалить index.php из url через htaccess PHP – PDO не принимает вмонтированный массив в качестве параметра вопроса вопроса для предложения IN в запросе SELECT PHP readfile vs. file_get_contents Как установить параметр пользовательской ширины в тег img, созданный tinymce? PHP Неустранимая ошибка: не удается переопределить функцию

Получение улицы, города и страны путем обратного геокодирования с помощью Google

Я пытаюсь получить $ 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)?

  • для улицы: long_name, где «types»: ["route"]
  • для города: long_name, где «типы»: [«местность», «политическая»]
  • для страны: 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;