Тайлы являются базовым механизмом отображения картографических данных в современных веб-картах. Вместо загрузки всей карты целиком сервер разбивает данные на множество небольших квадратных фрагментов фиксированного размера, которые подгружаются по мере перемещения и масштабирования карты.
В экосистеме Mapbox GL JS используются два основных типа тайлов:
Понимание различий между ними является ключевым для проектирования производительных картографических приложений.
Растровый тайл представляет собой обычное изображение, чаще всего в форматах PNG или JPEG. Каждый тайл содержит уже отрисованную карту, подготовленную сервером заранее.
При открытии карты браузер получает набор изображений и размещает их в соответствующих координатах.
Схематически процесс выглядит следующим образом:
Каждый тайл уже содержит готовое визуальное представление данных:
Клиент не знает, что именно изображено внутри тайла. Для браузера это просто картинка.
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.png'
],
tileSize: 256
});
map.addLayer({
id: 'satellite-layer',
type: 'raster',
source: 'satellite'
});
В данном случае Mapbox GL JS получает изображения и отображает их без дополнительной обработки.
Векторный тайл содержит не изображение, а набор географических объектов и их атрибутов.
Внутри тайла могут находиться:
Фактически клиент получает миниатюрную базу геоданных для определённого участка карты.
После загрузки тайла отрисовка выполняется непосредственно в браузере средствами WebGL.
Векторный тайл обычно содержит несколько слоёв данных.
Например:
roads
buildings
water
landuse
places
Внутри слоя roads могут находиться записи вида:
{
"class": "motorway",
"name": "A1"
}
Внутри слоя buildings:
{
"height": 120,
"type": "commercial"
}
Mapbox GL JS анализирует эти данные и самостоятельно рисует карту согласно настройкам стиля.
Наиболее распространённым стандартом является формат Mapbox Vector Tile (MVT).
Основные особенности:
Обычно используются файлы:
.pbf
где PBF означает Protocol Buffers.
map.addSource('city-data', {
type: 'vector',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.pbf'
]
});
После подключения источника можно создавать отдельные слои отображения.
Например:
map.addLayer({
id: 'roads',
type: 'line',
source: 'city-data',
'source-layer': 'roads',
paint: {
'line-color': '#3366ff',
'line-width': 2
}
});
Ключевая разница между двумя подходами заключается в содержимом тайла.
PNG
└── готовая картинка
PBF
├── дороги
├── здания
├── водоёмы
├── парки
└── атрибуты объектов
Поэтому возможности клиента существенно различаются.
Одним из главных недостатков растровой технологии является потеря качества при увеличении.
Предположим, имеется тайл размером:
256 × 256 пикселей
При сильном увеличении браузер растягивает изображение.
Результат:
Векторные тайлы масштабируются иначе.
Поскольку клиент работает с геометрией объектов, линии и полигоны перерисовываются заново для каждого уровня масштаба.
Преимущества:
Рассмотрим условный городской район.
Тайл может содержать:
PNG 200 КБ
При изменении стиля необходимо загружать новый набор изображений.
Тот же район может занимать:
PBF 30–80 КБ
Вместо миллионов пикселей передаются только координаты объектов и атрибуты.
Особенно заметна экономия на высоких масштабах.
Одно из важнейших преимуществ Mapbox GL JS связано именно с векторными тайлами.
Для растровых данных изменение внешнего вида требует новой генерации изображений на сервере.
Например:
Каждое изменение потребует создания новых тайлов.
Во векторной архитектуре стиль хранится отдельно от данных.
map.setPaintProperty(
'roads',
'line-color',
'#ff0000'
);
После выполнения команды:
Это фундаментальное преимущество Mapbox GL JS.
Векторная архитектура позволяет использовать один набор данных для различных стилей.
Например:
'line-color': '#555'
'line-color': '#f0f0f0'
'line-color': '#0066ff'
Все стили работают поверх одного и того же источника данных.
Растровый тайл не позволяет скрыть отдельный объект после загрузки.
Например, невозможно убрать только жилые здания, поскольку они уже нарисованы внутри изображения.
Векторные тайлы поддерживают фильтрацию в реальном времени.
map.setFilter('buildings', [
'==',
['get', 'type'],
'commercial'
]);
После применения фильтра отображаются только коммерческие здания.
Каждый объект внутри векторного тайла может содержать набор свойств.
Пример:
{
"name": "Central Park",
"type": "park",
"area": 150000
}
Эти свойства могут использоваться для:
Растровые тайлы подобной информации не содержат.
Одной из наиболее мощных возможностей Mapbox GL JS является стилизация на основе данных.
Например, цвет здания может зависеть от его высоты.
paint: {
'fill-color': [
'interpolate',
['linear'],
['get', 'height'],
0, '#ffffcc',
100, '#41b6c4',
300, '#253494'
]
}
Такой подход возможен только при наличии атрибутов внутри векторного тайла.
Растровые карты обычно имеют низкую нагрузку на графический процессор.
Браузеру необходимо лишь отобразить изображения.
Однако нагрузка на сеть может быть значительной из-за большого объёма графических данных.
Векторные карты работают иначе.
После загрузки данных происходит:
Поэтому нагрузка переносится с сети на вычислительные ресурсы клиента.
Современные устройства справляются с этой задачей значительно эффективнее, чем несколько лет назад.
Mapbox GL JS изначально разрабатывался как WebGL-библиотека.
Векторные тайлы идеально подходят для такого подхода.
Преимущества WebGL:
Растровая карта не может полноценно использовать большую часть этих возможностей.
Для построения объёмных моделей необходимы данные о геометрии объектов.
Векторные тайлы могут содержать свойства:
{
"height": 120
}
На их основе создаётся экструзия.
map.addLayer({
id: '3d-buildings',
type: 'fill-extrusion',
source: 'city-data',
'source-layer': 'buildings',
paint: {
'fill-extrusion-height': ['get', 'height']
}
});
Для растровых тайлов аналогичный механизм невозможен.
Векторная карта позволяет взаимодействовать с отдельными объектами.
Например:
map.on('click', 'roads', (e) => {
console.log(e.features[0]);
});
Можно получать:
С растровым изображением подобная интерактивность отсутствует.
Mapbox GL JS предоставляет методы поиска объектов внутри отображаемых тайлов.
Пример:
const features = map.queryRenderedFeatures();
Результат содержит реальные географические объекты.
Такой механизм используется для:
Несмотря на преимущества векторного подхода, растровая технология не исчезла.
Она по-прежнему используется в ряде задач.
Фотографии поверхности Земли являются растровыми по своей природе.
Примеры:
Сканированные карты невозможно автоматически преобразовать в полноценные векторные данные без сложной обработки.
Поэтому чаще применяются растровые тайлы.
Некоторые аналитические системы генерируют изображения заранее:
Такие слои часто распространяются в растровом формате.
Векторный подход становится оптимальным выбором при следующих условиях:
Именно поэтому Mapbox GL JS ориентирован прежде всего на использование векторных тайлов как основного формата представления картографических данных.
| Характеристика | Растровые тайлы | Векторные тайлы |
|---|---|---|
| Содержимое | Изображение | Геометрия и атрибуты |
| Формат | PNG, JPEG | PBF, MVT |
| Масштабирование | Пикселизация | Без потери качества |
| Изменение стиля | Требует новой генерации | Выполняется на клиенте |
| Фильтрация объектов | Нет | Да |
| Атрибуты объектов | Нет | Да |
| Интерактивность | Ограничена | Высокая |
| Размер данных | Обычно больше | Обычно меньше |
| Поддержка 3D | Нет | Да |
| Работа через WebGL | Ограничена | Полная |
| Data-Driven Styling | Нет | Да |
| Поиск объектов | Нет | Да |
В архитектуре Mapbox GL JS векторные тайлы представляют собой основу современного подхода к веб-картографии, где данные и визуальное оформление разделены между собой. Такое разделение обеспечивает высокую производительность, гибкость стилизации, интерактивность и возможность построения сложных картографических интерфейсов без необходимости повторной генерации карт на сервере.