Vector tiles (векторные тайлы) — технология представления картографических данных в виде небольших фрагментов, содержащих геометрические объекты и их атрибуты, а не готовые изображения. В отличие от растровых тайлов, которые представляют собой заранее отрисованные PNG или JPEG-картинки, векторные тайлы содержат исходные геометрии: точки, линии и полигоны.
Каждый тайл обычно соответствует определённому уровню масштабирования и координатам сетки. При загрузке карта получает не изображение дороги или здания, а набор координат и связанных с ними свойств. Отрисовка выполняется уже на стороне клиента.
Основные преимущества:
В современных веб-картах векторные тайлы стали стандартом благодаря высокой производительности и гибкости.
Структура работы:
Преимущества:
Недостатки:
Структура работы:
Преимущества:
Недостатки:
Наиболее распространённым стандартом является Mapbox Vector Tile (MVT).
Особенности формата:
Типичный URL векторного тайла:
https://server.com/tiles/{z}/{x}/{y}.pbf
где:
z — уровень масштабирования;x — координата по горизонтали;y — координата по вертикали.Расширение .pbf указывает на использование формата
Protocol Buffers.
Базовая библиотека Leaflet ориентирована на работу с растровыми тайлами:
L.tileLayer(urlTemplate).addTo(map);
Для работы с векторными тайлами используются дополнительные плагины:
Наиболее популярным решением считается Leaflet.VectorGrid.
Через CDN:
<script src="https://unpkg.com/leaflet.vectorgrid/dist/Leaflet.VectorGrid.bundled.js"></script>
После подключения появляется пространство имён:
L.vectorGrid
Основные компоненты:
L.vectorGrid.protobuf()
L.vectorGrid.slicer()
Простейший пример:
const vectorLayer = L.vectorGrid.protobuf(
"https://server.com/tiles/{z}/{x}/{y}.pbf"
);
vectorLayer.addTo(map);
Leaflet автоматически:
Параметры слоя:
const vectorLayer = L.vectorGrid.protobuf(
"https://server.com/tiles/{z}/{x}/{y}.pbf",
{
maxZoom: 18
}
);
Также могут использоваться:
{
minZoom: 0,
maxZoom: 20
}
Каждый MVT-тайл может содержать несколько слоёв.
Например:
Настройка внешнего вида:
const vectorLayer = L.vectorGrid.protobuf(
url,
{
vectorTileLayerStyles: {
roads: {
color: "red",
weight: 2
}
}
}
);
Пример оформления дорожной сети:
vectorTileLayerStyles: {
roads: {
color: "#444",
weight: 3,
opacity: 0.8
}
}
Параметры линий:
| Свойство | Назначение |
|---|---|
| color | цвет линии |
| weight | толщина |
| opacity | прозрачность |
| dashArray | пунктир |
| lineCap | форма концов |
| lineJoin | соединение сегментов |
Для зданий:
vectorTileLayerStyles: {
buildings: {
fill: true,
fillColor: "#cfcfcf",
fillOpacity: 0.8,
color: "#888",
weight: 1
}
}
Для парков:
parks: {
fillColor: "#8bc34a",
fillOpacity: 0.7,
color: "#4caf50"
}
Точки могут отображаться как окружности:
places: {
radius: 5,
fillColor: "#2196f3",
color: "#ffffff",
weight: 1
}
Для разных типов объектов допустимо использовать индивидуальные стили.
Вместо объекта можно использовать функцию.
Пример:
roads: function(properties) {
return {
color:
properties.class === "motorway"
? "red"
: "gray",
weight:
properties.class === "motorway"
? 5
: 2
};
}
Leaflet будет вызывать функцию для каждого объекта.
Типичная структура свойств:
{
name: "Main Street",
class: "primary",
bridge: false,
tunnel: false
}
Обращение к данным:
roads: function(props) {
return {
color:
props.bridge
? "orange"
: "black"
};
}
Это позволяет строить сложные правила визуализации.
Пример классификации дорог:
roads: function(props) {
switch(props.class) {
case "motorway":
return {
color: "#ff5722",
weight: 6
};
case "primary":
return {
color: "#ff9800",
weight: 4
};
default:
return {
color: "#757575",
weight: 2
};
}
}
Подобный подход используется в большинстве картографических стилей.
Векторные тайлы позволяют взаимодействовать с отдельными объектами.
Необходимо включить:
interactive: true
Пример:
const layer = L.vectorGrid.protobuf(
url,
{
interactive: true
}
);
После этого становятся доступны события.
Событие выбора объекта:
layer.on("click", function(e) {
console.log(e.layer.properties);
});
Содержимое:
e.layer.properties
может содержать:
{
name: "Central Park",
type: "park"
}
Отображение информации:
layer.on("click", function(e) {
L.popup()
.setLatLng(e.latlng)
.setContent(
e.layer.properties.name
)
.openOn(map);
});
Векторный объект становится полноценным источником данных для интерфейса.
Пример:
layer.on("mouseover", function(e) {
layer.setFeatureStyle(
e.layer.properties.id,
{
color: "yellow",
weight: 5
}
);
});
Возврат стиля:
layer.resetFeatureStyle(id);
Такая функциональность часто используется в кадастровых и аналитических системах.
Можно скрывать ненужные элементы:
roads: function(props) {
if(props.class === "service") {
return null;
}
return {
color: "#555"
};
}
Объекты с классом service отображаться не будут.
Не всегда данные доступны в формате MVT.
Если имеется GeoJSON, можно создать виртуальные тайлы на стороне клиента.
Пример:
L.vectorGrid.slicer(geojsonData);
Полный вариант:
const layer = L.vectorGrid.slicer(
geojsonData,
{
vectorTileLayerStyles: {
sliced: {
color: "blue"
}
}
}
);
layer.addTo(map);
Подход удобен для:
Не рекомендуется для больших объёмов данных, поскольку нарезка выполняется в браузере.
На скорость работы влияют:
Основные рекомендации:
{
maxNativeZoom: 14
}
Позволяет избежать загрузки чрезмерно детализированных данных.
Также полезно:
Leaflet поддерживает два механизма рендеринга.
Преимущества:
Недостатки:
Преимущества:
Недостатки:
Для крупных наборов векторных тайлов обычно используется Canvas-рендеринг.
Популярные серверные решения:
Типичный процесс:
Часто источником данных выступает проект OpenStreetMap.
Последовательность обработки:
Такой подход позволяет создавать полностью собственные картографические сервисы.
На практике часто используется смешанная архитектура.
Растровая подложка:
L.tileLayer(rasterUrl).addTo(map);
Векторный слой поверх:
L.vectorGrid.protobuf(vectorUrl)
.addTo(map);
Преимущества:
Один тайл может содержать:
roads
buildings
water
parks
labels
Настройка:
vectorTileLayerStyles: {
roads: {
color: "#444"
},
buildings: {
fillColor: "#ddd"
},
water: {
fillColor: "#90caf9"
}
}
Каждый слой стилизуется независимо.
Несмотря на высокую эффективность, векторные тайлы имеют ряд особенностей:
Тем не менее именно векторные тайлы являются основой большинства современных веб-карт, обеспечивая сочетание высокой производительности, масштабируемости и гибкой стилизации геоданных в приложениях на базе Leaflet.