2016-10-19 3 views
1

Я преобразовал приложение карты OpenLayers 2 в OpenLayers 3. Карта состоит из двух групповых слоев (базовых карт и надстроек), которые определены в коде Javascript. Однако, когда страница загружается (или автоматически обновляется), она считывает из файла XML и динамически загружает слои объектов в карту.OpenLayers 3 removeLayer failure?

Эта часть все хорошо работает. У меня проблема с программой, которая, как часть функции автоматического обновления страницы, должна удалить все динамически добавленные слои.

Мой исходный код:

function erase_and_reload(){ 
 
\t \t console.log("erase_and_reload has fired!"); 
 
\t \t map.getLayers().forEach(function(layer){ 
 
\t \t \t console.log("Existing layer that needs to be removed ?:"); 
 
\t \t \t console.log(layer); 
 
\t \t \t 
 
\t \t \t var name = layer.get('name'); 
 
\t \t \t var title = layer.get('title'); 
 
\t \t \t console.log("layer name = " + name + " layer title = " + title); 
 
      
 
\t \t \t if (name){ 
 
\t \t \t \t console.log("Found layer named = " + name); 
 
\t \t \t \t console.log("Removing layer named: " + name); 
 
\t \t \t \t map.removeLayer(layer); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t 
 
\t \t }); 
 

 
// reload 
 
\t read_WW_xml(); 
 
}

(. Да, у меня есть журнал console.log записей в здесь, чтобы попытаться понять вещи)

Так , если я запустил это как есть ... запись в журнале «Существующий слой, который нужно удалить?» получает 10 раз, указывая мне, что 10 слоев. Когда я смотрю на объекты слоя, я вижу базовые карты, Overlays и другие. Но некоторые другие слои, которые действительно имеют свойства «имени», полностью отсутствуют.

Но если я запустил это с линией «map.removeLayer (layer)», прокомментировал, теперь, когда строка «Существующий слой» получается 17 раз! Появилось еще семь объектов слоя!

(FYI: фраза «название» все еще там, потому что сначала я думал, что проблема имеет какое-то отношение к свойству «name», поэтому я временно попробовал сопоставить свойство «title». «если заголовок не« Базовые карты »или« Наложения », а затем removeLayer, но это ведет себя точно так же.)

Даже если .removeLayer не удаляет слой, я думаю, я не уверен почему все это так или иначе прерывании цикл 7 итераций ... до того момента, когда она даже не писать первые два console.logs ??

Спасибо!

- = Dave = -

+0

Вы попробуйте использовать 'map.getOverlays() Clear();' и 'map.getLayers() четкие();'.? – Sefran2

+0

Похоже, если я делаю «layer.getSource(). Clear();» .... но обходит слои с заголовком «Базовые карты» и «Наложения» (что, следовательно, обходит их вложенные слои) ... что, по-видимому, эффективно стирает функции из каждого уровня для перерисовки. НО, независимо от того, нужен ли данный слой с динамическим питанием, когда обновление следующей страницы может измениться. Итак, если я запустил эту вещь в течение нескольких дней, может возникнуть наращивание ненужных слоев. Я хочу, чтобы removeLayer работал! – DaveyBoy

ответ

3

Это на самом деле не прервать эти 7 итераций, он просто пропускает эти элементы массива.

В вашем цикле forEach имеется массив ссылок на слои карты. Если вы берете элемент этого массива (ссылка - «слой»), и вы удаляете его с карты, как есть, вы удаляете ссылку, поэтому она больше не находится ни на карте, ни в вашем массиве, и случайно есть другая ссылка на этот массив индекс.

Так что если у вас есть массив:

0: layer0, название "layer0"

1: layer1, название "layer1"

2: LAYER2

после этого Foreach там будет остаются

0: layer1, название "layer1"

1: layer2

потому что после удаления слоя 0 есть слой 1 по индексу 0 и ПОСЛЕ того, что forEach перемещается вдоль (в индекс 1), где он уже находит слой без имени.

Чтобы решить это, просто использовать функции getArray() и slice() (дублировать ссылочный массив), что-то вроде этого:.

var refArray = map.getLayers().getArray().slice(); 
ref.forEach(function(layer) 
{ 
    //your stuff 
} 
+0

Это похоже на работу! Большое спасибо за объяснение! – DaveyBoy

0

Вы можете попробовать

function erase_and_reload(){ 
    map.getOverlays().clear(); 
    map.getLayers().clear(); 

    // reload 
    read_WW_xml(); 
} 
+0

Ну, я бы предпочел не тратить ресурсы, перерисовывая базовую группу базовой карты и группу Layers Overlays. Это не изменится. map.getLayers(). Clear(), кажется, протирает все слои ... все .... – DaveyBoy