Style specification определяет внешний вид карты: какие источники данных используются, как они визуализируются, в каком порядке отрисовываются слои, какие шрифты и тайлы подключаются, а также параметры освещения, переходов и 3D-эффектов. В основе лежит совместимая со спецификацией Mapbox Style Spec версия 8, реализованная в MapLibre GL JS.
Стиль описывается как JSON-документ, который интерпретируется движком рендеринга и динамически обновляется без перезагрузки карты.
Базовый объект стиля включает несколько обязательных и дополнительных полей:
{
"version": 8,
"name": "Custom Style",
"sprite": "https://example.com/sprites/sprite",
"glyphs": "https://example.com/fonts/{fontstack}/{range}.pbf",
"sources": {},
"layers": []
}
version
8name
sprite
glyphs
{fontstack} и
{range}sources
layers
Sources описывают, откуда берутся геоданные.
"sources": {
"openmaptiles": {
"type": "vector",
"url": "https://example.com/tiles.json"
}
}
Vector tiles — основной формат для современных карт, обеспечивающий высокую производительность и гибкость стилизации.
"sources": {
"satellite": {
"type": "raster",
"tiles": [
"https://example.com/tiles/{z}/{x}/{y}.png"
],
"tileSize": 256
}
}
Используется для:
"sources": {
"points": {
"type": "geojson",
"data": {
"type": "FeatureCollection",
"features": []
}
}
}
Подходит для:
Layers — центральная часть style specification. Каждый слой связывает источник данных с конкретным способом отображения.
Общая структура слоя:
{
"id": "road-layer",
"type": "line",
"source": "openmaptiles",
"source-layer": "transportation",
"paint": {},
"layout": {}
}
Используется для полигонов.
{
"id": "landuse",
"type": "fill",
"source": "openmaptiles",
"source-layer": "landuse",
"paint": {
"fill-color": "#d9d9d9",
"fill-opacity": 0.6
}
}
Применение:
Линейные объекты: дороги, границы, маршруты.
{
"id": "roads",
"type": "line",
"source": "openmaptiles",
"source-layer": "road",
"paint": {
"line-color": "#333",
"line-width": 2
}
}
Комбинированный слой для текста и иконок.
{
"id": "labels",
"type": "symbol",
"source": "openmaptiles",
"source-layer": "place",
"layout": {
"text-field": "{name}",
"text-size": 12,
"icon-image": "marker-15"
}
}
Особенности:
Точечные данные в виде кругов.
{
"id": "cities",
"type": "circle",
"source": "openmaptiles",
"source-layer": "city",
"paint": {
"circle-radius": 6,
"circle-color": "#ff0000"
}
}
3D-экструзии зданий.
{
"id": "buildings-3d",
"type": "fill-extrusion",
"source": "openmaptiles",
"source-layer": "building",
"paint": {
"fill-extrusion-color": "#aaa",
"fill-extrusion-height": ["get", "height"],
"fill-extrusion-opacity": 0.9
}
}
Используется для:
Отображение растровых тайлов.
{
"id": "satellite-layer",
"type": "raster",
"source": "satellite",
"paint": {
"raster-opacity": 0.8
}
}
Фоновый слой карты.
{
"id": "background",
"type": "background",
"paint": {
"background-color": "#f0f0f0"
}
}
Визуализация рельефа.
{
"id": "terrain",
"type": "hillshade",
"source": "terrain-source",
"paint": {
"hillshade-shadow-color": "#000000"
}
}
Используется для 3D сцены и неба.
{
"id": "sky",
"type": "sky",
"paint": {
"sky-type": "atmosphere"
}
}
Каждый слой разделяется на два блока: layout и paint.
Определяют поведение и структуру:
Пример:
"layout": {
"visibility": "visible",
"text-field": "{name}",
"text-size": 14
}
Определяют визуальное оформление:
Пример:
"paint": {
"line-color": "#ff0000",
"line-width": 3,
"line-opacity": 0.8
}
Style specification поддерживает декларативные выражения, позволяющие вычислять значения динамически.
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
5, 2,
10, 10
]
Это означает:
"line-color": [
"case",
["==", ["get", "type"], "highway"],
"#ff0000",
"#000000"
]
["get", "property_name"]
Порядок слоёв в массиве layers критически важен: рендер
выполняется сверху вниз.
Пример:
"layers": [
"background",
"landuse",
"roads",
"labels"
]
Каждый следующий слой рисуется поверх предыдущего.
Параметр transition задаёт плавность изменений стиля:
"transition": {
"duration": 300,
"delay": 0
}
Применяется к paint-параметрам:
Для 3D-слоёв доступна настройка света:
"light": {
"anchor": "map",
"color": "#ffffff",
"intensity": 0.5
}
Используется вместе с fill-extrusion для реалистичных зданий.
Terrain позволяет подключать DEM-данные:
"terrain": {
"source": "terrain-source",
"exaggeration": 1.5
}
Фильтрация данных происходит на уровне слоя:
"filter": [
"==",
["get", "class"],
"primary"
]
Поддерживаются:
{
"version": 8,
"sources": {
"osm": {
"type": "vector",
"url": "https://example.com/tiles.json"
}
},
"layers": [
{
"id": "background",
"type": "background",
"paint": {
"background-color": "#ffffff"
}
}
]
}
Стиль может обновляться во время работы карты:
map.setStyle("https://example.com/style.json");
или частично:
map.setPaintProperty("roads", "line-color", "#00ff00");
или:
map.setLayoutProperty("labels", "visibility", "none");
Style specification транслируется в WebGL:
Результат — полностью GPU-ускоренный рендеринг карт с динамической стилизацией без перерисовки DOM.