我已经编写了一些代码来根据 map 本身之外的复选框隐藏 map 中的特定标记。但是,这些标记也具有矢量特征(实际上在单独的图层上),但我只想隐藏这些特征而不是破坏它们。我尝试使用 display(false) 但出现错误。有隐藏向量的功能吗?
最佳答案
我曾多次与 OpenLayers 搏斗,试图让我的功能在同一层中完全按照我的意愿显示。 @igorti 的解决方案会覆盖该功能的所有样式属性,因此我不推荐这种方法,除非您以后没有理由重新显示该功能(在这种情况下,removeFeatures()
方法可能是更好的方法来做到这一点) )。
隐藏矢量特征
我这样做的方法是手动将功能的样式显示设置为 none
然后重绘图层。如果我需要再次显示该功能,请将显示属性设置为 block
.很简单:
function hideFeatures() {
var features = layer.features;
for (var i = 0; i < features.length; i++) {
var feature = features[i];
if (!isVisible(feature)) {
feature.style.display = 'none';
}
}
layer.redraw();
}
重新显示矢量特征
根据您的情况,重新显示隐藏的功能会有点棘手。看看OpenLayers documentation on styling对于一些可能性。但一般来说,如果我需要再次显示特征,我将特征的样式属性设置为
null
.这确保了当 OpenLayers 渲染器执行 drawFeature
函数,您从图层的 styleMap 中预先配置的样式被重绘:// from OpenLayers drawFeature()
if (!style) {
style = this.styleMap.createSymbolizer(feature, renderIntent);
}
所以你的显示功能可能看起来像这样:
function displayFeatures() {
var features = layer.features;
for (var i = 0; i < features.length; i++) {
var feature = features[i];
if (isVisible(feature)) {
feature.style = null; //redraw the feature
}
}
layer.redraw();
}
其他方法
还有其他几种方法可以做到这一点。您可以将功能的 fillOpacity 和 strokeOpacity 设置为 0,如下所示:
function displayFeatures() {
var features = layer.features;
for (var i = 0; i < features.length; i++) {
var feature = features[i];
if (isVisible(feature)) {
feature.style.fillOpacity = 1;
feature.style.strokeOpacity = 1;
}
else {
feature.style.fillOpacity = 0;
feature.style.strokeOpacity = 0;
}
}
layer.redraw();
}
这种方法的缺点是任何事件的 map 控件仍然能够与“隐藏”功能交互,因此如果用户不小心单击或悬停在该功能上,这些事件仍然会触发。
您还可以使用上述两种方法中的任何一种在图层的 styleMap 中创建一个名为 hidden 的样式。然后要隐藏一个特性,只需将特性的 renderIntent 更改为
hidden
.最后,您可以将功能的子集添加到单独的图层中,并调用图层的
setVisibility
方法为假。如果您不需要同时与所有要素进行交互,这只是一个不错的选择,因为只有 map 顶层的控件才会处于事件状态。 (有一些方法可以使用 controls for multiple layers ,但是涉及更多杂耍,除非绝对必要,否则我不推荐它)
关于vector - 如何在openlayers中隐藏矢量特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528243/