В Mapbox GL JS работа с данными строится вокруг концепции источников (sources) и слоёв (layers). Источник данных определяет, откуда и в каком формате поступает информация, а слой отвечает за визуализацию этой информации на карте.
Базовая модель выглядит так: сначала в карту добавляется источник
через addSource, затем на основе этого источника создаётся
один или несколько слоёв через addLayer. Такая архитектура
позволяет повторно использовать один набор данных для разных визуальных
представлений.
Наиболее универсальный формат — GeoJSON. Он используется для хранения точечных, линейных и полигональных данных.
map.on('load', () => {
map.addSource('cities', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [69.2401, 41.2995]
},
properties: {
name: 'Tashkent'
}
}
]
}
});
});
GeoJSON-источник может быть:
Особенность GeoJSON — полная гибкость, но при больших объёмах данных возможны ограничения производительности.
Векторные тайлы — основной формат для масштабируемых карт. Они разбивают данные на квадраты (tiles), что позволяет загружать только видимую часть.
map.addSource('streets', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8'
});
Векторные источники обеспечивают:
В экосистеме Mapbox именно векторные тайлы являются стандартом для базовых карт.
Растровые тайлы используются для изображений (например, спутниковых снимков).
map.addSource('satellite', {
type: 'raster',
url: 'mapbox://mapbox.satellite',
tileSize: 256
});
Этот тип источника не позволяет менять стили объектов, так как данные уже представлены в виде изображений.
Используется для наложения одного изображения на карту с привязкой к координатам.
map.addSource('overlay', {
type: 'image',
url: '/overlay.png',
coordinates: [
[69.0, 41.4],
[69.3, 41.4],
[69.3, 41.2],
[69.0, 41.2]
]
});
Подходит для:
Позволяет накладывать видео на географическую область.
map.addSource('drone-video', {
type: 'video',
urls: ['video.mp4'],
coordinates: [
[69.0, 41.4],
[69.3, 41.4],
[69.3, 41.2],
[69.0, 41.2]
]
});
Метод addSource является центральной точкой интеграции
данных.
map.addSource('points', {
type: 'geojson',
data: '/data/points.geojson'
});
Особенности:
setDataconst source = map.getSource('points');
source.setData(newGeojson);
GeoJSON-источники поддерживают обновление без перезагрузки карты.
Типичный сценарий — получение данных с сервера:
async function updateData() {
const res = await fetch('/api/points');
const geojson = await res.json();
map.getSource('points').setData(geojson);
}
Это позволяет реализовывать:
Для больших наборов точек используется кластеризация:
map.addSource('earthquakes', {
type: 'geojson',
data: '/earthquakes.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Кластеры позволяют:
Слой кластеров обычно строится в несколько уровней:
Часто данные приходят в формате CSV или JSON API. Их необходимо преобразовать:
function csvToGeoJSON(rows) {
return {
type: 'FeatureCollection',
features: rows.map(row => ({
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [parseFloat(row.lng), parseFloat(row.lat)]
},
properties: row
}))
};
}
После преобразования данные подключаются как обычный GeoJSON-источник.
Mapbox GL JS поддерживает загрузку данных напрямую по URL:
map.addSource('places', {
type: 'geojson',
data: 'https://example.com/data.geojson'
});
При этом важно учитывать:
Для больших файлов предпочтительнее использовать векторные тайлы.
Векторный источник может содержать несколько слоёв данных:
map.addSource('composite', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8'
});
При создании слоя указывается конкретный подслой:
map.addLayer({
id: 'road-layer',
type: 'line',
source: 'composite',
'source-layer': 'road'
});
Хотя источник хранит данные целиком, фильтрация выполняется в слоях:
map.addLayer({
id: 'filtered-points',
type: 'circle',
source: 'points',
filter: ['==', ['get', 'type'], 'restaurant']
});
Фильтры позволяют:
Источники можно удалять и заменять:
if (map.getSource('points')) {
map.removeSource('points');
}
Это используется при:
При работе с большими наборами данных критично учитывать:
Рекомендуемые практики:
В некоторых сценариях данные поступают непрерывно:
const source = map.getSource('stream');
socket.on('message', (msg) => {
const data = JSON.parse(msg);
source.setData(data);
});
Такая архитектура применяется в:
Источники часто формируются на основе API-запросов:
fetch('/api/locations')
.then(res => res.json())
.then(data => {
map.getSource('locations').setData(data);
});
При проектировании важно учитывать:
В Mapbox GL JS вся система импорта данных сводится к трём уровням:
Эта модель позволяет строить масштабируемые геоинформационные приложения различной сложности — от простых карт точек до высоконагруженных аналитических систем.