Подтвердить что ты не робот

Как скрыть векторные функции в openlayers

Я написал некоторый код, чтобы скрыть определенные маркеры в наших картах на основе флажков вне самой карты. Однако эти маркеры также имеют векторные функции (действительно на отдельных слоях), но я хочу просто скрыть объекты, а не уничтожить их. Я попытался использовать display (false), но получить ошибки. Существует ли функция для скрытия векторов?

4b9b3361

Ответ 1

Решение

Измените свойство style для экземпляров OpenLayers.Feature.Vector. Установите для атрибута display значение none или visibility на hidden. Затем измените слой.

Согласно комментариям в OpenLayers code:

дисплей - {String} Символизаторы не будут иметь эффекта, если для дисплея установлено значение "none". Все остальные значения не влияют.

Пример кода

Для данной переменной уровня OpenLayers, называемой layer, вы можете скрыть все функции следующим образом:

var features = layer.features;

for( var i = 0; i < features.length; i++ ) {
  features[i].style = { visibility: 'hidden' };
}

layer.redraw();

Это выполняет итерацию по всем функциям слоя, что позволяет полностью контролировать скрытые функции.

Ответ 2

Я несколько раз боролся с 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 по стилизации для некоторых возможностей. Но в общем случае, если мне нужно снова отобразить эту функцию, я установил атрибут стиля функции 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();
}

Недостатком этого подхода является то, что любые активные элементы управления картой будут по-прежнему иметь возможность взаимодействовать со "скрытой" функцией, поэтому, если пользователь случайно нажимает или парит над функцией, эти события все равно будут срабатывать.

Вы также можете создать стиль в своем стиле styleMap, который называется hidden, с одним из двух подходов выше. Затем, чтобы скрыть функцию, просто измените функцию renderIntent на hidden.

Наконец, вы можете добавить подмножества ваших функций для разделения слоев и вызвать метод layer setVisibility на false. Это только хороший вариант, если вам не нужно взаимодействовать со всеми функциями одновременно, поскольку активны только элементы управления для верхнего слоя вашей карты. (Существуют способы использования элементов управления для нескольких слоев, но там гораздо больше задействовано жонглирование, и я не рекомендую его, если это абсолютно необходимо)

Ответ 3

Вы можете установить отображение: "none" в свойстве стиля. Таким образом, функции не будут отображаться

Ответ 4

Чтобы скрыть функции

    for( var i = 0; i < features.length; i++ ) {
      features[i].style = { display: 'none' };
    }
    layer.redraw();

Чтобы отобразить скрытые функции

    for( var i = 0; i < features.length; i++ ) {
      features[i].style = null;
    }
    layer.redraw();

Ответ 5

Чтобы скрыть одну функцию

var feature = vectorlayer.getFeatureByFid(fid);
feature.style = { display: 'none' };
vectorLayer.removeFeatures(feature);
vectorLayer.addFeatures(feature);

Ответ 7

Вот что я, наконец, сделал для этого, так как у меня была такая же потребность, но я не хотел скрывать каждую функцию отдельно или играть в стиле CSS:

Я предполагаю, что у вас есть что-то вроде следующего:

myVector = new OpenLayers.Layer.Vector(...

Затем привяжите этот код к кнопке или любому событию, которое вам нужно:

if( myVector.getVisibility() && myVector.features.length > 0 ) {
      myVector.setVisibility(false);
} else {
      myVector.setVisibility(true);
}

getVisibility()/setVisibility() ссылки отсутствуют в векторной части, но находятся в документации по уровню.