Очистить слой WMS перед перерисовкой на OpenLayers - PullRequest
1 голос
/ 10 февраля 2011

В настоящее время я успешно отображаю несколько слоев, используя OpenLayers (Vector и WMS). Мое приложение позволяет пользователю изменять некоторые параметры, которые будут:
* изменить границу
* изменить центр карты
* изменить изображение WMS
Я использую Ajax, чтобы избежать перезагрузки страницы, он работает хорошо, однако, когда некоторые слои загружаются некоторое время, другие, которые еще не перерисованы, все равно отображаются в фоновом режиме (но не связаны вообще с моим новым контекстом). Я хотел бы очистить слои WMS (если это возможно) перед тем, как повторно запросить у сервера новое изображение, но пока ничего не нашел. Я делаю это на векторном слое, вызывая removeAllFeature ();

Спасибо за любую помощь!

Вот мой псевдокод, когда пользователь нажимает кнопку:

$.getJSON("url/updateMapConfig.php",
    {  
      data: $(this).serialize() ,   
      ajax: 'true',   
      cache: 'false'  
    },   
    function(j){  
      if (j.result == 'ok') {  
        var layersToShow = [];  
        // Refresh vector layer  
        for(var i=0;i<map.layers.length;i++) {  
          if (map.layers[i].isVector) {  
            map.layers[i].removeAllFeatures();  
            map.layers[i].refresh({force:true}); // Vector layer  
          }   
        }  
        // Refresh visible layers  
        for(var i=0;i<map.layers.length;i++) {  
          if (map.layers[i].visibility && !map.layers[i].isBaseLayer && !map.layers[i].isVector) { // Refresh visible non base  
              map.layers[i].redraw(true); // Other layer  
          }  
        }  
        // Set new bounds  
        var bounds = new OpenLayers.Bounds();  
          bounds.extend(new OpenLayers.LonLat(j.bounds.xmin-100, j.bounds.ymin-100));  
          bounds.extend(new OpenLayers.LonLat(parseInt(j.bounds.xmax)+100, parseInt(j.bounds.ymax)+100));  
        map.zoomToExtent(bounds);  
        // Move to destination point  
        if (j.poiCenter != "") {  
          eval("map.setCenter(new OpenLayers.LonLat("+j.poiCenter+"))");  
        }  
      }  
    }  
);  

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

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

Я также обнаружил, что эта функция остановит загрузку плитки, если она выполняется.Пример У меня было два базовых слоя: EmptyLayer и Wh whatTiledBGLayer.если потребуется 20 секунд для загрузки плиток WhwhatTiledBGLayer, даже если пользователь выберет переключение на пустой слой, я смогу увидеть запрос, выполненный к серверу для оставшихся плиток в Wh whatTiledBGLayer.прекратить запрашивать слои.

Спасибо за помощь.

1 голос
/ 10 февраля 2011

Я бы использовал mergeNewParams , чтобы установить параметр, который заставляет слой рисовать пустым.Этот метод вызывает перерисовку слоя.Когда ваш обратный вызов возвращается из вашего запроса на обновление, вы делаете обратное, чтобы заставить его снова правильно нарисовать слой.

(я сделал что-то похожее на это, но у меня пока нет источника)

РЕДАКТИРОВАТЬ:

Или - конечно - скрыть слои с помощью visibility свойство слоев.: -)

0 голосов
/ 11 февраля 2011

Вы можете прослушать событие loadstart и loadend слоя WMS и соответственно скрыть / показать слой.

Быстрый тест показал, что вы не можете установить видимость слоя на false при загрузке, потому что OpenLayers прекратит запрашивать новые изображения для слоя и он никогда не будет полностью загружен. Вы можете попробовать использовать layer.display (false / true) и посмотреть, решит ли это вашу проблему. Код должен выглядеть примерно так:

  yourWmsLayer.events.on({
        "loadstart" : function(){
            this.display(false);
        },
        "loadend" : function(){
            this.display(true);
        } 
    });

Кстати, если вы не установили transitionEffect для «изменения размера» на своем слое WMS, то по умолчанию поведение состоит в том, что старые изображения удаляются перед загрузкой новых. Разве это не то, что вы хотите?

...