В Mapbox GL JS источники данных (sources) определяют, откуда и в каком формате карта получает географическую информацию. Архитектура источников построена вокруг концепции разделения данных и их визуализации: источник описывает данные, слой (layer) отвечает за их отображение. Такое разделение позволяет гибко комбинировать разные типы данных в одной сцене, оптимизировать загрузку и управлять производительностью.
Каждый источник в стиле описывается как объект с уникальным идентификатором и типом:
{
"id": "my-source",
"type": "geojson",
"data": "https://example.com/data.geojson"
}
Ключевые характеристики:
Источники объявляются внутри map.addSource() или в
JSON-стиле карты.
map.addSource('cities', {
type: 'geojson',
data: '/data/cities.geojson'
});
GeoJSON — один из наиболее часто используемых форматов для пользовательских данных.
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [66.9237, 48.0196]
},
properties: {
name: 'Example point'
}
}
]
}
});
GeoJSON источник поддерживает кластеризацию, что особенно важно для больших наборов точек:
map.addSource('earthquakes', {
type: 'geojson',
data: '/earthquakes.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Кластеризация снижает нагрузку на рендеринг и улучшает производительность при работе с тысячами объектов.
Vector tiles — основной формат для масштабируемых карт. Он используется для слоёв дорог, зданий, административных границ и других больших наборов данных.
map.addSource('streets', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8'
});
или через шаблон тайлов:
map.addSource('custom-vector', {
type: 'vector',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.pbf'
],
minzoom: 0,
maxzoom: 14
});
Vector источники являются основой большинства профессиональных картографических решений.
Raster sources представляют собой растровые тайлы — готовые изображения карты.
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://example.com/satellite/{z}/{x}/{y}.png'
],
tileSize: 256
});
Raster-слои используются для спутниковых снимков, тепловых карт и фоновых изображений.
Raster DEM (Digital Elevation Model) используется для отображения высот и построения 3D-террейна.
map.addSource('terrain', {
type: 'raster-dem',
url: 'mapbox://mapbox.terrain-rgb',
tileSize: 512,
maxzoom: 14
});
Пример включения террейна:
map.setTerrain({ source: 'terrain', exaggeration: 1.5 });
Image source позволяет наложить одно растровое изображение на географические координаты.
map.addSource('overlay', {
type: 'image',
url: '/images/overlay.png',
coordinates: [
[66.9, 48.1],
[67.2, 48.1],
[67.2, 47.8],
[66.9, 47.8]
]
});
Video source используется для отображения видео как географического слоя.
map.addSource('drone-video', {
type: 'video',
urls: [
'https://example.com/video.mp4',
'https://example.com/video.webm'
],
coordinates: [
[66.9, 48.1],
[67.2, 48.1],
[67.2, 47.8],
[66.9, 47.8]
]
});
Canvas source позволяет использовать HTML5 canvas как динамический источник данных.
map.addSource('animated-canvas', {
type: 'canvas',
canvas: 'myCanvasId',
animate: true,
coordinates: [
[66.9, 48.1],
[67.2, 48.1],
[67.2, 47.8],
[66.9, 47.8]
]
});
GeoJSON-источники могут обновляться динамически:
const source = map.getSource('points');
source.setData({
type: 'FeatureCollection',
features: []
});
Для vector и raster источников данные обновляются через изменение стиля или тайлового URL.
Архитектура источников напрямую влияет на производительность:
Источники не отображаются напрямую. Они становятся видимыми только через слои:
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Один источник может использоваться несколькими слоями одновременно, что позволяет переиспользовать данные без дублирования.