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

16

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

    
задан Andrew Christensen 30.06.2011 в 01:00
источник
  • как насчет вопроса о вопросе как ответ? –  igorti 08.08.2011 в 06:55

7 ответов

23

Решение

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

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

  

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

Пример кода

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

var features = layer.features;

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

layer.redraw();

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

    
ответ дан igorti 01.07.2011 в 00:46
источник
  • Да, я просто сделал это на самом деле и, к сожалению, вектор не исчез с карты. Я консоль вычеркнул вектор после установки стиля, и он показывает, что на дисплее установлено значение none. Очень расстраивает. Спасибо за помощь! –  Andrew Christensen 01.07.2011 в 01:02
  • Ой! igorti, я только что поймал, что вы сказали, что я должен перерисовать слой. Doh! Вот так! Благодаря!!! –  Andrew Christensen 01.07.2011 в 15:58
  • Да, вам нужно будет вызвать redraw () на OpenLayers.Layer.Vector после установки стиля на none. –  Leif Gruenwoldt 08.08.2011 в 03:24
  • Кто-нибудь знает, как показать эту функцию еще раз? –  lubar 16.05.2012 в 04:36
  • я попытаюсь удалить свойство отображения - удалить стиль ["display"]; а затем перерисовать слой –  igorti 16.05.2012 в 09:31
12

Я несколько раз боролся с 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();
}

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

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

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

    
ответ дан Kyle 02.11.2012 в 16:44
источник
1

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

    
ответ дан SSS 08.08.2012 в 12:08
источник
1

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

    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();
    
ответ дан Rayiez 24.07.2013 в 08:52
источник
  • setVisibility не является свойством ol.layer.Vector –  Steve Staple 16.03.2017 в 13:57
  • @SteveStaple Это решение для Openlayers2. –  Rayiez 28.03.2017 в 08:29
1

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

var feature = vectorlayer.getFeatureByFid(fid);
feature.style = { display: 'none' };
vectorLayer.removeFeatures(feature);
vectorLayer.addFeatures(feature);
    
ответ дан Back-Jin Seong 29.04.2016 в 06:18
источник
0

Из вашего вопроса неясно, уже вы это пробовали, но если вы не можете попробовать метод setVisibility ().

Ссылка: Ссылка     

ответ дан Howard Y 30.06.2011 в 17:06
источник
  • Проблема в том, что я не хочу скрывать весь слой. Я просто хочу скрыть один элемент. Есть идеи? –  Andrew Christensen 30.06.2011 в 22:54
0

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

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

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

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

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

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

    
ответ дан Le Droid 27.02.2014 в 21:33
источник