В Mapbox GL JS метаданные представляют собой дополнительный слой информации, который описывает стиль карты, источники данных и отдельные географические объекты. Эти данные не влияют напрямую на геометрию рендеринга, но играют ключевую роль в логике отображения, фильтрации и динамического поведения карты.
Стиль карты в Mapbox GL JS описывается JSON-структурой, которая может
содержать поле metadata. Это поле используется для хранения
произвольной информации, связанной со стилем:
{
"version": 8,
"name": "Custom Style",
"metadata": {
"theme": "dark",
"createdBy": "team-map",
"revision": 3
}
}
Доступ к этим данным осуществляется через объект стиля карты:
map.getStyle().metadata
При динамической смене стиля:
map.setStyle(newStyle);
метаданные полностью заменяются вместе со стилем, так как стиль интерпретируется как единый атомарный объект.
Источники данных в Mapbox GL JS (GeoJSON, vector tiles, raster tiles) также могут нести сопутствующую информацию. Особенно это характерно для GeoJSON-источников, где свойства объектов выступают в роли прикладных метаданных.
map.addSource('cities', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [71.4304, 51.1282]
},
properties: {
name: 'City Center',
population: 1000000,
importance: 'high'
}
}
]
}
});
В данном случае properties являются метаданными объекта
и используются для:
filterpaint и layoutexpressions)Пример использования метаданных в стиле слоя:
map.addLayer({
id: 'cities-layer',
type: 'circle',
source: 'cities',
paint: {
'circle-radius': [
'interpolate',
['linear'],
['get', 'population'],
100000, 5,
1000000, 15
]
}
});
Mapbox GL JS не предоставляет отдельного API для «частичного обновления метаданных стиля», однако обновление источников позволяет изменять прикладные данные в реальном времени:
const source = map.getSource('cities');
source.setData(updatedGeojson);
Таким образом, метаданные объектов могут полностью заменяться без пересоздания слоя.
Камера в Mapbox GL JS представляет собой абстракцию, определяющую положение, масштаб и ориентацию карты. Центральная точка является ключевым параметром камеры и определяет, какая часть мира находится в фокусе отображения.
Основной метод задания центра карты:
map.setCenter([71.4304, 51.1282]);
или при инициализации:
const map = new mapboxgl.Map({
container: 'map',
center: [71.4304, 51.1282],
zoom: 10
});
Центр задаётся в формате [longitude, latitude] и
определяет географическую точку, которая проецируется в центр
viewport.
Получение текущего центра:
map.getCenter();
возвращает объект LngLat.
Для плавного изменения центра используются методы камеры:
map.easeTo({
center: [71.4304, 51.1282],
duration: 1500
});
или:
map.flyTo({
center: [71.4304, 51.1282],
zoom: 12
});
Разница заключается в характере движения:
easeTo — плавная интерполяция без географической
траекторииflyTo — анимация с «полётом» по дуге сферыОдним из наиболее важных механизмов центрирования является автоматическое вписывание области в экран:
map.fitBounds([
[71.0, 51.0],
[72.0, 52.0]
]);
Алгоритм вычисляет:
Дополнительные параметры:
map.fitBounds(bounds, {
padding: 40,
maxZoom: 14,
duration: 1000
});
padding влияет на смещение области внутри экрана,
обеспечивая визуальные отступы.
Внутреннее представление камеры хранится в объекте трансформации:
map.transform.center
Этот центр используется для расчёта:
Mapbox GL JS использует проекцию Web Mercator, где центр влияет на развертку всей сцены.
Центр может быть смещён относительно геометрического центра viewport:
map.easeTo({
center: [71.4304, 51.1282],
offset: [100, 0]
});
Параметр offset позволяет компенсировать UI-элементы или
создавать эффект «смещённой камеры».
Для предотвращения выхода камеры за пределы заданной области используется ограничение:
map.setMaxBounds([
[70.0, 50.0],
[73.0, 53.0]
]);
Это влияет на все операции центрирования, включая:
setCenterflyTofitBoundsКамера автоматически корректирует координаты, чтобы они оставались внутри допустимого прямоугольника.
Центр всегда рассматривается совместно с zoom, pitch и bearing:
map.setCenter([71.4304, 51.1282]);
map.setZoom(11);
map.setBearing(30);
map.setPitch(45);
Каждый параметр влияет на итоговую композицию:
zoom определяет масштаб отображенияbearing задаёт поворот картыpitch вводит перспективное наклонениеЦентр при этом остаётся фиксированной географической точкой, вокруг которой происходит трансформация сцены.
Преобразование между географическими и экранными координатами:
map.project([71.4304, 51.1282]);
возвращает пиксельные координаты относительно viewport.
Обратное преобразование:
map.unproject([x, y]);
Эти операции зависят от текущего центра камеры, так как именно он определяет матрицу преобразования.
В отличие от географического центра, экранный центр всегда фиксирован:
const screenCenter = [
map.getCanvas().width / 2,
map.getCanvas().height / 2
];
Однако его географический аналог меняется при каждом изменении камеры.
При значительных значениях bearing и использовании
wrap-around координат центр может переходить через границы меридиана.
Mapbox GL JS нормализует координаты, сохраняя непрерывность сцены:
Это позволяет сохранять стабильную камеру даже при полном обороте карты.