В контексте MapLibre GL JS термин feature обозначает отдельный геометрический объект пространственных данных, описанный в формате GeoJSON или внутри векторных тайлов. Каждый feature представляет собой минимальную единицу данных карты, включающую геометрию и набор атрибутов.
Feature является фундаментальной сущностью, на которой строится вся логика взаимодействия с данными: от визуализации до обработки событий и динамического стайлинга.
В большинстве случаев MapLibre GL JS работает с feature в формате GeoJSON. Базовая структура выглядит следующим образом:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [30.5, 50.5]
},
"properties": {
"name": "Объект",
"category": "poi",
"population": 1200
}
}
Поле geometry определяет пространственное представление
объекта:
Геометрия определяет, как feature будет отображён на карте и как будет участвовать в пространственных операциях.
Поле properties содержит семантические данные, связанные
с геометрией. Именно properties превращают геометрический объект в
информативную сущность.
id, fid)type, class,
category)height, population,
value)name,
description)Пример расширенного набора:
"properties": {
"id": 10234,
"name": "Central Park",
"type": "park",
"area": 341,
"protected": true
}
MapLibre GL JS поддерживает два основных типа источников, где feature играет ключевую роль:
map.addSource('places', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [...]
}
});
Каждый элемент массива features — это отдельный
feature.
Векторные тайлы содержат уже предобработанные features, разделённые по слоям. В этом случае features загружаются динамически в зависимости от viewport.
map.addSource('roads', {
type: 'vector',
url: 'mapbox://tileset-id'
});
Одной из ключевых возможностей MapLibre GL JS является data-driven styling — стилизация на основе свойств feature.
paint: {
'circle-radius': ['get', 'population'],
'circle-color': ['get', 'color']
}
paint: {
'fill-color': [
'case',
['==', ['get', 'type'], 'park'],
'#00ff00',
'#ff0000'
]
}
Properties становятся частью выражений MapLibre Expression Language, что позволяет создавать сложную логику визуализации без дополнительного кода.
При взаимодействии с картой (click, hover) MapLibre возвращает массив features, попадающих под курсор.
map.on('click', 'places-layer', (e) => {
const features = e.features;
console.log(features[0].properties);
});
Каждый элемент e.features содержит:
Это позволяет строить интерактивные интерфейсы без дополнительных запросов к серверу.
Метод queryRenderedFeatures позволяет получать features,
визуально присутствующие на экране.
const features = map.queryRenderedFeatures({
layers: ['places-layer']
});
Фильтрация по properties:
const parks = map.queryRenderedFeatures().filter(
f => f.properties.type === 'park'
);
Этот механизм используется для аналитики, построения всплывающих окон и динамических выделений объектов.
Feature-state позволяет изменять визуальное состояние feature без изменения исходных данных.
map.setFeatureState(
{
source: 'places',
id: 123
},
{
selected: true
}
);
Использование в стилях:
paint: {
'circle-color': [
'case',
['boolean', ['feature-state', 'selected'], false],
'#ff0000',
'#0000ff'
]
}
Каждый feature может иметь уникальный идентификатор:
{
"type": "Feature",
"id": 42,
"properties": {}
}
ID используется для:
При отсутствии id MapLibre может генерировать внутренние
идентификаторы, но это ограничивает возможности управления
состоянием.
Слои могут фильтровать features по их properties:
filter: ['==', ['get', 'type'], 'water']
Комбинированные фильтры:
filter: [
'all',
['==', ['get', 'type'], 'road'],
['>=', ['get', 'width'], 5]
]
Фильтрация происходит на уровне рендера, что делает её высокопроизводительной даже для больших наборов данных.
Для точечных данных GeoJSON поддерживает кластеризацию:
map.addSource('points', {
type: 'geojson',
data: geojson,
cluster: true,
clusterRadius: 50
});
В этом режиме:
point_count{
"properties": {
"point_count": 12,
"cluster": true
}
}
Перед отрисовкой MapLibre выполняет несколько этапов:
Properties на каждом этапе могут использоваться для принятия решений о визуализации.
При работе с большим количеством features критично учитывать:
Оптимизация часто достигается переносом логики в стили MapLibre, а не в JavaScript.
Без стабильного id невозможно корректно использовать
feature-state, что приводит к неконтролируемым обновлениям UI.
Избыточные данные в properties увеличивают размер GeoJSON и замедляют загрузку.
Перенос логики из стилей в JS снижает производительность, так как рендер перестаёт быть декларативным.
Feature объединяет геометрию и семантику, выступая связующим звеном между:
В архитектуре MapLibre GL JS именно features определяют, какие объекты существуют на карте и как они ведут себя в различных состояниях отображения.