鼠标移动获取GeoTIFF数据:从float32array生成过滤后列表
解决方案
先声明一个全局变量,用来存储所有过滤后的有效结果:
// 全局存储所有有效数据,不会随鼠标移动重置 const allValidReliefValues = [];
然后修改你的displayPixelValue函数,处理每个图层的Float32Array并完成合并过滤:
function displayPixelValue(event) { const filteredLayers = map.getAllLayers().filter(layer => layer.get('name')); const reliefPattern = "_mbpd_"; // 存储当前鼠标移动事件中得到的所有有效数值 const currentValidValues = []; for (const layer of filteredLayers) { if (layer.get('name').match(reliefPattern)) { const reliefValue = layer.getData(event.pixel); // 将Float32Array转换为普通数组,同时过滤掉NaN和255 const validValues = Array.from(reliefValue).filter(val => !Number.isNaN(val) && val !== 255); // 合并当前图层的有效数值到当前事件数组 currentValidValues.push(...validValues); } } // 将当前事件的有效数据合并到全局列表 allValidReliefValues.push(...currentValidValues); // 可选:打印全局列表验证结果 console.log('所有有效结果:', allValidReliefValues); } map.on(['pointermove'], displayPixelValue);
关键修改说明:
- 全局数组存数据:
allValidReliefValues用来累积所有鼠标移动产生的有效数据,不会每次鼠标移动就清空之前的内容。 - 遍历优化:用
for...of替代传统for循环,代码更简洁易读。 - Float32Array处理:
Array.from()可以直接把Float32Array转成普通数组,同时通过filter一步过滤掉NaN和255——如果还有其他要排除的无效值,直接在filter的条件里补充即可。 - 数组合并:用扩展运算符
...把每个图层的有效数组合并到当前事件数组,再合并到全局数组,这样15个图层的结果都会被收集到,不会只处理第一个。
后续使用:
之后你要用到这个简洁列表的时候,直接调用allValidReliefValues就行,它已经是处理好的普通数组,方便后续任何操作。
内容的提问来源于stack exchange,提问作者Gery
相关产品推荐
相关产品推荐

