При визуализации геопространственных данных часто используется картографическая подложка в виде Яндекс/Google/OSM/etc, которая в основном бывает двух видов - векторная или растровая. Однако, когда дело доходит до интеграции карт в свое приложение, то не всегда очевидно какой тип больше подойдет.

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

Растровые данные

Растровые данные, как правило, представляют из себя набор квадратных и равномерно расположенных растровых картинок (тайлов) формата PNG/JPEG. Представьте, что весь мир это поле, поделенное на множество квадратов, где каждый квадрат имеет значение X/Y/Z (долгота/широта/уровень зума).

Санкт-Петербург с высоты. Каждый тайл - это отдельная JPG-картинка 256x256 пикселей.
Санкт-Петербург с высоты. Каждый тайл - это отдельная JPG-картинка 256x256 пикселей.

Векторные данные

Примечание: здесь рассмотрен открытый стандарт векторных тайлов MVT. Большинство крупных коммерческих провайдеров картографии используют свои проприетарные (закрытые) форматы тайлов, но обычно они тоже векторные.

В случае с векторными данными все чуть сложнее. Вместо картинки каждый тайл содержит в себе различную геометрию (дорог/домов/границ и т.д.), которая привязана не к географическим координатам, а строго к векторным X/Y. Геометрия представлена в виде следующих типов фигур:

  • Точки - одна вершина, например, POI.

  • Линии - две или более вершин, при этом первая и последняя вершины не равны между собой. Например, дорога.

  • Полигоны - три или более вершин, при этом последняя вершина равна первой. Например, геометрия дома.

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

Стоит отметить, что сами тайлы содержат только информацию о геометрии, сгруппированную в слои. То есть у каждой геометрии есть текстовое поле "layer", в котором содержится имя слоя. Геометрия дорожной сети попадает в слой "roads", зданий - в "buildings" и так далее. Данная группировка по слоям не только упрощает использование информации, но и делает возможность в дальнейшем по-разному визуализировать каждый слой.

Очень упрощенный пример векторного тайла с двумя геометриями внутри.
Очень упрощенный пример векторного тайла с двумя геометриями внутри.

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

Стили карты

Стиль обычно представляет из себя большой JSON-документ с полным описанием того, какие слои как отображать, откуда брать сами тайлы (URL-адреса), тип проекции и прочая различная информация. Ниже пример описания слоя со зданиями:

{
  "id": "building",
  "type": "fill",
  "source": "starlinemaps",
  "source-layer": "building",
  "minzoom": 15,
  "layout": {"visibility": "visible"},
  "paint": {
    "fill-outline-color": "#d5d0cb",
    "fill-color": "hsl(0, 0%, 93%)",
    "fill-opacity": {
      "base": 1,
      "stops": [[15.5, 0], [16, 0.9]]
    }
  }
}

А вот как выглядит этот же слой, но в визуальном редакторе карт.
А вот как выглядит этот же слой, но в визуальном редакторе карт.

Плюсы и минусы обоих типов

У нас в компании мы почти не используем растровые тайлы, исключение - спутниковые изображения и данные аэросъёмок. Ниже попробую собрать плюсы и минусы, которые, возможно, помогут в выборе подходящего формата.

Тип

???? Плюсы

???? Минусы

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

отрисовка на клиенте быстрее, потому что не нужно рассчитывать стили и геометрию

датасет тайлов для всей планеты будет очень большим, в сравнении с векторным

некоторые типы данных (например, изменение водных поверхностей) оптимально рисовать только растром

отсутствие гибкости и интерактивности (тайлы нельзя перекрашивать/менять на лету)

формат поддерживают всё старое железо и софт

генерация растровых тайлов занимает больше времени

Векторные тайлы

отличная гибкость и настраивамость любого элемента

требуется библиотека/SDK с поддержкой MVT

быстрая конвертация из PostGIS или других источников

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

улучшенная точность гео-данных

на "медленном" железе могут быть проблемы с производительностью отрисовки

Заключение

По состоянию на 2023 все основные библиотеки (Leaflet, MapLibre и OpenLayers) поддерживают оба типа данных. Однако, на нашем опыте векторный формат показал себя как более удобный и гибкий формат для отображения любого количество геоданных. Стоило бы также рассказать об открытых и закрытых источниках геоданных, но это, кажется, тема уже для отдельной статьи.

Комментарии (0)