Network запросы карты

В основе работы Google Maps JavaScript API лежит распределённая система сетевых запросов, обеспечивающая загрузку картографических данных, тайлов, геокодированной информации, объектов интереса и вспомогательных сервисов. Клиентская часть JavaScript API функционирует как координатор множества HTTP(S)-запросов, формируемых динамически в зависимости от состояния карты, уровня масштаба, позиции камеры и включённых слоёв.

Сетевое взаимодействие не ограничивается единственным endpoint’ом. Оно включает несколько подсистем: загрузку растровых или векторных тайлов, запросы к сервисам геокодирования, маршрутизации, поиска объектов, автодополнения, а также обмен данными с внутренними сервисами отрисовки и телеметрии.


Базовый цикл сетевой активности карты

При инициализации карты создаётся базовый набор запросов:

  • загрузка конфигурации карты и стилей
  • получение метаданных текущего региона
  • первичная загрузка тайлов
  • инициализация сервисных скриптов

Далее система переходит в режим событийного обновления, где каждый пользовательский жест (pan, zoom, rotate) может инициировать новый набор сетевых операций.

Ключевой принцип — ленивая загрузка данных (lazy loading): запрашивается только то, что необходимо для текущего viewport.


Загрузка тайлов карты

Принцип тайловой сетки

Карта разбивается на квадратные тайлы фиксированного размера (обычно 256×256 пикселей). Каждый тайл определяется координатами:

  • x (горизонталь)
  • y (вертикаль)
  • zoom level (z)

Запрос тайла формируется на основе текущего состояния камеры:

https://maps.googleapis.com/maps/vt?pb=...

Векторные тайлы используются для динамической отрисовки слоёв на клиенте, что уменьшает объём передаваемых данных и повышает гибкость стилизации.


Динамическая подгрузка при взаимодействии с картой

При изменении центра карты происходит пересчёт видимого bounding box. Алгоритм работы:

  1. вычисление текущих границ viewport
  2. определение необходимых тайлов
  3. проверка локального кеша
  4. отправка недостающих запросов
  5. отмена устаревших запросов

Особое внимание уделяется механизму request deduplication, предотвращающему повторные запросы одинаковых тайлов при быстром перемещении карты.


Управление сетевой нагрузкой

Система использует несколько уровней оптимизации:

Дебаунсинг событий камеры

При непрерывном перемещении карты запросы не отправляются на каждый пиксельный сдвиг. Вместо этого применяется задержка:

let timeout;

map.addListener("idle", () => {
  clearTimeout(timeout);
  timeout = setTimeout(() => {
    // финальная фиксация viewport
  }, 150);
});

Ограничение параллельных запросов

Браузерный слой ограничивает количество одновременных HTTP-соединений. API учитывает это и управляет очередью загрузки тайлов.

Отмена устаревших запросов

При использовании современных браузеров применяется AbortController:

const controller = new AbortController();

fetch(url, { signal: controller.signal });

// при изменении viewport
controller.abort();

Геокодирование и обратные запросы

Геокодирование — это преобразование адреса в координаты и наоборот. Каждый запрос к сервису геокодирования представляет собой отдельный HTTP-вызов.

Прямое геокодирование

Запрос формируется при вводе текстового адреса:

/geocode?address=...

Ответ включает:

  • координаты
  • структурированный адрес
  • административные уровни
  • точность совпадения

Обратное геокодирование

При клике по карте выполняется запрос:

/geocode?latlng=...

Особенность заключается в том, что такие запросы часто инициируются интерактивно и требуют строгого контроля частоты, чтобы избежать превышения квот.


Запросы к сервису Places

Сервис объектов интереса формирует отдельный слой сетевой активности.

Типы запросов:

  • поиск по тексту
  • поиск по геолокации
  • автодополнение
  • получение деталей объекта

Каждый тип имеет собственные endpoint’ы и квоты.

Автодополнение

При вводе текста формируются частые, но лёгкие запросы:

  • минимальный payload
  • высокая частота
  • агрессивное кеширование на стороне клиента

Маршрутизация и Directions API

Запрос построения маршрута — один из самых тяжёлых по нагрузке.

Он включает:

  • начальную точку
  • конечную точку
  • промежуточные точки
  • тип транспорта
  • ограничения (платные дороги, паромы и т.д.)

Пример логики запроса:

/directions?origin=...&destination=...&mode=driving

Результат содержит:

  • геометрию маршрута
  • шаги навигации
  • метаданные расстояния и времени
  • альтернативные маршруты

Сетевые запросы маршрутизации часто кешируются, но с учётом временной нестабильности дорожной ситуации кеш имеет короткий TTL.


Кеширование сетевых запросов

Внутренний механизм кеширования включает несколько уровней:

1. Memory cache

Используется для:

  • тайлов
  • стилей
  • автодополнения

2. Browser cache

HTTP-заголовки управляют повторным использованием данных:

  • Cache-Control
  • ETag
  • Last-Modified

3. Service-level cache

На стороне инфраструктуры Google данные могут агрегироваться и переиспользоваться между пользователями.


Параллелизм и приоритизация запросов

Система классифицирует запросы по приоритету:

  1. критические (тайлы текущего viewport)
  2. интерактивные (клики, hover)
  3. вспомогательные (предзагрузка соседних областей)
  4. фоновая аналитика

При ограничении пропускной способности низкоприоритетные запросы отбрасываются или откладываются.


Предзагрузка соседних областей

Для обеспечения плавности интерфейса используется стратегия prefetching:

  • загрузка тайлов за пределами текущего viewport
  • предсказание направления движения пользователя
  • подготовка данных для следующего zoom level

Это снижает вероятность появления пустых областей при быстром перемещении карты.


Работа с WebGL и векторными данными

Векторные карты уменьшают объём сетевого трафика за счёт передачи геометрии вместо готовых изображений.

Вместо готового тайла сервер возвращает:

  • линии
  • полигоны
  • точки
  • стили

Рендеринг происходит на GPU, что снижает нагрузку на сеть и увеличивает гибкость отображения.


Обработка ошибок сетевых запросов

Сетевые сбои обрабатываются на нескольких уровнях:

  • повторные попытки (retry with backoff)
  • деградация качества (fallback tiles)
  • пропуск некритичных данных

Типичная стратегия повторов:

  • 1-я попытка: мгновенная
  • 2-я: задержка 300–500 мс
  • 3-я: экспоненциальная задержка

Ограничения и квоты

Сетевые запросы API регулируются квотами:

  • количество запросов в секунду
  • количество загрузок тайлов
  • число запросов к Places и Directions

При превышении лимитов сервер возвращает ошибки:

  • OVER_QUERY_LIMIT
  • REQUEST_DENIED
  • UNKNOWN_ERROR

Клиентская библиотека учитывает эти состояния и снижает интенсивность запросов.


Безопасность сетевого взаимодействия

Все запросы выполняются через HTTPS. Дополнительные механизмы включают:

  • API key validation
  • domain restrictions (HTTP referrer)
  • подписанные запросы для отдельных сервисов
  • защита от повторного использования ключей

Влияние состояния сети на поведение карты

При нестабильном соединении изменяется стратегия загрузки:

  • увеличение кеширования
  • уменьшение количества prefetch запросов
  • приоритет критическим тайлам
  • снижение частоты обновления слоя трафика

В условиях медленной сети система переключается на более консервативный режим загрузки данных, сохраняя базовую функциональность отображения карты.