MapLibre GL JS использует стиль-спецификацию, совместимую с Mapbox Style Specification v8, однако при миграции важно учитывать не только формальную совместимость JSON-структуры, но и различия в экосистеме источников данных, лицензирования и поддерживаемых URL-эндпоинтов.
Стиль в MapLibre GL JS представляет собой JSON-документ, описывающий:
Ключевой принцип миграции — сохранение структуры стиля при замене инфраструктурных зависимостей, таких как тайловые серверы, шрифты и спрайты.
Большинство стилей, созданных для Mapbox GL JS, формально совместимы с MapLibre GL JS, но требуют проверки следующих аспектов:
Типы источников:
Типичная проблема миграции — использование Mapbox-specific URL:
"source": {
"type": "vector",
"url": "mapbox://mapbox.mapbox-streets-v8"
}
После миграции требуется заменить на:
"source": {
"type": "vector",
"tiles": [
"https://tiles.example.com/streets/{z}/{x}/{y}.pbf"
],
"minzoom": 0,
"maxzoom": 14
}
Важно: MapLibre не интерпретирует mapbox:// без внешнего
резолвера.
Наиболее критический этап — замена всех Mapbox-URL схем:
Пример замены vector tiles:
"sources": {
"cities": {
"type": "vector",
"tiles": [
"https://tiles.myserver.org/cities/{z}/{x}/{y}.pbf"
]
}
}
Спрайты содержат иконки и графические элементы стиля.
"sprite": "mapbox://sprites/user/style"
"sprite": "https://cdn.myserver.org/sprites/sprite"
MapLibre ожидает два файла:
.json.pngПример структуры:
sprite.png
sprite.json
sprite@2x.png
sprite@2x.json
Критически важно сохранить согласованность именования, так как
механизм ретина-дисплеев зависит от суффикса @2x.
Шрифты — один из самых частых источников ошибок при переносе.
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
"glyphs": "https://fonts.myserver.org/{fontstack}/{range}.pbf"
Особенности:
{fontstack} — список через запятую{range} — диапазон Unicode-глифов.pbf файлы в формате PBF
glyphsПри отсутствии корректного glyph endpoint текстовые слои отображаются пустыми.
Структура слоёв в MapLibre GL JS полностью соответствует спецификации Mapbox Style, однако важно учитывать нюансы выражений.
{
"id": "population",
"type": "fill",
"source": "cities",
"paint": {
"fill-color": "#ff0000",
"fill-opacity": 0.6
}
}
Этот слой переносится без изменений.
MapLibre поддерживает выражения:
Пример:
"fill-color": [
"interpolate",
["linear"],
["get", "population"],
0, "#2DC4B2",
1000000, "#FCA107",
5000000, "#F7555D"
]
При миграции важно:
Одним из ключевых этапов является устранение зависимостей от
mapbox://.
| Mapbox URI | MapLibre-эквивалент |
|---|---|
| mapbox://tileset | https://…/tiles/{z}/{x}/{y}.pbf |
| mapbox://sprites | https://…/sprite |
| mapbox://fonts | https://…/fonts/{fontstack}/{range}.pbf |
"satellite": {
"type": "raster",
"tiles": [
"https://tiles.server.org/satellite/{z}/{x}/{y}.jpg"
],
"tileSize": 256
}
"terrain": {
"source": "dem",
"exaggeration": 1.5
}
DEM-источники требуют строго корректного формата RGB terrain tiles.
Перед использованием в MapLibre GL JS рекомендуется проверять:
Типичные ошибки:
GeoJSON источники не требуют изменений формата:
"earthquakes": {
"type": "geojson",
"data": "https://data.server.org/earthquakes.json"
}
Однако важно учитывать:
Некоторые стили используют расширения Mapbox, которые не поддерживаются напрямую:
Такие конструкции требуют:
После миграции стиль подключается стандартным способом:
import maplibregl from "maplibre-gl";
const map = new maplibregl.Map({
container: "map",
style: "https://styles.myserver.org/basic-style.json",
center: [37.6173, 55.7558],
zoom: 10
});
Важно учитывать:
Причины:
Причины:
Причины:
При больших стилях применяется поэтапный подход:
Такая последовательность минимизирует риск полного отказа рендеринга.
После перехода на MapLibre GL JS обычно требуется:
Особенно важна оптимизация vector tiles, так как именно они формируют основную нагрузку на рендерер.