OpenLayers 3 memodifikasi acara akhir

9

Saya ingin menyimpan data geometri setelah saya memodifikasinya, jadi saya perlu acara yang diaktifkan setelah saya selesai mengubah fitur. Saya menggunakan berikut ini dari posting ini: pendengar memodifikasi interaksi

    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");
    });
});

Tapi pendengar ini menembak terlalu banyak kali dalam satu modifikasi, dan jika saya menggunakan 'satu kali' bukan 'pada' itu hanya api perubahan kecil pertama dan tidak lebih, sehingga tidak menyimpan perubahan nyata. Saya memerlukan sesuatu seperti "changeend" atau "memodifikasiend" yang akan diaktifkan ketika saya akan selesai untuk memodifikasi fitur, apa yang bisa saya gunakan?

Yordania
sumber
2
Ini adalah batasan yang diketahui. Masalah GitHub telah dibuat untuk itu baru-baru ini: github.com/openlayers/ol3/issues/2946 .
erilem

Jawaban:

10

Jika Anda memerlukan acara ubah mengapa Anda tidak menggunakannya dalam interaksi ubah (saya kira Anda menggunakan interaksi ubah) periksa ini

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

Acara ini tersedia dalam versi terbaru ol3. Dalam snip kode saya, saya menganggap Anda hanya mengubah satu kegagalan sekaligus (getArray () [0]). Jika Anda menggunakan lebih dari satu fetaure untuk memodifikasi sekaligus, dapatkan array fetaures dan tambahkan loop untuk manipulasi lebih lanjut. Seperti itu:

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
sumber
5
Anda harus menentukan bahwa itu modifyadalah nama Interaksi Ubah dan bahwa modifyendkode Anda datang setelah mendefinisikan Interaksi: pertama var modify = new ol.interaction.Modify({ features: select.getFeatures() });dan kemudian kode Anda. selectadalah nama Interaksi Pilih saya. Juga seorang pengembang dapat melakukan e.features.getArray()[0].getGeometry().getCoordinates()atau e.features.getArray()[0].getGeometry().getType()untuk mendapatkan coords atau tipenya. Jawaban yang bagus sih Bung.
slevin
3
Mungkin saya melakukan sesuatu yang salah, tetapi dengan OL5 sepertinya e.features.getArray()[0].getId())selalu mengembalikan id yang sama apa pun fitur yang saya modifikasi. Apakah ada cara lain untuk mengetahui fitur mana yang telah diubah?
Félix Gagnon-Grenier