Выбираем формат карт для проекта
Векторные карты или растровые? Попробуем рассмотреть основные различия между этими двумя типами и обсудим, когда следует использовать одно или другое.
Растровые данные
Растровые данные, как правило, представляют из себя набор квадратных и равномерно расположенных растровых картинок (тайлов) формата PNG/JPEG. Представьте, что весь мир это поле, поделенное на множество квадратов, где каждый квадрат имеет значение X/Y/Z (долгота/широта/уровень зума).
Векторные данные
Примечание: здесь рассмотрен открытый стандарт векторных тайлов MVT. Большинство крупных коммерческих провайдеров картографии используют свои проприетарные (закрытые) форматы тайлов, но обычно они тоже векторные.
В случае с векторными данными все чуть сложнее. Вместо картинки каждый тайл содержит в себе различную геометрию (дорог/домов/границ и т. д.), которая привязана не к географическим координатам, а строго к векторным X/Y. Геометрия представлена в виде следующих типов фигур:
- Точки — одна вершина, например, POI.
- Линии — две или более вершин, при этом первая и последняя вершины не равны между собой. Например, дорога.
- Полигоны — три или более вершин, при этом последняя вершина равна первой. Например, геометрия дома.
Далее уже сам клиент (библиотека, занимающаяся отрисовкой карты) выполняет конвертацию векторных координат в географические и наоборот.
Стоит отметить, что сами тайлы содержат только информацию о геометрии, сгруппированную в слои. То есть у каждой геометрии есть текстовое поле «layer", в котором содержится имя слоя. Геометрия дорожной сети попадает в слой "roads», зданий — в «buildings» и так далее. Данная группировка по слоям не только упрощает использование информации, но и делает возможность в дальнейшем по-разному визуализировать каждый слой.
Важный момент: в векторном тайле обычно отсутствует информация о внешнем виде (цвета, тип заливки, текстура и т. д.), только сами данные. Внешний вид уже регулируется через стиль карты.
Стили карты
Стиль обычно представляет из себя большой JSON-документ с полным описанием того, какие слои как отображать, откуда брать сами тайлы (URL-адреса), тип проекции и прочая различная информация. Ниже пример описания слоя со зданиями:
А вот как выглядит этот же слой, но в визуальном редакторе карт:
Плюсы и минусы обоих типов
У нас в Старлайн Картах мы почти не используем растровые тайлы, исключение — спутниковые изображения и данные аэросъёмок. Ниже попробую собрать плюсы и минусы, которые, возможно, помогут в выборе подходящего формата.
👍 Плюсы растровых тайлов:
- отрисовка на клиенте быстрее, потому что не нужно рассчитывать стили и геометрию
- некоторые типы данных (например, изменение водных поверхностей) оптимально рисовать только растром
- формат поддерживают всё старое железо и софт
👎 Минусы растровых тайлов:
- датасет тайлов для всей планеты будет очень большим, в сравнении с векторным
- отсутствие гибкости и интерактивности (тайлы нельзя перекрашивать/менять на лету)
- генерация растровых тайлов занимает больше времени
👍 Плюсы векторных тайлов:
- отличная гибкость и настраивамость любого элемента
- быстрая конвертация из PostGIS или других источников
- улучшенная точность гео-данных
👎 Минусы растровых тайлов:
- требуется библиотека/SDK с поддержкой MVT
- более высокий порог входа, из-за необходимости изучения документации к MVT и спецификации стилей
- на "медленном" железе могут быть проблемы с производительностью отрисовки
Заключение
По состоянию на 2023 все основные библиотеки (Leaflet, MapLibre и OpenLayers) поддерживают оба типа данных. Однако, на нашем опыте векторный формат показал себя как более удобный и гибкий формат для отображения любого количество геоданных. Стоило бы также рассказать об открытых и закрытых источниках геоданных, но это, кажется, тема уже для отдельной статьи.