OpenLayers удаляет / уничтожает новые функции при уменьшении масштаба

У меня есть слой OpenLayers.Layer.Vector, который я разрешаю пользователю создавать, изменять и удалять объекты и атрибуты объектов. Изменения сохраняются при нажатии кнопки «Сохранить изменения». Если пользователь создает новый объект, а затем увеличивает масштаб карты, OpenLayers удаляет все объекты из слоя и добавляет только объекты, сохраненные в базе данных GeoServer. Я попытался закрепить вновь созданные функции и добавить их обратно на слой в событии «loadend», но OpenLayers разрушил геометрию новых функций, поэтому они бесполезны. Как я могу предотвратить использование OpenLayers новых функций при уменьшении масштаба?


person Hilo    schedule 13.05.2013    source источник
comment
Вот обходной путь, который я сейчас использую: в обработчике загрузки слоя удалите все новые функции, а в обработчике загрузки слоя повторно добавьте все новые функции. OpenLayers не должны удалять функции с состоянием INSERT при запросе db imho.   -  person Hilo    schedule 14.05.2013
comment
Как вы добавляете возможности в openlayers? Похоже, вы рисуете их вручную, а не добавляете на карту.   -  person mrówa    schedule 16.05.2013
comment
Новые элементы рисуются пользователем с помощью элементов управления рисованием OpenLayers, которые добавляют их к слою.   -  person Hilo    schedule 17.05.2013
comment
Я не знаю, почему OpenLayers удаляет ваши новые функции, он не делает этого из коробки. См. openlayers.org/dev/examples/draw-feature.html ‹- здесь работает. Не могли бы вы попробовать сократить код до минимума и разместить его здесь?   -  person mrówa    schedule 17.05.2013
comment
Если вы посмотрите на код OpenLayers.Strategy.BBOX, вы увидите, что он делает это из коробки. Когда вы уменьшаете масштаб, слой запрашивается новым BBOX и вызывает OpenLayers.Strategy.BBOX.merge (), который вызывает this.layer.destroyFeatures (), таким образом удаляя / уничтожая все текущие функции и добавляя обратно только те функции, которые сохранены в базе данных. .   -  person Hilo    schedule 21.05.2013
comment
Хм не думал об этом. В приложении, над которым я работаю, мы не используем BBOX, позволяя редактировать карту. Другое решение - сохранить только координаты x и y и воссоздать из них геометрию при загрузке. Приложение, над которым я работаю, имеет забавный вариант использования OpenLayers, поэтому я делаю запросы к серверу и добавляю / удаляю вектора вручную, чтобы получить больший контроль над процессом.   -  person mrówa    schedule 21.05.2013


Ответы (1)


Я использовал событие featuresremoved, чтобы получить все удаленные функции, а затем проверяю, находится ли оно в состоянии «Вставить». Чтобы предотвратить множественную вставку при многократном уменьшении масштаба, я присвоил этой функции промежуточное состояние. и сделал вставки на loadend, снова изменив состояние на "Insert". Обратите внимание, что у меня есть только один слой редактирования за раз.

var nuevas_features = null;
....
....
....
....
eventListeners: {

'loadstart': function(evt) {
    nuevas_features = null;

},
'featuresremoved' : function(algunfeature) {

    nuevas_features = null;
    nuevas_features = new Array();

    $(algunfeature.features).each(function(index, feature)
    {
           if(feature.state === 'Insert' )
           {    
               var feature_clonada = feature.clone();
               feature_clonada.state = "transicion";
               nuevas_features.push(feature_clonada);
           }
    });
},
'loadend': function(evt) {

    $(nuevas_features).each(function(index, feature)
    {
           feature.state = "Insert";
           editingLayer.addFeatures(feature);
    });
    console.log('end');

}

}

person user2631985    schedule 14.11.2016