OpenLayers 3変更終了イベント


9

変更後にジオメトリデータを保存したいので、フィーチャの変更が完了した後に発生するイベントが必要です。私はこの投稿から次のものを使用します: リスナー変更インタラクション

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

しかし、このリスナーは1回の変更で何度も起動します。「on」の代わりに「once」を使用している場合、最初の小さな変更のみを起動し、それ以上は起動しないため、実際の変更は保存されません。「changeend」や「modifyend」など、機能の変更が完了したときに起動するものが必要です。何を使用できますか?


2
これは既知の制限です。GitHubの問題が最近作成されました:github.com/openlayers/ol3/issues/2946
エリレム2014年

回答:


10

modifyendイベントが必要な場合は、modifyインタラクション内で使用しないでください(変更インタラクションを使用していると思います)。

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

このイベントは、ol3の最新バージョンで使用できます。私のコードスニップでは、一度に1つの機能のみを変更すると想定しています(getArray()[0])。複数の機能を使用して一度に変更する場合は、機能配列を取得し、さらに操作するためのループを追加します。そのようです:

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

5
それmodifyが変更インタラクションの名前であり、modifyendコードがInteractionを定義した後に来ることを指定する必要がありますvar modify = new ol.interaction.Modify({ features: select.getFeatures() });select私のSelect Interactionの名前です。また、開発者は、コードまたはタイプを取得e.features.getArray()[0].getGeometry().getCoordinates()またはe.features.getArray()[0].getGeometry().getType()取得できます。とにかくいい答え。
2015年

3
多分私は何か間違っているのですが、OL5ではe.features.getArray()[0].getId())、変更している機能が何であれ、常に同じIDを返すようです。変更された機能を確認する別の方法はありますか?
フェリックス・ガニオン-グルニエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.