как скрыть векторные объекты в openlayers - PullRequest
17 голосов
/ 30 июня 2011

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

Ответы [ 7 ]

25 голосов
/ 01 июля 2011

Решение

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

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

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

Пример кода

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

var features = layer.features;

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

layer.redraw();

Это перебирает все объекты в слое, позволяя скрыть полный контроль над конкретными объектами.

13 голосов
/ 02 ноября 2012

Я боролся с OpenLayers несколько раз, пытаясь заставить мои функции в одном слое отображаться точно так, как я хочу.Решение @ igorti переопределяет все свойства стиля функции, поэтому я не рекомендую этот подход, если у вас нет причин повторно отображать эту функцию позже (в этом случае метод removeFeatures(), вероятно, является лучшим способом сделать это в любом случае).

Сокрытие векторных объектов

Чтобы сделать это, вручную установите отображение стиля элемента на none, а затем перерисовайте слой.Если мне нужно снова отобразить эту функцию, установите для свойства display значение 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 вашего слоя, называемый скрытым, с помощью любого из двух указанных выше подходов.Затем, чтобы скрыть объект, просто измените значение renderIntent объекта на hidden.

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

1 голос
/ 29 апреля 2016

Чтобы скрыть одну особенность

var feature = vectorlayer.getFeatureByFid(fid);
feature.style = { display: 'none' };
vectorLayer.removeFeatures(feature);
vectorLayer.addFeatures(feature);
1 голос
/ 24 июля 2013

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

    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();
1 голос
/ 08 августа 2012

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

0 голосов
/ 28 февраля 2014

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

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

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

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

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

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

0 голосов
/ 30 июня 2011

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

Ссылка: http://dev.openlayers.org/releases/OpenLayers-2.10/doc/apidocs/files/OpenLayers/Layer-js.html#OpenLayers.Layer.setVisibility

...