Визуальный слой типа extrusion в Mapbox GL JS используется для преобразования плоских полигонов в трёхмерные объекты. Этот подход применяется для отображения зданий, территорий, зон плотности, геологических структур и любых других данных, где важна высота или объём.
Слой реализуется через тип fill-extrusion, который
работает только с полигональными геометриями и опирается на числовые
атрибуты высоты и базового уровня.
Слой добавляется через конфигурацию addLayer, где
ключевым параметром является type: "fill-extrusion".
map.addLayer({
id: "buildings-3d",
type: "fill-extrusion",
source: "buildings",
"source-layer": "building",
paint: {
"fill-extrusion-color": "#aaa",
"fill-extrusion-height": 30,
"fill-extrusion-base": 0,
"fill-extrusion-opacity": 0.8
}
});
Ключевая особенность такого слоя заключается в том, что он интерпретирует каждый полигон как вертикально экструдированную форму, где высота задаётся явно или извлекается из данных.
Поддерживаются два основных типа источников:
GeoJSON
map.addSource("zones", {
type: "geojson",
data: {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [
[
[30, 50],
[30.01, 50],
[30.01, 50.01],
[30, 50.01],
[30, 50]
]
]
},
properties: {
height: 100
}
}
]
}
});
Vector tiles
Чаще используется для городских данных, например зданий. Векторные тайлы обеспечивают производительность и масштабируемость при больших объёмах информации.
map.addSource("composite", {
type: "vector",
url: "mapbox://mapbox.3d-buildings"
});
Параметр fill-extrusion-height задаёт итоговую высоту
объекта. Значение может быть:
"fill-extrusion-height": ["get", "height"]
При отсутствии данных слой будет отображаться как плоская поверхность.
Параметр fill-extrusion-base задаёт нижнюю границу
экструдированного объекта. Он позволяет создавать многоуровневые
структуры и учитывать здания на подиумах или перепадах рельефа.
"fill-extrusion-base": ["get", "min_height"]
При комбинации base и height формируется
полноценный объём:
Параметр fill-extrusion-color поддерживает статические
значения и выражения.
"fill-extrusion-color": [
"interpolate",
["linear"],
["get", "height"],
0, "#2c7bb6",
50, "#abd9e9",
100, "#fdae61",
200, "#d7191c"
]
Такой подход позволяет визуально кодировать высоту, плотность или функциональное назначение объектов.
Параметр fill-extrusion-opacity регулирует прозрачность
слоя.
"fill-extrusion-opacity": 0.6
Значения ниже 1.0 позволяют:
Extrusion-слои часто включаются только при определённом уровне увеличения карты.
"minzoom": 14
Это важно для производительности, поскольку 3D-рендеринг значительно дороже 2D-отображения.
Mapbox GL JS активно использует выражения для управления визуализацией.
"fill-extrusion-height": [
"*",
["get", "levels"],
3
]
"fill-extrusion-color": [
"case",
[">", ["get", "height"], 100],
"#ff0000",
"#00ff00"
]
"fill-extrusion-height": [
"interpolate",
["linear"],
["zoom"],
10, 0,
15, 100,
20, 300
]
Такой подход позволяет создавать адаптивные 3D-сцены, меняющиеся при масштабировании.
Mapbox GL JS использует глобальные параметры света, влияющие на extrusion:
map.setLight({
anchor: "map",
color: "white",
intensity: 0.6
});
Освещение влияет на:
Работа с fill-extrusion требует учёта ограничений WebGL.
Основные принципы оптимизации:
1. Использование векторных тайлов вместо GeoJSON GeoJSON подходит для малых наборов данных, но не масштабируется.
2. Ограничение zoom-диапазона
minzoom: 14,
maxzoom: 20
3. Упрощение геометрии Сложные полигоны увеличивают нагрузку на GPU.
4. Минимизация выражений Сложные цепочки interpolation и case влияют на производительность.
Extrusion часто используется вместе с:
background для контраста сценыline для границ кварталовsymbol для подписей зданийfill для базовых зонПорядок слоёв критически важен, так как extrusion перекрывает 2D-слои.
Отсутствие base при наличии height Приводит к визуальным артефактам при рельефных данных.
Использование слишком больших значений высоты Нарушает масштаб сцены и перспективу.
Применение GeoJSON для больших городов Резко снижает FPS и приводит к лагам.
Отсутствие minzoom 3D-слой перегружает карту на низких масштабах.
Во многих картах используется слой зданий из готовых векторных тайлов. Такие наборы обычно содержат:
Эти данные позволяют строить реалистичные 3D-модели городской среды без дополнительной обработки геометрии на стороне клиента.
Extrusion раскрывается полностью только при использовании pitch и bearing:
map.setPitch(60);
map.setBearing(-20);
Без наклона карта остаётся в псевдо-3D режиме, где эффект высоты минимален.
Фильтры позволяют ограничивать отображение объектов:
"filter": ["==", ["get", "type"], "residential"]
или по диапазону высот:
"filter": [">", ["get", "height"], 50]
Это полезно для тематической визуализации городской застройки.
Extrusion-слои могут менять поведение в зависимости от масштаба:
"fill-extrusion-height": [
"interpolate",
["exponential", 1.5],
["zoom"],
14, 0,
16, ["get", "height"]
]
В основе rendering лежит WebGL, поэтому:
Большое количество вершин увеличивает нагрузку на GPU, что особенно заметно при плотной застройке.
При построении 3D-карты города обычно комбинируются:
Такая композиция формирует многослойную сцену, где extrusion отвечает за вертикальную структуру среды.