В экосистеме Mapbox GL JS под объектами (features) обычно понимаются элементы пространственных данных формата GeoJSON, которые отображаются на карте как геометрия с набором атрибутов. Эти атрибуты называются свойствами объектов (feature properties) и представляют собой обычные пары ключ–значение, встроенные в описание геометрии.
Структура GeoJSON-фичи включает три ключевых компонента:
type, geometry и properties.
Именно properties является центральным контейнером
пользовательских данных, которые затем используются в стилизации,
фильтрации и логике отображения.
Классическая схема:
geometry — координаты и тип геометрии (Point,
LineString, Polygon)properties — словарь атрибутовtype: "Feature" — обозначение GeoJSON-объектаПример:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [71.4304, 51.1284]
},
"properties": {
"name": "Astana Center",
"population": 120000,
"category": "capital"
}
}
В Mapbox GL JS свойства объектов выступают основой для data-driven styling — подхода, при котором внешний вид слоёв определяется не статическими значениями, а данными конкретных объектов.
Свойства используются в следующих контекстах:
paint и layout свойства
слоёв)filter)Ключевая особенность заключается в том, что свойства не являются частью геометрии, но тесно связаны с ней логически и визуально.
Mapbox GL JS предоставляет несколько механизмов доступа к
properties после загрузки данных на карту.
Метод queryRenderedFeatures возвращает массив объектов,
попадающих в заданную область экрана. Каждый объект содержит
properties.
map.on('click', (e) => {
const features = map.queryRenderedFeatures(e.point);
features.forEach(f => {
console.log(f.properties.name);
});
});
Каждый элемент результата — это расширенная версия GeoJSON feature,
дополненная служебными полями (например, layer,
source).
В отличие от рендеренных объектов, этот метод работает напрямую с источником данных:
const features = map.querySourceFeatures('cities');
features.forEach(f => {
console.log(f.properties.population);
});
Здесь возвращаются все фичи из источника, независимо от текущего масштаба и фильтров слоя.
Одной из ключевых возможностей Mapbox GL JS является привязка визуальных свойств к данным через выражения.
'circle-radius': [
'interpolate',
['linear'],
['get', 'population'],
1000, 4,
1000000, 20
]
Здесь свойство population управляет размером круга: чем
больше значение, тем больше радиус.
Функция get извлекает значение свойства объекта:
'fill-color': [
'case',
['==', ['get', 'category'], 'capital'],
'#ff0000',
'#00ff00'
]
В этом случае цвет зависит от значения category.
Свойства могут использоваться в условиях:
'filter': ['>=', ['get', 'population'], 50000]
Фильтр оставляет только объекты, у которых население больше или равно 50 000.
Свойства могут содержать различные типы данных:
Используются для категорий, названий и идентификаторов:
"name": "Central Park"
Применяются для количественных параметров:
"height": 350
Используются для флагов:
"isActive": true
Хотя поддержка в выражениях ограничена, данные могут храниться:
"tags": ["park", "urban", "tourism"]
Помимо статических properties, в Mapbox GL JS существует
динамическое состояние объектов (feature state), которое изменяется без
перезагрузки источника данных.
properties — часть данных GeoJSON, неизменяемая во
время работы картыfeature state — временные значения, задаваемые через
APImap.setFeatureState(
{ source: 'cities', id: 123 },
{ hover: true }
);
Использование в стиле:
'circle-color': [
'case',
['boolean', ['feature-state', 'hover'], false],
'#ff0000',
'#0000ff'
]
Для работы feature state требуется стабильный id. Он
может быть задан в свойствах:
{
"type": "Feature",
"id": 42,
"properties": {
"name": "Station A"
}
}
Если id отсутствует, Mapbox GL JS может использовать
индекс, но это снижает предсказуемость поведения при обновлениях
данных.
Фильтры слоёв опираются исключительно на properties
объектов источника.
Пример сложного фильтра:
filter: [
'all',
['==', ['get', 'type'], 'restaurant'],
['>=', ['get', 'rating'], 4]
]
Такая конструкция позволяет комбинировать несколько условий без изменения исходных данных.
При обновлении источника через setData свойства
полностью пересчитываются:
map.getSource('cities').setData(newGeojson);
Любые выражения, фильтры и стили автоматически пересчитываются на
основе новых properties.
Внутренняя архитектура Mapbox GL JS оптимизирована для быстрого доступа к свойствам, однако существуют важные ограничения:
На практике рекомендуется:
propertiesПри работе с vector tiles свойства приходят уже упакованными в тайлы и имеют ограничения:
Это связано с оптимизацией передачи данных по сети.
Свойства часто применяются для управления поведением интерфейса:
map.on('mouseenter', 'cities-layer', (e) => {
const name = e.features[0].properties.name;
popup.setLngLat(e.lngLat).setText(name).addTo(map);
});
Здесь properties.name используется для генерации
пользовательского интерфейса.
Свойства сами по себе не имеют визуального эффекта, пока не используются в стиле слоя. Выражения выступают мостом между данными и визуализацией.
Пример связки:
properties.population['get', 'population']circle-radiusЭта цепочка формирует динамическое поведение карты без ручного расчёта параметров.
Mapbox предоставляет инфраструктуру, в которой свойства объектов являются частью более широкой системы:
В этой архитектуре свойства выступают универсальным языком описания данных, который используется во всех слоях системы визуализации.