При визуализации геопространственных данных часто используется картографическая подложка в виде Яндекс/Google/OSM/etc, которая в основном бывает двух видов - векторная или растровая. Однако, когда дело доходит до интеграции карт в свое приложение, то не всегда очевидно какой тип больше подойдет.
В этом посте мы рассмотрим основные различия между этими двумя типами и обсудим, когда следует использовать одно или другое.
Растровые данные
Растровые данные, как правило, представляют из себя набор квадратных и равномерно расположенных растровых картинок (тайлов) формата PNG/JPEG. Представьте, что весь мир это поле, поделенное на множество квадратов, где каждый квадрат имеет значение X/Y/Z (долгота/широта/уровень зума).
Векторные данные
Примечание: здесь рассмотрен открытый стандарт векторных тайлов 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) поддерживают оба типа данных. Однако, на нашем опыте векторный формат показал себя как более удобный и гибкий формат для отображения любого количество геоданных. Стоило бы также рассказать об открытых и закрытых источниках геоданных, но это, кажется, тема уже для отдельной статьи.