Mapbox GL JS использует формат GeoJSON для хранения и визуализации геопространственных данных. GeoJSON является подмножеством JSON и предназначен для описания геометрических объектов, таких как точки, линии и полигоны, а также их свойств. Поскольку Mapbox GL JS напрямую работает с GeoJSON, корректность структуры JSON является критически важной для правильного отображения данных на карте.
В Mapbox GL JS источник данных добавляется через объект
map.addSource, где тип источника часто
задается как 'geojson'. Пример базового подключения
источника:
map.addSource('places', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
Если структура JSON нарушена, карта может либо не загрузить данные, либо вызвать ошибки JavaScript, что делает проверку валидности обязательной на этапе подготовки данных.
Ключевые элементы GeoJSON, которые Mapbox GL JS требует для корректной работы:
{
"type": "FeatureCollection",
"features": []
}
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.5, 50.5]
},
"properties": {
"name": "Example"
}
}
Point, LineString, Polygon,
MultiPoint, MultiLineString,
MultiPolygon, GeometryCollection.Ключевые правила:
coordinates должны быть массивами чисел. Для
Point это [долгота, широта], для
Polygon — массив массивов координат.true/false,
null.Наиболее простой способ убедиться в валидности JSON — использовать
JSON.parse:
try {
const geojson = JSON.parse(jsonString);
console.log('JSON валиден');
} catch (e) {
console.error('Ошибка JSON:', e.message);
}
Это проверяет только синтаксис, но не структуру GeoJSON.
Для проверки структуры GeoJSON применяются специализированные
библиотеки, такие как geojsonhint. Она
анализирует объект и возвращает список ошибок, если структура
некорректна:
import geojsonhint from '@mapbox/geojsonhint';
const errors = geojsonhint.hint(geojson);
if (errors.length === 0) {
console.log('Структура GeoJSON корректна');
} else {
console.error('Ошибки GeoJSON:', errors);
}
Типичные ошибки, выявляемые при проверке:
type у объекта Feature или
FeatureCollection.geometry.type не
соответствует стандарту).[долгота, широта] нарушены).features или coordinates,
что может вызвать предупреждения Mapbox GL JS.Mapbox GL JS не проверяет типы свойств объектов, поэтому важно убедиться, что данные соответствуют ожидаемым типам для стилей и фильтров:
features.forEach(feature => {
if (typeof feature.properties.name !== 'string') {
console.warn('Некорректный тип свойства name');
}
});
fetch('data.geojson')
.then(response => response.json())
.then(data => {
const errors = geojsonhint.hint(data);
if (errors.length === 0) {
map.addSource('places', { type: 'geojson', data });
} else {
console.error('Ошибки GeoJSON:', errors);
}
});
Mapbox GL JS использует стили и фильтры, основанные на свойствах Feature:
map.addLayer({
id: 'points',
type: 'circle',
source: 'places',
paint: {
'circle-radius': ['get', 'radius'],
'circle-color': ['get', 'color']
}
});
Если свойства отсутствуют или имеют неправильный тип (например,
radius — строка вместо числа), слой не отобразится
корректно.
Рекомендация: перед добавлением данных проверять соответствие всех необходимых свойств типам и диапазонам значений.
Для больших проектов полезно проверять JSON перед отправкой на фронтенд:
Любой JSON, передаваемый в Mapbox GL JS, должен пройти три уровня проверки:
Следование этим правилам предотвращает большинство ошибок при визуализации данных и позволяет строить сложные интерактивные карты без неожиданных сбоев.