Источники данных в Mapbox GL JS являются фундаментальным уровнем архитектуры карты. Именно источники определяют, какие данные доступны для визуализации, как они загружаются, обновляются и связываются со слоями. Вся графическая модель карты строится вокруг связки «source → layer», где источник отвечает за данные, а слой — за их отображение.
Источники представляют собой абстракцию над различными форматами геоданных: GeoJSON, векторные тайлы, растровые изображения, DEM-данные и мультимедийные источники. Каждый источник имеет собственный тип, структуру и способ загрузки.
Ключевые особенности источников:
Добавление источников выполняется через метод
map.addSource, который регистрирует объект источника в
стиле карты.
map.on('load', () => {
map.addSource('cities', {
type: 'geojson',
data: '/data/cities.geojson'
});
});
После добавления источник становится доступным для всех слоёв текущего стиля.
GeoJSON — наиболее часто используемый тип источника. Он подходит для точечных, линейных и полигональных данных, а также для динамически обновляемых объектов.
map.addSource('parks', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Polygon',
coordinates: [
[
[71.4, 51.1],
[71.5, 51.1],
[71.5, 51.2],
[71.4, 51.2],
[71.4, 51.1]
]
]
},
properties: {
name: 'Central Park'
}
}
]
}
});
Источник можно обновлять без удаления:
const source = map.getSource('parks');
source.setData('/data/updated_parks.geojson');
Это особенно важно для real-time приложений.
GeoJSON поддерживает встроенную кластеризацию точек:
map.addSource('earthquakes', {
type: 'geojson',
data: '/data/earthquakes.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Кластеры формируются на стороне клиента и уменьшают нагрузку на рендеринг.
Векторные источники основаны на тайлах и используются для больших наборов данных.
map.addSource('streets', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8'
});
Векторный источник содержит несколько слоёв данных внутри тайла. Для
доступа используется параметр source-layer.
map.addLayer({
id: 'road-lines',
type: 'line',
source: 'streets',
'source-layer': 'road',
paint: {
'line-color': '#333',
'line-width': 2
}
});
Растровые источники используются для тайлов изображений: спутниковые снимки, карты, сканы.
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.png'
],
tileSize: 256
});
map.addLayer({
id: 'satellite-layer',
type: 'raster',
source: 'satellite'
});
Raster DEM используется для работы с высотами и 3D-рельефом.
map.addSource('terrain', {
type: 'raster-dem',
url: 'mapbox://mapbox.mapbox-terrain-dem-v1',
tileSize: 512,
maxzoom: 14
});
Применение:
map.setTerrain({
source: 'terrain',
exaggeration: 1.5
});
Этот тип источника позволяет формировать трёхмерную поверхность карты.
Image source используется для привязки одного изображения к координатам на карте.
map.addSource('overlay', {
type: 'image',
url: '/images/overlay.png',
coordinates: [
[71.0, 51.0],
[72.0, 51.0],
[72.0, 52.0],
[71.0, 52.0]
]
});
Применяется для:
Video source позволяет отображать видеопоток на географической области.
map.addSource('drone-video', {
type: 'video',
urls: [
'https://example.com/video.mp4'
],
coordinates: [
[71.0, 51.0],
[72.0, 51.0],
[72.0, 52.0],
[71.0, 52.0]
]
});
Используется в системах мониторинга, трансляциях и аналитике.
Ограничивает область загрузки данных:
map.addSource('restricted', {
type: 'geojson',
data: '/data.json',
bounds: [71, 51, 72, 52]
});
Определяют диапазон масштабов:
map.addSource('zoomed', {
type: 'vector',
url: 'mapbox://example.data',
minzoom: 5,
maxzoom: 14
});
Используется для указания уникального идентификатора объектов:
map.addSource('places', {
type: 'geojson',
data: '/places.geojson',
promoteId: 'id'
});
Это улучшает работу с feature-state.
Источник сам по себе не отображается на карте. Он становится видимым только через слой:
map.addLayer({
id: 'parks-fill',
type: 'fill',
source: 'parks',
paint: {
'fill-color': '#00ff00',
'fill-opacity': 0.4
}
});
Один источник может использоваться несколькими слоями:
map.addLayer({ id: 'parks-border', type: 'line', source: 'parks' });
map.addLayer({ id: 'parks-fill', type: 'fill', source: 'parks' });
Удаление:
map.removeSource('parks');
Обновление данных:
map.getSource('parks').setData(newData);
Важно учитывать, что удаление источника автоматически удаляет все связанные слои.
Использование источников требует учета нескольких факторов:
Источники формируют базовый слой данных, на котором строится вся визуальная логика карты, определяя масштабируемость и гибкость приложения.