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