Растровые тайлы

Общая модель векторных карт

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

Ключевая особенность векторного подхода заключается в разделении данных и представления. Геометрия объектов хранится в виде:

  • точек (Point)
  • линий (LineString)
  • полигонов (Polygon)
  • мультигеометрий (MultiPoint, MultiLineString, MultiPolygon)

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

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

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

Архитектура векторного слоя в HERE Maps API for JavaScript

В JavaScript API платформы HERE Maps API for JavaScript векторные карты реализуются через систему слоёв (layers) и провайдеров данных (providers).

Базовая архитектура включает:

  • MapView — контейнер визуализации карты
  • VectorTileLayer — слой для отображения векторных тайлов
  • OmvTileProvider — источник данных векторных тайлов
  • Style API — система описания внешнего вида объектов

Векторный тайл представляет собой компактный бинарный формат (OMV — Optimized Map Vector), содержащий геометрию и атрибуты объектов для определённого географического квадрата и уровня масштаба.


Инициализация векторной карты

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

const platform = new H.service.Platform({
    apikey: 'API_KEY'
});

const defaultLayers = platform.createDefaultLayers();

const map = new H.Map(
    document.getElementById('map'),
    defaultLayers.vector.normal.map,
    {
        center: { lat: 52.5200, lng: 13.4050 },
        zoom: 10,
        pixelRatio: window.devicePixelRatio
    }
);

const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));
const ui = H.ui.UI.createDefault(map, defaultLayers);

В данном контексте используется векторный слой vector.normal.map, который загружает стилизованные векторные тайлы и применяет стандартную тему отображения.


Структура векторного тайла

Каждый векторный тайл содержит несколько логических слоёв:

  • landuse — зоны землепользования
  • water — водные объекты
  • road — дорожная сеть
  • building — здания
  • transportation — транспортная инфраструктура
  • poi — точки интереса

Каждый слой внутри тайла включает:

  • геометрию объектов
  • набор свойств (например, kind, name, class, layer)
  • уровень приоритета отрисовки

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


Система стилизации векторных карт

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

Пример базовой структуры стиля:

const style = {
    "layers": {
        "water": {
            "draw": {
                "fill": "blue"
            }
        },
        "road": {
            "draw": {
                "lineWidth": 2,
                "stroke": "#ffffff"
            }
        }
    }
};

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


Динамическое изменение стиля

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

const provider = new H.service.omv.Provider(defaultLayers.vector.normal.map.getProvider().getTileService(), {
    style: new H.map.Style(style)
});

const vectorLayer = new H.map.layer.TileLayer(provider);

map.setBaseLayer(vectorLayer);

Изменение параметров стиля позволяет:

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

Фильтрация объектов по атрибутам

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

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

"layers": {
    "road": {
        "filter": [
            "==",
            ["get", "kind"],
            "highway"
        ],
        "draw": {
            "lineWidth": 4,
            "stroke": "#ff0000"
        }
    }
}

В данном случае отображаются только объекты дорожной сети, относящиеся к классу highway.

Фильтрация выполняется на клиентской стороне и не требует дополнительных запросов к серверу.


Масштабирование и уровни детализации

Векторные тайлы используют систему LOD (Level of Detail), при которой содержимое адаптируется под текущий масштаб карты.

Характер поведения:

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

Стиль может учитывать масштаб:

"layers": {
    "building": {
        "minZoom": 15,
        "draw": {
            "fill": "#cccccc"
        }
    }
}

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

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

Основные факторы производительности:

  • батчинг геометрии
  • кеширование тайлов
  • использование WebGL-рендеринга
  • минимизация перерисовок при изменении стиля

В JavaScript API используется аппаратное ускорение для отрисовки линий, полигонов и текстовых подписей.


Работа с пользовательскими слоями

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

Пример добавления слоя объектов:

const dataPoints = [
    { lat: 52.52, lng: 13.405 },
    { lat: 52.51, lng: 13.40 }
];

dataPoints.forEach(point => {
    const marker = new H.map.Marker(point);
    map.addObject(marker);
});

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


Интерактивность векторных объектов

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

Поддерживаемые действия:

  • click
  • pointermove
  • tap (на мобильных устройствах)

Пример обработки события:

map.addEventListener('tap', function (evt) {
    const target = evt.target;
    if (target instanceof H.map.Polygon) {
        console.log('Объект полигона выбран');
    }
});

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


Кастомизация тематических карт

Векторная архитектура позволяет создавать специализированные визуальные представления:

  • транспортные схемы (акцент на дорогах и маршрутах)
  • карты недвижимости (выделение зданий и зон)
  • аналитические карты (градации плотности)
  • навигационные режимы (контраст дорог и ориентиров)

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


Ограничения векторного подхода

Несмотря на гибкость, векторные карты имеют особенности:

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

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