Иногда возникает задача, вывести карту зная только адрес.
Сначала нужно получить координаты адреса, для этого создадим функцию помошник.
class Helpers { public static function location($address) { $obj = null; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode($address) . '&sensor=true_or_false'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch); if ($output !== false) { if ($location = json_decode($output)) { if ($location->status == 'OK') $obj = $location->results[0]->geometry->location; } } curl_close($ch); return $obj; } }
На выходе мы получим объект с двумя свойствами, это $obj->lat
и $obj->lng
(широта и долгота).
Недостаток такого подхода в том, что если гугл найдёт два и более одинаковых населённых пункта, то будет выбиран первый найденный.
Для того, чтобы сузить поиск, добавим к запросу регион, к примеру $region = ua
.
curl_setopt($ch, CURLOPT_URL, 'http://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode($address) . '&sensor=true_or_false®ion=ua');
Теперь осталось только вывести карту, в контролере получаем координаты:
$address = 'ТРЦ «Дрим таун», г. Киев, пр-т Оболонский, 21-Б'; return View::make('front.dealer', array( 'title' => 'Вывод карты', 'coords' => Helpers::location($address) ));
и передаём в шаблон:
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8" /> <title>{{{ $title }}}</title> <style> #map { height: 450px } </style> </head> <body> <h1>Карта</h1> <div id="map"></div> </body> @if(!is_null($coords)) <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> function initializeMap() { var myLatlng = new google.maps.LatLng({{{ $coords->lat }}},{{{ $coords->lng }}}); var myOptions = { center: myLatlng, zoom: 14, mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById("map"), myOptions); } google.maps.event.addDomListener(window, 'load', initializeMap); </script> @endif </html>
Комментариев нет