Векторные тайлы в MapLibre GL JS организованы в виде слоёв внутри тайлсета, и ключевым механизмом выбора данных внутри источника является свойство source-layer.
Векторный тайл (vector tile) — это контейнер, внутри которого данные разделены на логические слои. Каждый такой внутренний слой называется source-layer (иногда встречается термин «layer в тайлсете»).
source-layer — это не слой карты в стиле MapLibre GL JS, а слой внутри данных источника (source), загруженного из vector tiles.
Ключевой смысл:
source — источник данных (tileset)source-layer — конкретный слой внутри этого
tilesetlayer (в стиле) — визуальное представление на
картеЭти три уровня часто путают, но они отвечают за разные этапы обработки данных.
Векторный тайл обычно содержит несколько тематических слоёв:
Каждый из них доступен через source-layer.
Пример структуры:
tileset (source)
├── roads
├── buildings
├── water
├── poi
MapLibre GL JS не «угадывает» эти названия — они должны точно совпадать с тем, что определено в тайлсете.
В стиле MapLibre GL JS source-layer указывается внутри
объекта слоя (layer), который использует vector source.
Базовая структура:
{
"id": "road-layer",
"type": "line",
"source": "transportation",
"source-layer": "roads",
"paint": {
"line-color": "#333",
"line-width": 2
}
}
Здесь:
source — имя источника, заданного в
sourcessource-layer — внутренний слой внутри тайлсетаtype — тип визуализации (line, fill, circle и
т.д.)Перед использованием source-layer необходимо определить
vector source:
{
"sources": {
"transportation": {
"type": "vector",
"url": "mapbox://examples.8fgz4egr"
}
}
}
Без корректного источника source-layer не имеет смысла,
так как он работает только внутри конкретного tileset.
Один источник может содержать множество логических слоёв, и каждый из них может быть отображён отдельным стилевым слоем.
{
"id": "road-major",
"type": "line",
"source": "transportation",
"source-layer": "roads",
"filter": ["==", ["get", "class"], "primary"],
"paint": {
"line-color": "#ff8800",
"line-width": 3
}
}
{
"id": "road-secondary",
"type": "line",
"source": "transportation",
"source-layer": "roads",
"filter": ["==", ["get", "class"], "secondary"],
"paint": {
"line-color": "#ffaa00",
"line-width": 2
}
}
Оба слоя используют один source-layer, но различаются
фильтрацией.
После выбора source-layer данные дополнительно
уточняются через filter.
Фильтрация позволяет:
Пример:
"filter": ["all",
["==", ["geometry-type"], "LineString"],
["has", "highway"]
]
Важно понимать: фильтр применяется после извлечения данных из source-layer.
Распространённая ошибка — путать:
layer в стиле — визуальная сущностьsource-layer — слой данных внутри тайлсетаПример различия:
// layer (стиль)
{
"id": "roads-style-layer"
}
// source-layer (данные)
"source-layer": "roads"
Один source-layer может использоваться десятками style
layers.
Одна из самых частых проблем:
"source-layer": "road" // ошибка
если в тайлсете слой называется:
roads
MapLibre GL JS не исправляет такие ошибки автоматически.
source-layer применяется только к vector
sources. В raster источниках он игнорируется.
Если поле отсутствует в тайле:
["has", "name_en"]
фильтр не вернёт ожидаемых результатов.
Векторные тайлы не всегда документируют структуру, поэтому используются:
В debug-режиме MapLibre можно увидеть доступные слои через инспекцию данных.
source-layer сам по себе не управляет масштабом, но
часто используется вместе с minzoom и
maxzoom:
{
"id": "buildings",
"type": "fill",
"source": "composite",
"source-layer": "building",
"minzoom": 14,
"paint": {
"fill-color": "#999"
}
}
Таким образом:
source-layer выбирает данныеОбработка данных происходит по цепочке:
sourcesource-layerfilterpaint, layout)Любая ошибка в source-layer обрывает цепочку на втором
шаге.
Один и тот же source-layer может быть использован для
создания сложной визуальной системы:
Пример:
{
"id": "roads-glow",
"type": "line",
"source": "transportation",
"source-layer": "roads",
"paint": {
"line-color": "#00ffff",
"line-blur": 6,
"line-width": 4
}
}
{
"id": "roads-core",
"type": "line",
"source": "transportation",
"source-layer": "roads",
"paint": {
"line-color": "#0066ff",
"line-width": 2
}
}
Такая композиция создаёт визуальную глубину без изменения данных.
Если source-layer не указан:
В отличие от многих других ошибок, это часто проявляется как «пустая карта» для конкретного слоя без диагностического сообщения.