В экосистеме Mapbox GL JS под «результатами» понимаются данные, возвращаемые различными источниками: запросами к слоям карты, событиями взаимодействия, геокодингом, источниками GeoJSON, векторными тайлами и вычисляемыми выборками объектов. Эти результаты имеют разную структуру, но объединяются общим принципом: представляют набор геопространственных сущностей с набором свойств и геометрией.
Основные категории:
Каждый тип требует отдельной стратегии обработки, так как различается момент получения данных, структура объектов и производительность операций.
Метод map.queryRenderedFeatures() возвращает объекты,
которые в данный момент отрисованы на экране.
map.on('click', (e) => {
const features = map.queryRenderedFeatures(e.point);
console.log(features);
});
Характерные особенности:
Типичная структура результата:
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [30, 50] },
"properties": {
"name": "Object A"
},
"layer": {
"id": "points-layer"
}
}
Ключевой момент — наличие поля layer, которое связывает
результат с конкретным слоем стиля.
Метод map.querySourceFeatures() работает на уровне
источника данных, минуя визуальные ограничения.
const features = map.querySourceFeatures('cities-source', {
sourceLayer: 'cities'
});
Особенности:
sourceLayer для vector
tilesИспользуется для:
События карты предоставляют результаты в виде объекта события, содержащего координаты и массив фич.
map.on('click', 'points-layer', (e) => {
const feature = e.features[0];
const coordinates = e.lngLat;
});
Структура события:
e.features — выбранные объекты слояe.lngLat — географические координаты кликаe.point — экранные координатыe.originalEvent — нативное DOM-событиеОсобенность подхода заключается в том, что результат уже предфильтрован по слою, что уменьшает необходимость ручного поиска.
Геокодинг возвращает структурированные JSON-ответы, содержащие географические сущности.
Пример результата:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"place_name": "Almaty, Kazakhstan",
"geometry": {
"type": "Point",
"coordinates": [76.9286, 43.2220]
},
"properties": {
"accuracy": "city"
}
}
]
}
Особенности обработки:
FeatureCollectionrelevance,
accuracy)limitТипичные операции:
place_nameПри использовании GeoJSON источников результаты часто извлекаются через события или фильтрацию слоя.
map.addSource('places', {
type: 'geojson',
data: geojsonData
});
Далее результаты доступны через:
map.querySourceFeatures('places');
или:
map.queryRenderedFeatures();
Особенности:
setDataКластеризация в источниках GeoJSON формирует специальные объекты:
map.addSource('points', {
type: 'geojson',
data: data,
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Результаты содержат:
cluster: true)point_count)cluster_id)Пример обработки:
map.on('click', 'clusters', (e) => {
const clusterId = e.features[0].properties.cluster_id;
});
Дополнительные операции:
map.getSource('points').getClusterExpansionZoom(clusterId, (err, zoom) => {
map.easeTo({ zoom });
});
Кластерные результаты требуют отдельной логики декомпозиции.
Результаты часто проходят постобработку:
const filtered = features.filter(f => f.properties.type === 'restaurant');
Распространённые операции:
Пример сортировки по расстоянию:
features.sort((a, b) => {
return a.properties.distance - b.properties.distance;
});
При работе с большим количеством данных критично избегать лишних проходов по массиву.
Свойства объектов (properties) часто требуют
нормализации перед отображением.
Типичные преобразования:
function formatFeature(feature) {
return {
name: feature.properties.name || 'Без названия',
category: feature.properties.category?.toUpperCase(),
rating: Number(feature.properties.rating || 0).toFixed(1)
};
}
В сложных приложениях формируется слой абстракции между сырыми результатами и UI-слоем.
При интенсивной работе с Mapbox GL JS критично учитывать стоимость операций:
queryRenderedFeatures вызывается только при
необходимостиПример ограничения:
map.queryRenderedFeatures([
[left, bottom],
[right, top]
]);
Также используется дебаунсинг событий:
let timeout;
map.on('moveend', () => {
clearTimeout(timeout);
timeout = setTimeout(updateResults, 200);
});
Типичные проблемы:
Возникают при отсутствии объектов в зоне запроса:
if (!features.length) {
return;
}
Запрос может вернуть пустой массив при неправильном
layer id.
Vector tiles могут не содержать всех ожидаемых полей.
При пересечении слоёв один объект может появляться несколько раз.
querySourceFeatures и queryRenderedFeatures
могут давать разные наборы данных при одинаковых координатах.
В сложных приложениях результаты проходят несколько этапов:
Такая структура позволяет отделить геопространственную логику от визуального слоя и уменьшить связанность компонентов внутри приложений, использующих Mapbox GL JS