В Mapbox GL JS источники данных (sources) являются фундаментальным уровнем, на котором строится вся визуализация карты. Именно source определяет, откуда поступают географические данные, в каком формате они приходят и как они будут использоваться слоями (layers) для рендеринга.
Source — это абстракция над набором данных, которая отделяет хранение данных от их отображения. Один и тот же источник может использоваться несколькими слоями одновременно, что обеспечивает переиспользование данных без дублирования.
Структурно source описывается внутри стиля карты и всегда имеет уникальный идентификатор:
{
"sources": {
"my-source": {
"type": "geojson",
"data": "https://example.com/data.geojson"
}
}
}
Ключевым моментом является то, что source не отображается сам по себе — он только предоставляет данные слоям.
Архитектура Mapbox GL JS строится по принципу разделения ответственности:
Один source может быть использован множеством layers:
Это позволяет создавать сложные визуальные композиции без дублирования данных.
Mapbox GL JS поддерживает несколько типов источников, каждый из которых предназначен для определённого сценария работы с геоданными.
Наиболее универсальный тип источника. Используется для работы с объектами в формате GeoJSON.
{
"type": "geojson",
"data": {
"type": "FeatureCollection",
"features": []
}
}
Особенности:
Векторные тайлы — основной формат для масштабируемых карт в Mapbox.
{
"type": "vector",
"url": "mapbox://mapbox.mapbox-streets-v8"
}
или
{
"type": "vector",
"tiles": [
"https://example.com/tiles/{z}/{x}/{y}.pbf"
]
}
Особенности:
Используется для растровых тайлов (изображений).
{
"type": "raster",
"tiles": [
"https://example.com/tiles/{z}/{x}/{y}.png"
],
"tileSize": 256
}
Применяется для:
Позволяет накладывать одиночное изображение на географические координаты.
{
"type": "image",
"url": "https://example.com/image.png",
"coordinates": [
[-80, 45],
[-70, 45],
[-70, 40],
[-80, 40]
]
}
Особенности:
Источник для привязки видео к географическим координатам.
{
"type": "video",
"urls": [
"https://example.com/video.mp4"
],
"coordinates": [
[-80, 45],
[-70, 45],
[-70, 40],
[-80, 40]
]
}
Используется для:
Несмотря на различие типов, многие свойства являются общими.
Каждый source регистрируется под уникальным ключом:
map.addSource('cities', {
type: 'geojson',
data: '/data/cities.geojson'
});
Используется только в GeoJSON:
Применяется в vector sources:
"url": "mapbox://mapbox.mapbox-streets-v8"
Массив шаблонов тайлов:
"tiles": [
"https://example.com/{z}/{x}/{y}.pbf"
]
Ограничивают диапазон отображения источника:
{
"minzoom": 0,
"maxzoom": 14
}
Используется для оптимизации загрузки данных.
Определяет географические границы источника:
"bounds": [-180, -85, 180, 85]
Если камера выходит за пределы bounds, данные не загружаются.
Определяет схему тайлов:
"xyz" — стандартная Web Mercator схема"tms" — перевёрнутая схемаУказание источника данных:
"attribution": "OpenStreetMap contributors"
В Mapbox GL JS источники добавляются через метод
addSource:
map.on('load', () => {
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
});
После добавления source становится доступен для слоёв.
Привязка слоя к source осуществляется через source:
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
GeoJSON источник является динамическим и может изменяться без пересоздания слоя:
const source = map.getSource('points');
source.setData({
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [30, 50]
}
}
]
});
Это ключевой механизм для:
Vector source в Mapbox экосистеме Mapbox оптимизированы под работу с большими объёмами данных.
Особенности обработки:
Для vector и geojson источников доступна концепция feature-state:
map.setFeatureState(
{ source: 'states', id: 123 },
{ hover: true }
);
Это позволяет изменять внешний вид объектов без изменения самих данных source.
Удаление выполняется через:
map.removeSource('points');
Важно учитывать:
Наиболее частые проблемы:
Решается использованием map.on('load').
Например, попытка передать GeoJSON в vector source.
Каждый source должен иметь уникальный идентификатор.
Circle layer не может работать с raster source.
Внутренне система Mapbox GL JS обрабатывает source по следующему принципу:
Эта модель обеспечивает высокую производительность даже при сложных стилях и больших наборах данных.
Типичная структура style JSON:
{
"version": 8,
"sources": {
"cities": {
"type": "geojson",
"data": "/data/cities.geojson"
},
"roads": {
"type": "vector",
"url": "mapbox://mapbox.mapbox-streets-v8"
},
"satellite": {
"type": "raster",
"tiles": [
"https://example.com/satellite/{z}/{x}/{y}.png"
],
"tileSize": 256
}
},
"layers": []
}
Разные типы source ведут себя по-разному при zoom:
Фильтрация в layers позволяет ограничивать отображение данных из source:
filter: ['==', ['get', 'type'], 'city']
При этом сам source остаётся неизменным.
Ключевые принципы эффективной работы:
Источник проходит несколько стадий:
Эти стадии управляются внутренним state manager библиотеки Mapbox GL JS