Laravel

Вывод карты по адресу

Иногда возникает задача, вывести карту зная только адрес.

Сначала нужно получить координаты адреса, для этого создадим функцию помошник.

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&region=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>
Valentin Rasulov

Комментариев нет

Чтобы оставить комментарий необходимо авторизоваться