ArcGIS JS API如何对对象存储的多个FeatureLayer应用过滤器
实现方法
你只需要新增变量记录当前激活的年份,再修改过滤逻辑,遍历当前年份下的所有图层批量应用过滤规则即可,具体步骤如下:
- 新增全局变量存储当前选中的激活年份,在你已有的年份切换逻辑里同步更新这个变量的值
- 修正原
createFL函数的属性位置错误(原代码将透明度、可见性属性写在了portalItem配置内部,不会生效) - 重写
doQuery逻辑,匹配到当前激活年份的图层组后,遍历组内所有图层统一设置definitionExpression
完整修正代码
1. 修正图层创建函数
const createFL = (layer) => { if(layer.featureLayer !== null && layer.featureLayer !== undefined) return; layer.featureLayer = new FeatureLayer({ portalItem: { id: layer.layerID }, opacity: layer.opacity !== undefined ? layer.opacity : 1.0, visible: false, }) }
2. 新增激活年份记录变量
// 初始值和页面默认加载的年份保持一致即可 let activeYear = 1918; // 在你已实现的年份切换函数中,新增一行更新activeYear的逻辑 // 示例(替换成你自己的切换逻辑即可): /* function onYearSelect(selectedYear) { // 你原有的隐藏旧图层、加载显示新年份图层的逻辑保持不变 activeYear = selectedYear; // 新增这行 } */
3. 修正过滤应用逻辑
document.getElementById("doBtn").addEventListener("click",doQuery); const attributeName = document.getElementById("attSelect"); const expressionSign = document.getElementById("signSelect"); const inputValue = document.getElementById("valSelect"); let expression; function doQuery() { // 拼接表达式时转义输入内容里的单引号,避免过滤语法报错 expression = attributeName.value + expressionSign.value + "'" + inputValue.value.replace(/'/g, "''") + "'"; document.getElementById("printResults").textContent = expression; // 匹配当前激活年份对应的图层配置 const activeLayerGroup = layersByYears.find(config => config.year === activeYear); if (!activeLayerGroup) return; // 遍历当前年份下所有图层,统一应用过滤规则 activeLayerGroup.layers.forEach(layerConfig => { // 图层未初始化时先创建实例 if (!layerConfig.featureLayer) { createFL(layerConfig); } layerConfig.featureLayer.definitionExpression = expression; }); }
补充说明
- 如果需要实现清除过滤功能,只需要将
expression赋值为空字符串''后执行同样的遍历逻辑,API会自动清除图层上的过滤规则 - 切换年份时,如果希望过滤规则对新切换的年份图层同样生效,可以在年份切换的逻辑末尾手动调用一次
doQuery()即可
内容的提问来源于stack exchange,提问作者jenik2205
相关产品推荐
相关产品推荐

