vector - 如何在openlayers中隐藏矢量特征

标签 vector openlayers

我已经编写了一些代码来根据 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/

相关文章:

c++ - 无法对存储在容器中的指针调用公共(public)方法

c++ - 使用 find() 在 vector 中查找元素

openlayers - 如何在 openlayers 6 中聚类不同类型的几何体?

openlayers - 如何独立于缩放级别移动弹出位置?

selenium - 开放层的自动化测试可能吗?

c++ - 3D 线段和平面相交 - 续

c++ - 在 C++ 中没有比较器函数的情况下,按对中的第一个元素按升序对对 vector 进行 stable_sort

javascript - 获取垂直于向量的两个点

javascript - 如何使用 OpenLayers 限制现有多边形内的绘制

c++ - 将元素从 std::vector 复制到 std::stack C++