Метод querySourceFeatures предоставляет доступ к
исходным данным векторных источников до применения стилей и фильтров
слоя. Он работает напрямую с тайлами источника и возвращает геометрии и
свойства объектов, которые загружены в данный момент в пределах текущего
вьюпорта карты.
Основное назначение — анализ данных на уровне источника, а не отрисованного представления. Это критически важно для задач, где требуется работа с «сырыми» объектами: агрегация, фильтрация, поиск, вычисления по атрибутам.
map.querySourceFeatures(sourceId, options);
sourceId (string) Идентификатор источника, заданного в стиле карты:
map.addSource('cities', {
type: 'vector',
url: 'mapbox://examples.8fgz4egr'
});
options (Object, необязательный) Позволяет уточнить выборку данных:
sourceLayer — имя слоя внутри векторного тайл-сетаfilter — фильтр в формате выражений Mapbox GLvalidate — включение проверки валидности геометрий
(редко используется)Векторные данные в Mapbox GL JS загружаются по тайлам. Каждый тайл содержит набор фич (features), относящихся к определённым sourceLayer.
querySourceFeatures:
Это делает метод быстрым, но ограниченным текущим состоянием кэша тайлов.
Ключевое различие заключается в уровне абстракции.
map.on('load', () => {
const features = map.querySourceFeatures('cities');
console.log(features);
});
Результатом будет массив GeoJSON-подобных объектов:
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [69.2401, 41.2995]
},
properties: {
name: "Tashkent",
population: 2500000
},
source: "cities",
sourceLayer: "city_points"
}
Векторные тайл-сеты почти всегда содержат несколько логических слоёв.
Без указания sourceLayer результат может быть пустым или
избыточным.
map.querySourceFeatures('cities', {
sourceLayer: 'city_points'
});
sourceLayer выполняет роль фильтра внутри тайла и существенно влияет на производительность и точность выборки.
Фильтр используется для выборки объектов по атрибутам. Синтаксис совпадает с фильтрами слоёв Mapbox.
map.querySourceFeatures('cities', {
sourceLayer: 'city_points',
filter: ['>', ['get', 'population'], 1000000]
});
['==', ['get', 'field'], value]['!=', ['get', 'field'], value]['>', ['get', 'field'], value]['<', ['get', 'field'], value]['in', ['get', 'field'], a, b, c]Если объект не попал в загруженные тайлы текущего экрана, он не будет возвращён.
Метод не выполняет поиск по всему датасету, только по кэшу.
Слои, opacity, visibility и filter слоя не влияют на результат.
const largeCities = map.querySourceFeatures('cities', {
sourceLayer: 'city_points',
filter: ['>', ['get', 'population'], 500000]
});
const features = map.querySourceFeatures('roads', {
sourceLayer: 'road_segments'
});
const totalLength = features.reduce((sum, f) => {
return sum + (f.properties.length || 0);
}, 0);
Метод часто используется для построения пользовательских аналитических слоёв поверх карты:
Так как данные зависят от тайлов:
Это важно учитывать при построении стабильной логики анализа данных.
Векторные источники разбиваются на тайлы по zoom levels. Каждый тайл содержит подмножество данных.
querySourceFeatures фактически работает с:
Это делает метод эффективным для интерактивных сценариев, но непригодным для полной выгрузки датасета.
Хотя метод не предназначен для геопространственных запросов, возможна дополнительная фильтрация после получения данных:
const features = map.querySourceFeatures('cities', {
sourceLayer: 'city_points'
});
const filtered = features.filter(f => {
const [lng, lat] = f.geometry.coordinates;
return lng > 60 && lat > 40;
});
Поскольку данные приходят из тайлов, один и тот же объект может появляться:
Это приводит к дублированию features в результате запроса. Устранение дублей обычно выполняется через:
id объекта (если присутствует)source + sourceLayer + idМетод считается относительно быстрым, но его стоимость растёт при:
move или render
событияхРекомендуется:
map.querySourceFeatures('cities');
Результат может быть пустым, если данные структурированы по слоям.
Запрос не охватывает весь датасет, только загруженные тайлы.
Ошибка возникает, когда ожидается визуальный результат, но возвращаются «сырые» данные без учёта стилей.
В продвинутых приложениях метод используется как часть pipeline:
При обновлении source через:
map.getSource('cities').setData(newGeoJSON);
querySourceFeatures начинает возвращать данные из
обновлённого набора только после пересборки тайлов и перерисовки кэша
источника.