Метод querySourceFeatures предоставляет доступ к
геометрическим и атрибутивным объектам, загруженным в конкретный
источник данных MapLibre GL JS, независимо от того, отображаются они на
текущем экране или нет. Это ключевой инструмент для работы с векторными
тайлами и GeoJSON-источниками на уровне исходных данных, а не
рендеринга.
querySourceFeatures используется для извлечения данных
напрямую из источника слоя (source), минуя стадию отрисовки. Это
позволяет работать с полной выборкой объектов, включая те, которые:
Метод ориентирован на анализ данных, а не визуальное взаимодействие.
map.querySourceFeatures(sourceId, parameters)
Где:
sourceId — строка, идентификатор источника данныхparameters — объект параметров фильтрации
(необязательный)Объект parameters может содержать следующие поля:
sourceLayer — имя слоя внутри векторного тайла
(обязательно для vector sources)filter — выражение фильтра MapLibre GL JS для отбора
фичПример структуры:
{
sourceLayer: "roads",
filter: ["==", "class", "primary"]
}
Метод работает только с уже загруженными данными источников:
Vector tiles (vector source) Используются для
больших наборов данных, разбитых на тайлы. Требуют указания
sourceLayer.
GeoJSON source Работает с локальными или удалёнными
GeoJSON-данными, обычно без sourceLayer.
Фильтр задаётся в формате выражений MapLibre GL JS, аналогично стилевым фильтрам слоёв.
Примеры операторов:
==, !=, >,
<all, any, noneinПример:
map.querySourceFeatures("cities", {
filter: [">", ["get", "population"], 1000000]
});
Фильтрация выполняется на уровне данных, но только среди уже загруженных тайлов.
querySourceFeatures и queryRenderedFeatures
часто используются вместе, но работают на разных уровнях.
querySourceFeatures:
queryRenderedFeatures:
Ключевое различие заключается в том, что
querySourceFeatures игнорирует визуальное
представление.
Получение всех дорог определённого типа:
const roads = map.querySourceFeatures("transport", {
sourceLayer: "roads",
filter: ["==", "type", "highway"]
});
Получение всех объектов GeoJSON:
const features = map.querySourceFeatures("points-of-interest");
Фильтрация по числовому атрибуту:
const largeBuildings = map.querySourceFeatures("buildings", {
sourceLayer: "footprint",
filter: [">=", ["get", "floors"], 10]
});
Векторные тайлы загружаются фрагментами, поэтому:
Это означает, что результат может быть неполным при быстром зуме или перемещении карты.
Метод имеет ряд архитектурных ограничений:
querySourceFeatures может быть ресурсоёмким при:
move
или render)Рекомендуемые практики:
Метод часто используется для задач пространственного анализа:
Агрегация объектов:
const parks = map.querySourceFeatures("landuse", {
sourceLayer: "parks"
});
const count = parks.length;
Поиск объектов по атрибутам без визуального слоя:
const hospitals = map.querySourceFeatures("amenities", {
sourceLayer: "poi",
filter: ["==", ["get", "type"], "hospital"]
});
Подсчёт статистики по данным тайлов:
const buildings = map.querySourceFeatures("cadastre", {
sourceLayer: "buildings"
});
const total = buildings.reduce((sum, f) => {
return sum + (f.properties.area || 0);
}, 0);
Результаты querySourceFeatures динамически зависят от
состояния карты:
setStyle кэш тайлов сбрасываетсяЭто делает метод чувствительным к текущему состоянию рендеринга источников.
В случае GeoJSON источников поведение более предсказуемо:
map.querySourceFeatures("geojson-data", {
filter: ["!=", ["get", "status"], "inactive"]
});
Комбинирование условий позволяет строить сложные выборки:
map.querySourceFeatures("real-estate", {
sourceLayer: "properties",
filter: [
"all",
[">", ["get", "price"], 100000],
["<", ["get", "price"], 500000],
["==", ["get", "type"], "apartment"]
]
});
Такие конструкции позволяют реализовывать полноценные аналитические запросы без внешней обработки данных.
Метод часто используется совместно с:
getSource() — для доступа к объекту источникаqueryRenderedFeatures() — для визуального анализаon('click') — для обработки пользовательских
взаимодействийsetFilter() — для синхронизации логики и стиляКомбинация этих методов позволяет разделять аналитическую и визуальную логику приложения.