ImageSource

Mapbox GL JS поддерживает несколько типов источников данных, среди которых ImageSource предназначен для наложения одиночного растрового изображения на карту с привязкой к географическим координатам. Этот тип источника применяется, когда необходимо геопривязанное изображение без тайловой структуры: исторические карты, схемы, результаты аэрофотосъёмки, погодные радары, пользовательские визуальные слои поверх базовой карты.

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

Источник ImageSource создаётся через метод map.addSource, где тип указывается как "image". Основные параметры конфигурации включают URL изображения и координаты его размещения.

Ключевые элементы:

  • url — адрес изображения (PNG, JPG, WEBP)
  • coordinates — массив из четырёх угловых координат
  • type: "image"

Пример логики конфигурации:

  • верхний левый угол
  • верхний правый угол
  • нижний правый угол
  • нижний левый угол

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

Геопривязка через координаты

Механизм координат в ImageSource основан на четырёхугольной проекции. Каждая точка задаётся как [longitude, latitude]. Изображение интерполируется внутри этого четырёхугольника и деформируется в соответствии с географией.

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

Это позволяет:

  • накладывать спутниковые снимки на реальные координаты
  • привязывать схемы объектов (например, зданий или территорий)
  • отображать локальные карты поверх глобальной базы

Добавление ImageSource в карту

Процесс добавления источника состоит из двух этапов: регистрация источника и создание слоя для отображения.

Сначала создаётся источник:

  • тип "image"
  • передаётся URL изображения
  • задаются координаты углов

Затем создаётся слой типа "raster", который использует этот источник.

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

Изменение изображения в рантайме

ImageSource поддерживает динамическое обновление изображения без пересоздания источника. Это особенно важно для потоковых данных, таких как погодные радары или обновляемые карты.

Основной метод:

  • setImage(url) — заменяет текущее изображение

Также возможно изменение геометрии:

  • setCoordinates(newCoordinates) — изменяет привязку изображения

Эти операции позволяют:

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

Использование в слоях

После создания ImageSource он подключается к raster-layer:

  • type: "raster"
  • source: "<id ImageSource>"

Raster-слой обеспечивает рендеринг изображения с учётом прозрачности, масштабирования и поворота карты.

Взаимодействие слоя и источника строго разделено:

  • источник хранит данные
  • слой отвечает за визуализацию

Такое разделение соответствует архитектуре Mapbox GL JS и позволяет переиспользовать один источник в нескольких слоях.

Масштабирование и трансформация

ImageSource автоматически адаптируется к изменению масштаба карты. Однако важно понимать, что изображение не имеет собственной внутренней системы масштабирования — оно деформируется вместе с географическими координатами.

При изменении зума:

  • изображение масштабируется как часть сцены WebGL
  • углы остаются закреплёнными за координатами
  • возможна визуальная деформация при сильных искажениях проекции

Это делает ImageSource удобным для локальных областей, но менее подходящим для глобальных аналитических визуализаций.

Типичные сценарии использования

ImageSource применяется в задачах, где требуется наложение статического или обновляемого изображения:

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

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

Ограничения ImageSource

Несмотря на универсальность, ImageSource имеет ряд ограничений:

  • отсутствует тайловая структура, что ограничивает масштабируемость
  • невозможна частичная загрузка изображения
  • геометрия ограничена четырёхугольником
  • высокая нагрузка при больших изображениях
  • отсутствие встроенной поддержки проекций кроме Web Mercator сцены карты

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

Внутреннее представление в WebGL

Внутри Mapbox GL JS ImageSource преобразуется в текстуру WebGL. Изображение загружается в GPU-память и привязывается к координатной сетке слоя.

Процесс включает:

  • загрузку изображения в память браузера
  • создание WebGL texture
  • привязку к вершинному буферу координат
  • отрисовку через shader pipeline

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

Обновление координат и деформация

При изменении координат ImageSource происходит перерасчёт вершинной сетки. Каждый угол изображения пересчитывается в экранные координаты, после чего WebGL пересобирает треугольники, образующие поверхность.

Этот процесс позволяет:

  • динамически «перетягивать» изображение
  • корректировать геопривязку без перезагрузки
  • синхронизировать изображение с внешними геоданными

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

ImageSource часто используется совместно с прозрачными PNG-изображениями. Это позволяет накладывать данные поверх базовой карты без полного перекрытия подложки.

Raster-слой поддерживает:

  • opacity (прозрачность)
  • fade-in / fade-out переходы
  • смешивание с другими слоями

Таким образом создаются сложные композиции картографических данных.

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

Оптимизация работы с ImageSource включает несколько аспектов:

  • ограничение разрешения изображения до необходимого
  • использование сжатых форматов (WEBP предпочтителен)
  • минимизация частоты обновления setImage
  • корректное управление памятью при удалении источников

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

Интеграция с внешними данными

ImageSource часто используется как визуальный слой поверх данных из API:

  • метеорологические сервисы
  • спутниковые платформы
  • GIS-системы
  • пользовательские аналитические модели

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