querySourceFeatures
查询数据源中已加载瓦片里的要素。它绕开图层样式,直接看源里的原始数据。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
sourceId | string | 数据源 id |
options.sourceLayer | string | 矢量瓦片内的图层名,矢量源必须给出 |
options.filter | FilterSpecification | 按要素属性过滤 |
options.validate | boolean | 是否校验过滤表达式,默认 true |
与 queryRenderedFeatures 的区别
| 对比项 | querySourceFeatures | queryRenderedFeatures |
|---|---|---|
| 数据范围 | 源中已加载的瓦片 | 当前画面实际渲染的要素 |
| 受图层过滤影响 | 不受 | 受 |
| 受缩放可见性影响 | 不受 | 受 |
| 需要坐标参数 | 不需要 | 需要点或矩形 |
| 典型用途 | 读聚合计数、检查瓦片内容 | 点选、框选 |
读取聚合后的簇
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)。