Evento final de modificação do OpenLayers 3

9

Quero salvar os dados da geometria depois de modificá-los, portanto, preciso de um evento que seja acionado depois que terminar de modificar o recurso. Eu uso o seguinte neste post: ouvinte modificar interação

    var selected_features = select.getFeatures();
// when a feature is selected...
selected_features.on('add', function (event) {
    // get the feature
    var feature = event.element;
    feature.on("change", function (event) {
            logStatus(feature.getId() + " has been changed!\n");
    });
});

Mas esse ouvinte dispara muitas vezes em uma única modificação e, se eu estiver usando 'uma vez' em vez de 'ligado', aciona apenas a primeira pequena alteração e não mais, portanto, não está salvando a mudança real. Preciso de algo como "changeend" ou "modifyend" que será acionado quando terminar de modificar o recurso. O que posso usar?

Jordânia
fonte
2
Essa é uma limitação conhecida. Recentemente, foi criado um problema no GitHub: github.com/openlayers/ol3/issues/2946 .
22614 Erilem

Respostas:

10

Se você precisa de um evento modifyend, por que não o usa na interação de modificação (acho que você usa uma interação de modificação), verifique isso

modify.on('modifyend',function(e){
console.log("feature id is",e.features.getArray()[0].getId());
});

Este evento está disponível nas versões mais recentes do ol3. No meu snip de código, presumo que você modifique apenas uma fetaure de uma vez (getArray () [0]). Se você usar mais de um fetaure para modificar de uma só vez, obtenha o array de fetaures e adicione um loop para manipulação adicional. Igual a:

modify.on('modifyend',function(e){
var features = e.features.getArray();
for (var i=0;i<features.length;i++){
console.log("feature changed id is",features[i].getId());
}
});
Pavlos
fonte
5
Você deve especificar esse modifyé o nome da interação de modificação e que seu modifyendcódigo vem depois de definir a interação: primeiro var modify = new ol.interaction.Modify({ features: select.getFeatures() });e depois o seu código. selecté o nome da minha interação de seleção. Além disso, um desenvolvedor pode fazer e.features.getArray()[0].getGeometry().getCoordinates()ou e.features.getArray()[0].getGeometry().getType()obter as cordas ou o tipo. Bela resposta de qualquer maneira cara.
Slevin
3
Talvez eu esteja fazendo algo errado, mas com o OL5 parece que e.features.getArray()[0].getId())sempre retorna o mesmo ID, independentemente do recurso que estou modificando. Haveria outra maneira de saber qual recurso foi alterado?
Félix Gagnon-Grenier 13/11