В основе работы с пространственными данными в Mapbox GL JS лежит
формат GeoJSON. Он определяет стандартизированную структуру для описания
географических объектов и их свойств. Центральным контейнером для
большинства наборов данных выступает FeatureCollection.
FeatureCollection — это объект верхнего уровня,
объединяющий множество геометрических сущностей (Feature) в
единый набор данных, который может быть передан в источник
(source) карты.
Базовая структура:
{
"type": "FeatureCollection",
"features": []
}
Каждый элемент массива features представляет собой
объект Feature, включающий геометрию и свойства.
Feature в GeoJSON связывает три ключевых компонента:
type: всегда "Feature"geometry: описание геометрии объектаproperties: пользовательские данные, связанные с
объектомПример:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [90.0, 55.0]
},
"properties": {
"name": "Точка интереса",
"category": "landmark"
}
}
FeatureCollection агрегирует множество
Feature, позволяя Mapbox GL JS работать с ними как с единым
источником данных:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [90.0, 55.0]
},
"properties": {
"id": 1
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [91.0, 56.0]
},
"properties": {
"id": 2
}
}
]
}
В Mapbox GL JS поддерживаются все стандартные типы геометрий GeoJSON. Каждая геометрия определяет форму объекта на карте.
Одиночная точка на карте.
{
"type": "Point",
"coordinates": [longitude, latitude]
}
Используется для маркеров, объектов интереса, событий.
Ломаная линия, состоящая из последовательности координат.
{
"type": "LineString",
"coordinates": [
[lng1, lat1],
[lng2, lat2],
[lng3, lat3]
]
}
Применяется для маршрутов, дорог, траекторий движения.
Многоугольник, описывающий замкнутую область.
{
"type": "Polygon",
"coordinates": [
[
[lng1, lat1],
[lng2, lat2],
[lng3, lat3],
[lng1, lat1]
]
]
}
Первый и последний координатный элемент должны совпадать, формируя замкнутый контур.
Набор точек как единый объект.
{
"type": "MultiPoint",
"coordinates": [
[lng1, lat1],
[lng2, lat2]
]
}
Используется для групп маркеров или кластерных данных.
Набор линий.
{
"type": "MultiLineString",
"coordinates": [
[
[lng1, lat1],
[lng2, lat2]
],
[
[lng3, lat3],
[lng4, lat4]
]
]
}
Применяется для разветвлённых маршрутов или сетей.
Набор полигонов.
{
"type": "MultiPolygon",
"coordinates": [
[
[
[lng1, lat1],
[lng2, lat2],
[lng3, lat3],
[lng1, lat1]
]
],
[
[
[lng4, lat4],
[lng5, lat5],
[lng6, lat6],
[lng4, lat4]
]
]
]
}
Используется для регионов с несколькими отдельными зонами.
Коллекция различных геометрий внутри одного объекта.
{
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [90.0, 55.0]
},
{
"type": "LineString",
"coordinates": [
[90.0, 55.0],
[91.0, 56.0]
]
}
]
}
В Mapbox GL JS GeoJSON передаётся через источник типа
geojson.
map.on('load', () => {
map.addSource('points-source', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [90.0, 55.0]
},
properties: {
title: 'Объект 1'
}
}
]
}
});
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points-source',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
});
GeoJSON-источник можно динамически обновлять через
setData. Это ключевой механизм для интерактивных
приложений.
const source = map.getSource('points-source');
source.setData({
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [92.0, 56.0]
},
properties: {
title: 'Обновлённый объект'
}
}
]
});
При вызове setData Mapbox пересчитывает отображение слоя
без необходимости пересоздания источника.
properties внутри Feature не влияют на
геометрию, но активно используются в стилях слоёв:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [90.0, 55.0]
},
"properties": {
"population": 120000,
"category": "city"
}
}
Использование в стиле слоя:
map.addLayer({
id: 'cities',
type: 'circle',
source: 'cities-source',
paint: {
'circle-radius': [
'interpolate',
['linear'],
['get', 'population'],
1000, 4,
1000000, 12
],
'circle-color': [
'match',
['get', 'category'],
'city', '#1f78b4',
'town', '#33a02c',
'#999999'
]
}
});
FeatureCollection должен сохранять строгую структуру:
featuresFeature[longitude, latitude]Частые ошибки:
При работе с большими наборами данных в Mapbox GL JS критичны:
Feature в одном источникеsetDataОптимизационные подходы:
cluster: trueПример кластеризации:
map.addSource('earthquakes', {
type: 'geojson',
data: '/data/earthquakes.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Геометрия в FeatureCollection определяет не только форму объектов, но и способ их рендеринга:
Point → символы, круги, иконкиLineString → линии, маршруты, дорогиPolygon → заливки, границы территорийСвязка геометрии и стиля слоя в Mapbox GL JS является декларативной: геометрия описывает структуру, слой — визуальное поведение.
Все координаты GeoJSON используют WGS84:
[longitude, latitude]
Нарушение этого порядка приводит к смещению объектов на тысячи километров или их исчезновению из видимой области карты.
FeatureCollection активно используется в обработчиках событий карты:
map.on('click', 'points-layer', (e) => {
const feature = e.features[0];
console.log(feature.properties.title);
});
Каждый Feature становится интерактивным объектом,
доступным через события click, mouseenter,
mouseleave.
FeatureCollection часто формируется программно:
const points = [];
for (let i = 0; i < 100; i++) {
points.push({
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [
90 + Math.random(),
55 + Math.random()
]
},
properties: {
id: i
}
});
}
const featureCollection = {
type: 'FeatureCollection',
features: points
};
Такая генерация используется для симуляций, аналитики и визуализации потоковых данных.