经纬志
首页 / MapLibre / API 文档

querySourceFeatures

先看结论

查询数据源中已加载瓦片里的要素。它绕开图层样式,直接看源里的原始数据。

最后验证 2026-11-03 · MapLibre GL JS 4.x · 更新 2026-10-29 · 引用本文
map.querySourceFeatures(sourceId, options?) → GeoJSONFeature[]

参数

参数类型说明
sourceIdstring数据源 id
options.sourceLayerstring矢量瓦片内的图层名,矢量源必须给出
options.filterFilterSpecification按要素属性过滤
options.validateboolean是否校验过滤表达式,默认 true

与 queryRenderedFeatures 的区别

对比项querySourceFeaturesqueryRenderedFeatures
数据范围源中已加载的瓦片当前画面实际渲染的要素
受图层过滤影响不受受
受缩放可见性影响不受受
需要坐标参数不需要需要点或矩形
典型用途读聚合计数、检查瓦片内容点选、框选

读取聚合后的簇

var clusters = map.querySourceFeatures('cities', {
  filter: ['has', 'point_count']
});

clusters.forEach(function (f) {
  console.log(
    f.properties.point_count,
    f.geometry.coordinates
  );
});

GeoJSON 源开启 cluster: true 后,簇属性由 MapLibre 生成, 常用的有 point_count、point_count_abbreviated、 以及配置了 clusterProperties 时得到的自定义字段。

矢量瓦片源要指定图层

var roads = map.querySourceFeatures('basemap', {
  sourceLayer: 'transportation',
  filter: ['==', ['get', 'class'], 'primary']
});

console.log('当前已加载瓦片中的主干道数量:', roads.length);

sourceLayer 写错时结果为空数组,且不会有报错。 可以从瓦片服务商提供的样式或 TileJSON 中确认图层名。

结果会重复

同一个要素跨越瓦片边界时,会在每个涉及的瓦片里各出现一次。 直接 length 计数会偏大,展示前按要素 id 或业务字段去重。 GeoJSON 源在客户端切片时也可能出现同样的重复。

它不是全量查询

只有已经加载到客户端的瓦片能被查到。缩小地图后,视野内瓦片数量有限, 远处的数据根本不在内存里。需要统计全量数据时, 应该回到原始 GeoJSON 或后端接口,而不是依赖这个接口。

调用时机要等到源就绪。 样式刚添加完立刻查询,瓦片还没回来,结果为空。 监听 sourcedata 并在 e.isSourceLoaded 为真后再查, 或放在 idle 事件里。

引用本文

经纬志(2026)。《querySourceFeatures》。https://www.jingweizhi.com/maplibre/api/query-source-features.html(访问日期 2026-11-03)。