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