Работа с данными в экосистеме Mapbox строится вокруг строгой модели источников (sources) и слоёв (layers), где данные отделены от визуального представления. Такая архитектура позволяет переиспользовать одни и те же данные в разных стилях, динамически обновлять отображение и эффективно работать с большими объёмами геоинформации.
Основная концепция заключается в том, что все данные приводятся к унифицированным форматам, после чего передаются в карту через источники. Каждый источник описывает структуру данных, а слой отвечает за их визуализацию.
В Mapbox GL JS данные добавляются через метод
map.addSource, где каждый источник имеет тип и набор
параметров.
Основные типы источников:
geojsonvectorrasterimagevideoБазовая структура источника:
map.addSource('cities', {
type: 'geojson',
data: 'https://example.com/cities.geojson'
});
Или с инлайновыми данными:
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
Ключевая особенность формата — строгая типизация источника. Тип определяет, как Mapbox будет интерпретировать и индексировать данные.
GeoJSON является центральным форматом для пользовательских данных. Он описывает географические объекты в виде структур JSON.
Базовые элементы GeoJSON:
FeatureCollection — коллекция объектовFeature — объект с геометрией и свойствамиGeometry — геометрия (Point, LineString, Polygon и
др.)Пример корректного GeoJSON:
{
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [71.4304, 51.1281]
},
properties: {
name: "Astana",
population: 1200000
}
}
]
}
[longitude, latitude]propertiesЭта структура позволяет Mapbox эффективно индексировать и фильтровать данные на уровне GPU.
Векторные тайлы (vector tiles) представляют данные в
виде предварительно разрезанных и оптимизированных фрагментов.
Пример подключения векторного источника:
map.addSource('roads', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8'
});
Векторные данные:
Форматирование данных для векторных тайлов происходит на этапе подготовки датасета, а не в браузере.
Растровые источники используют изображения, разбитые на тайлы.
map.addSource('satellite', {
type: 'raster',
url: 'mapbox://mapbox.satellite',
tileSize: 256
});
Особенности:
Форматирование здесь заключается в правильной организации тайловой структуры и уровней масштабирования.
Image source позволяет накладывать одно изображение на заданный географический прямоугольник.
map.addSource('overlay', {
type: 'image',
url: 'https://example.com/image.png',
coordinates: [
[71.0, 51.5],
[72.0, 51.5],
[72.0, 50.5],
[71.0, 50.5]
]
});
Форматирование данных здесь сводится к точному заданию геопривязки:
Video source работает аналогично image, но с поддержкой мультимедиа потока.
map.addSource('drone-video', {
type: 'video',
urls: ['https://example.com/video.mp4'],
coordinates: [
[71.0, 51.5],
[72.0, 51.5],
[72.0, 50.5],
[71.0, 50.5]
]
});
Особенности форматирования:
Вся семантика данных хранится в properties. Эти свойства
используются для фильтрации, стилизации и интерактивности.
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [71.4, 51.1]
},
properties: {
type: "restaurant",
rating: 4.8,
name: "Central Cafe"
}
}
Форматирование properties:
Данные становятся визуально значимыми только после привязки к слою.
map.addLayer({
id: 'city-points',
type: 'circle',
source: 'cities',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Слой определяет:
Mapbox GL JS поддерживает выражения, позволяющие связывать свойства данных со стилями.
paint: {
'circle-radius': ['interpolate', ['linear'], ['get', 'population'], 1000, 4, 1000000, 20]
}
Форматирование данных становится критически важным:
Feature State позволяет хранить временные данные, не изменяя GeoJSON.
map.setFeatureState(
{ source: 'cities', id: 1 },
{ hover: true }
);
Особенности форматирования:
При работе с большими наборами точек применяется кластеризация:
map.addSource('earthquakes', {
type: 'geojson',
data: '/earthquakes.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Форматирование данных:
Данные могут быть изменены без пересоздания источника:
const source = map.getSource('cities');
source.setData({
type: 'FeatureCollection',
features: updatedFeatures
});
При этом важно соблюдать:
Эффективное форматирование данных напрямую влияет на производительность.
Рекомендуемые практики:
В высоконагруженных приложениях форматирование переносится в backend:
Такой подход снижает нагрузку на браузер и ускоряет отрисовку.
Каждый формат данных в Mapbox GL JS соответствует определённой модели отображения:
Единообразие достигается через строгую структуру источников и предсказуемую модель свойств, что позволяет строить сложные интерактивные карты без потери производительности.