Карты на сайте — это не просто красивая картинка. Это возможность показать клиентам, где вы находитесь, построить маршрут или визуализировать данные. Если вы пишете на PHP и хотите добавить интерактивную карту, Google Maps API — один из самых популярных вариантов. В этой статье разберём, как подружить PHP с Google Maps, какие есть подводные камни и как сделать всё правильно с первого раза.

Digital-студия WNDER

Что такое Google Maps API и зачем он нужен PHP-разработчику

Google Maps API — это набор интерфейсов, которые позволяют встраивать карты Google на свой сайт и управлять ими программно. Вы можете ставить маркеры, рисовать линии, вычислять расстояния и даже строить маршруты. Для PHP-разработчика это означает, что большую часть работы можно делать на сервере: готовить данные, кэшировать ответы, а клиентской части останется только отрисовать карту.

Основные сценарии, где PHP + Google Maps API работают вместе:

  • Отображение списка магазинов или офисов с координатами из базы данных.
  • Расчёт расстояния между двумя точками для калькулятора доставки.
  • Кластеризация маркеров, когда точек много.
  • Построение маршрутов для логистики.

Важно понимать: Google Maps API — платный сервис с бесплатным лимитом. Поэтому нужно следить за расходом запросов и по возможности кэшировать результаты на стороне PHP.

Получаем ключ и настраиваем проект

Первым делом нужно получить API-ключ в Google Cloud Console. Заходите в консоль, создаёте проект, включаете нужные API (Maps JavaScript API, Geocoding API, Directions API и т.д.) и генерируете ключ. Не забудьте ограничить ключ по HTTP-реферреру или IP, чтобы его не украли.

Для работы с картами на клиенте (JavaScript) ключ вставляется в URL скрипта. Для серверных запросов (например, геокодирование) ключ передаётся в параметрах запроса. В PHP удобно хранить ключ в переменной окружения или конфиге, а не хардкодить в файлах.

 getenv('GOOGLE_MAPS_API_KEY') ?: 'ваш_ключ',
];

Теперь можно приступать к интеграции.

Выводим карту на страницу с помощью JavaScript

Самый простой способ показать карту — использовать Maps JavaScript API. Подключаем скрипт с ключом и инициализируем карту. Вот минимальный пример:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Моя карта</title>
    <style>
        #map { height: 400px; width: 100%; }
    </style>
</head>
<body>
    <div id="map"></div>
    <script src="https://maps.googleapis.com/maps/api/js?key=ВАШ_КЛЮЧ&callback=initMap" async defer></script>
    <script>
        function initMap() {
            const map = new google.maps.Map(document.getElementById('map'), {
                center: { lat: 55.7558, lng: 37.6173 }, // Москва
                zoom: 10
            });
        }
    </script>
</body>
</html>

Обратите внимание на параметр callback=initMap — он говорит, какую функцию вызвать после загрузки API. Это удобно, чтобы не гадать, когда скрипт загрузится.

Правило: всегда указывайте async defer при подключении скрипта Google Maps. Иначе он может заблокировать загрузку остальной страницы.

Работа с геокодированием на PHP: адрес в координаты и обратно

Часто нужно преобразовать адрес в координаты (геокодирование) или наоборот. Это можно делать как на клиенте, так и на сервере. Серверный вариант предпочтительнее, если вы хотите кэшировать результаты или скрыть ключ от пользователя.

Для запросов к Google Geocoding API из PHP используем cURL. Пример функции, которая получает координаты по адресу:

 $address,
        'key' => $apiKey,
        'language' => 'ru',
    ]);

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    if ($data['status'] !== 'OK') {
        return null;
    }

    return $data['results'][0]['geometry']['location'];
}

// Использование
$apiKey = require 'config.php';
$coords = geocodeAddress('Москва, Красная площадь', $apiKey['google_maps_api_key']);
if ($coords) {
    echo "Широта: {$coords['lat']}, Долгота: {$coords['lng']}";
} else {
    echo 'Не удалось определить координаты';
}

Обратное геокодирование (координаты в адрес) делается аналогично, только вместо address передаётся latlng.

Важно помнить о лимитах: бесплатно можно делать 40 000 запросов в месяц (на момент написания). Если превысите — Google начнёт брать деньги. Поэтому кэшируйте результаты в базе или файлах.

Добавляем маркеры и кластеризацию

Маркеры — это те самые «булавки» на карте. Чтобы добавить их, нужно создать объект google.maps.Marker и передать ему позицию и карту. Если маркеров много, они начинают накладываться друг на друга. Тогда используют кластеризацию — библиотеку MarkerClusterer.

Пример с маркерами на чистом JavaScript:

function initMap() {
    const map = new google.maps.Map(document.getElementById('map'), {
        center: { lat: 55.7558, lng: 37.6173 },
        zoom: 10
    });

    const locations = [
        { lat: 55.7601, lng: 37.6186, title: 'Красная площадь' },
        { lat: 55.7520, lng: 37.5920, title: 'Арбат' },
        { lat: 55.7100, lng: 37.6300, title: 'Парк Горького' }
    ];

    locations.forEach(loc => {
        new google.maps.Marker({
            position: { lat: loc.lat, lng: loc.lng },
            map: map,
            title: loc.title
        });
    });
}

Чтобы подключить кластеризацию, добавьте скрипт библиотеки и оберните маркеры в MarkerClusterer. Это особенно актуально для интернет-магазинов с сотнями пунктов выдачи.

Лайфхак: если маркеров больше 100, не создавайте их все сразу. Используйте кластеризацию или загружайте по мере приближения карты (viewport). Так вы сэкономите память браузера.

Строим маршруты с помощью Directions API

Directions API позволяет проложить маршрут между точками. Запрос можно делать как с клиента, так и с сервера. Серверный вариант удобен для расчёта стоимости доставки: вы получаете расстояние и время в пути, а потом используете в своих формулах.

Пример на PHP:

 $origin,
        'destination' => $destination,
        'key' => $apiKey,
        'language' => 'ru',
        'mode' => 'driving',
    ]);

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    if ($data['status'] !== 'OK') {
        return null;
    }

    $route = $data['routes'][0];
    return [
        'distance' => $route['legs'][0]['distance']['text'],
        'duration' => $route['legs'][0]['duration']['text'],
        'polyline' => $route['overview_polyline']['points'],
    ];
}

// Использование
$apiKey = require 'config.php';
$route = getRoute('Москва, Красная площадь', 'Санкт-Петербург, Невский проспект', $apiKey['google_maps_api_key']);
if ($route) {
    echo "Расстояние: {$route['distance']}, Время: {$route['duration']}";
}

Обратите внимание на параметр mode — он может быть driving, walking, bicycling или transit. Выбирайте подходящий.

Сравниваем популярные API Google Maps

Вот краткая таблица основных API, которые могут пригодиться:

API Назначение Лимит (бесплатно)
Maps JavaScript API Отображение интерактивной карты 28 000 загрузок карт в месяц
Geocoding API Преобразование адресов в координаты и обратно 40 000 запросов в месяц
Directions API Построение маршрутов 40 000 запросов в месяц
Places API Поиск мест и автодополнение Зависит от типа запроса

Всегда проверяйте актуальные лимиты на официальном сайте Google — они периодически меняются.

Что в итоге

Интеграция Google Maps с PHP — задача вполне решаемая. Главное — правильно получить ключ, не забывать про ограничения и кэширование, а также выбирать подходящий API для каждой задачи. На клиенте карту рисуем через JavaScript, а на сервере обрабатываем данные: геокодируем, строим маршруты, кэшируем результаты. Такой подход даёт гибкость и контроль над расходами.

Надеюсь, статья была полезной. Пробуйте, экспериментируйте и не бойтесь карт — они открывают много возможностей для вашего проекта.

Студия WNDER