Tilesets в Mapbox GL JS представляют собой основу всей системы отображения географических данных. Они определяют способ упаковки, доставки и рендеринга пространственной информации на карту, обеспечивая масштабируемость, производительность и гибкость визуализации. В рамках Mapbox GL JS тайлсеты выступают промежуточным слоем между исходными геоданными и их отрисовкой в WebGL.
Тайлсет — это набор тайлов (квадратных фрагментов данных), разбитых по уровням масштабирования и координатной сетке. Каждый тайл содержит часть географических данных, соответствующую определённому участку карты и уровню зума.
Ключевая идея заключается в том, что карта не загружает весь массив данных целиком. Вместо этого она динамически подгружает только те тайлы, которые необходимы для текущего отображения.
Это обеспечивает:
Векторные тайлы являются основным форматом в Mapbox GL JS. Они содержат геометрические данные (точки, линии, полигоны) и метаданные, но не пиксельное изображение.
Особенности:
Векторные тайлы подключаются через источник типа
vector.
map.addSource('cities', {
type: 'vector',
url: 'mapbox://mapbox.urban-areas'
});
Растровые тайлы представляют собой готовые изображения, обычно PNG или JPEG. Они рендерятся на сервере и передаются клиенту как готовые картинки.
Особенности:
Пример подключения:
map.addSource('satellite', {
type: 'raster',
url: 'mapbox://mapbox.satellite',
tileSize: 256
});
Отдельный тип тайлсетов используется для цифровых моделей рельефа.
Особенности:
terrain слоемmap.addSource('terrain-data', {
type: 'raster-dem',
url: 'mapbox://mapbox.terrain-rgb',
tileSize: 256
});
Mapbox GL JS использует формат TileJSON для описания тайлсетов. Он содержит метаданные и шаблоны URL для загрузки тайлов.
Основные поля:
tiles — массив URL-шаблоновminzoom и maxzoom — диапазон
масштабовbounds — географические границыscheme — схема координат (xyz или tms)Пример:
{
"tilejson": "2.2.0",
"tiles": [
"https://example.com/tiles/{z}/{x}/{y}.pbf"
],
"minzoom": 0,
"maxzoom": 14
}
Тайлсеты не используются напрямую для рендеринга. Они всегда
подключаются через источники (sources), которые затем
связываются со слоями (layers).
map.on('load', () => {
map.addSource('roads', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8'
});
});
map.addLayer({
id: 'road-lines',
type: 'line',
source: 'roads',
'source-layer': 'road',
paint: {
'line-color': '#ff0000',
'line-width': 2
}
});
Здесь важным элементом является source-layer, который
указывает конкретный слой внутри векторного тайлсета.
Векторные тайлсеты могут содержать несколько логических слоёв внутри одного набора данных. Например:
Каждый из них можно использовать независимо.
map.addLayer({
id: 'water-fill',
type: 'fill',
source: 'composite',
'source-layer': 'water',
paint: {
'fill-color': '#00bfff'
}
});
Тайлсеты разбиваются по zoom levels. Это означает, что на каждом уровне масштабирования сервер отдаёт разные по детализации данные.
Mapbox GL JS автоматически выбирает нужные тайлы в зависимости от текущего масштаба.
Тайлы загружаются по шаблону:
/{z}/{x}/{y}.pbf
где:
z — уровень зумаx — координата тайла по горизонталиy — координата тайла по вертикалиMapbox GL JS рассчитывает эти значения на основе текущего положения камеры.
Векторные тайлы позволяют фильтровать объекты на клиенте без изменения источника данных.
map.setFilter('road-lines', ['==', 'type', 'primary']);
Фильтрация работает мгновенно, так как данные уже загружены в браузер.
Одно из ключевых преимуществ векторных тайлсетов — возможность менять стиль без перезагрузки данных.
Пример изменения цвета дорог:
map.setPaintProperty('road-lines', 'line-color', '#0000ff');
Это не требует повторной загрузки тайлов, так как геометрия уже присутствует в памяти.
Mapbox GL JS активно использует кэширование:
Это существенно снижает количество запросов при навигации по карте.
Эффективность работы тайлсетов зависит от нескольких факторов:
Чрезмерно сложные полигоны увеличивают размер тайлов и замедляют рендеринг.
Большое количество мелких объектов может перегрузить GPU.
На низких zoom levels данные должны быть упрощены.
Иконки и символы выносятся в sprite sheets, что снижает количество запросов.
Mapbox GL JS поддерживает подключение собственных тайлсетов, размещённых на любом сервере.
Пример:
map.addSource('custom-data', {
type: 'vector',
tiles: [
'https://myserver.com/tiles/custom/{z}/{x}/{y}.pbf'
],
minzoom: 0,
maxzoom: 12
});
Это позволяет использовать собственные пайплайны генерации данных (например, Tippecanoe или tile-servers на базе PostGIS).
Стиль Mapbox GL JS (Style Specification) тесно связан с тайлсетами. Каждый слой стиля указывает:
source)source-layer)Таким образом, тайлсеты являются фундаментом, а стиль — логикой отображения поверх них.
Несмотря на гибкость, существуют ограничения:
Эти ограничения компенсируются масштабируемостью и скоростью рендеринга.
Процесс загрузки включает несколько этапов:
Каждый этап оптимизирован для асинхронной работы, что позволяет карте оставаться интерактивной во время загрузки данных.