Static Images API

Назначение и область применения

Static Images API в экосистеме Mapbox используется для генерации статических изображений карт на основе заданных параметров запроса. В отличие от интерактивного рендеринга в браузере через Mapbox GL JS, данный интерфейс возвращает готовое изображение карты (PNG, JPEG или WebP), которое можно использовать в любых контекстах, где отсутствует необходимость в динамическом взаимодействии: отчёты, email-рассылки, серверные рендеры, предпросмотр объектов, генерация миниатюр и печатные материалы.

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


Базовый формат запроса

Запрос к Static Images API формируется через HTTP GET и имеет следующий общий вид:

https://api.mapbox.com/styles/v1/{username}/{style_id}/static/{overlay}/{lon},{lat},{zoom},{bearing},{pitch}/{width}x{height}@{scale}?access_token=YOUR_MAPBOX_ACCESS_TOKEN

Каждый сегмент URL определяет отдельный аспект изображения, начиная от стиля карты и заканчивая параметрами камеры и разрешением выходного файла.


Параметры URL и их смысл

style_id Идентификатор стиля карты, созданного в Mapbox Studio или использующего стандартные стили Mapbox. Определяет визуальное оформление: цвета, слои, шрифты, иконки.

overlay Дополнительные элементы, накладываемые поверх карты:

  • маркеры (pin)
  • линии (path)
  • полигоны (geojson через encoded overlay)
  • пользовательские слои

lon, lat Центр карты в координатах долготы и широты. Определяет географическую область изображения.

zoom Масштаб отображения. Значения обычно варьируются от 0 (вся планета) до 22 (максимальная детализация улиц).

bearing Поворот карты относительно севера. Значение в градусах.

pitch Наклон камеры. Используется для создания псевдо-3D перспективы.

width x height Размер изображения в пикселях. Максимальные значения зависят от тарифного плана, но обычно ограничены серверными лимитами.

scale (@2x) Множитель плотности пикселей. Используется для Retina-дисплеев и высокодетализированных изображений.


Формирование запроса через JavaScript

Несмотря на то, что API работает через HTTP, в контексте Mapbox GL JS часто требуется динамическая генерация URL.

Пример базовой генерации ссылки:

const accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';

const url = `https://api.mapbox.com/styles/v1/mapbox/streets-v12/static/` +
            `-74.0060,40.7128,12,0,0/800x600@2x` +
            `?access_token=${accessToken}`;

Полученный URL можно использовать как источник изображения:

const img = document.createElement('img');
img.src = url;
document.body.appendChild(img);

Использование маркеров и слоёв overlay

Static Images API поддерживает добавление простых визуальных элементов поверх карты через overlay-синтаксис.

Маркеры

Маркер задаётся в URL с помощью конструкции:

pin-s+ff0000(lon,lat)

Пример:

const marker = 'pin-s+ff0000(-74.0060,40.7128)';

const url = `https://api.mapbox.com/styles/v1/mapbox/streets-v12/static/` +
            `${marker}/-74.0060,40.7128,12/800x600?access_token=${accessToken}`;

Работа с GeoJSON-данными

Для более сложных сценариев используется кодирование геометрии в polyline или GeoJSON encoding.

Пример линии маршрута:

const path = 'path-5+f44-0.5(%7Bencoded_polyline%7D)';

В реальных проектах чаще применяется предварительное кодирование геометрии на сервере, поскольку API ожидает компактное представление данных.


Интеграция с Mapbox GL JS

Хотя Mapbox GL JS предназначен для интерактивных карт, Static Images API часто используется как вспомогательный инструмент для генерации превью текущего состояния карты.

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

map.on('moveend', () => {
    const center = map.getCenter();
    const zoom = map.getZoom();
    const bearing = map.getBearing();
    const pitch = map.getPitch();

    const width = 800;
    const height = 600;

    const url = `https://api.mapbox.com/styles/v1/mapbox/streets-v12/static/` +
                `${center.lng},${center.lat},${zoom},${bearing},${pitch}` +
                `/${width}x${height}@2x` +
                `?access_token=${accessToken}`;

    document.getElementById('preview').src = url;
});

Такой подход позволяет синхронизировать статическое изображение с состоянием интерактивной карты.


Практика генерации изображений на сервере

Static Images API часто применяется в серверных сценариях, где требуется формировать изображения карт без браузера.

Пример на Node.js:

import fetch from 'node-fetch';
import fs from 'fs';

const url = 'https://api.mapbox.com/styles/v1/mapbox/light-v11/static/' +
            '-73.9857,40.7484,14/1024x768?access_token=YOUR_MAPBOX_ACCESS_TOKEN';

const response = await fetch(url);
const buffer = await response.arrayBuffer();

fs.writeFileSync('map.png', Buffer.from(buffer));

Такой подход используется для:

  • генерации PDF-отчётов
  • создания статичных карточек объектов
  • автоматизированной визуализации данных

Ограничения и особенности рендеринга

Static Images API имеет ряд технических ограничений, связанных с серверным рендерингом:

  • ограничение на размер изображения
  • невозможность полноценной интерактивности
  • ограниченная сложность overlay-геометрий
  • зависимость от заранее подготовленных стилей
  • отсутствие динамических событий и анимаций

Также следует учитывать, что сложные слои (например, большое количество маркеров или сложные GeoJSON-объекты) могут увеличивать время генерации изображения.


Производительность и кэширование

Ответы Static Images API могут кэшироваться на уровне CDN, если URL остаётся неизменным. Это означает, что идентичные запросы часто возвращаются быстрее за счёт повторного использования ранее сгенерированного изображения.

Для эффективного использования рекомендуется:

  • фиксировать параметры URL при одинаковых данных
  • избегать случайных query-параметров
  • использовать стабильные идентификаторы стилей

Связь с Mapbox GL JS стилями

Static Images API напрямую использует те же стили, что и Mapbox GL JS. Это обеспечивает визуальную консистентность между интерактивной и статической картой.

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

const styleId = 'username/custom-style-id';

const url = `https://api.mapbox.com/styles/v1/${styleId}/static/` +
            `-122.4194,37.7749,13/900x700` +
            `?access_token=${accessToken}`;

Изменение стиля автоматически отражается как в интерактивной карте, так и в статических изображениях, что позволяет централизованно управлять визуальной системой.


Применение в прикладных задачах

Static Images API используется в системах, где карта выступает как визуальный компонент данных:

  • геоаналитические панели
  • CRM-системы с отображением клиентов
  • логистические трекинг-сервисы
  • маркетинговые лендинги с картой расположения
  • автоматическая генерация превью объектов недвижимости

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