2016-08-29 4 views
3

クライアントが地図上にポリゴンを描くことができるOpenLayers 3でインタラクティブマップを作成しようとしています。描画されたポリゴン。私はCodePENの素敵なチュートリアルを見つけました。これはドローイングのやり取りに使用しています。ここで私はマップ上に新しいポリゴン描画するために使用するコードです:それは見ることができるように描画が終了し、openlayersのフィーチャリストに新しいポリゴンが追加されたときにイベントを発生させます3

var curMap = this; 

this.draw_interaction = new ol.interaction.Draw({ 
    source: this.vectorLayer.getSource(), 
    type: /** @type {ol.geom.GeometryType} */ ('Polygon') 
}); 

this.map.addInteraction(this.draw_interaction); 

// when a new feature has been drawn... 
this.draw_interaction.on('drawend', function(event) { 
    curMap.map.removeInteraction(curMap.draw_interaction); 
    var id = 'addedpoly '+curMap.vectorLayer.getSource().getFeatures().length; 

    event.feature.setId(id); 
    event.feature.setStyle(curMap.defaultPolyStyle); 

    console.log(event.feature); 
    curMap.saveData('GeoJSON'); 
}); 

は、全体のコードは、私は、描画に必要な値の異なる種類を格納しているJavaScriptのオブジェクト、に包まれています。 this.saveData()関数は、新しいポリゴンが追加された後、すべてのポリゴン座標が追加された後、私のための配列を返さなければなりません。しかし、これを行う代わりに、最後のポリゴンの前に追加されたポリゴンだけを返します。ここではその関数のコードは次のとおりです。

Map.prototype.saveData = function (data_type) { 
    var format = new ol.format[data_type](), data, curMap = this; 

    try { 
     data = format.writeFeatures(curMap.vectorLayer.getSource().getFeatures()); 
    } catch (e) { 
     alert(e.name + ": " + e.message); 
     return; 
    } 

    if (data_type === 'GeoJSON') { 
     console.log(JSON.parse(data)); 
     data=JSON.parse(data); 
     for (var i=0;i<data.features.length ;i++) 
     { 
      if (data.features[i].geometry.type != 'Point') console.log(i, data.features[i]); 
     } 
     console.log(JSON.stringify(data, null, 4)); 
    } else { 
     var serializer = new XMLSerializer(); 
     console.log(serializer.serializeToString(data)); 
    } 
} 

私は最後に追加されたポリゴンは決してありません理由です、ちょうど描かれた新しいポリゴンフィーチャは、ちょうどthis.saveData()機能火事の後、機能リストに追加されていることを前提とし捕まえた。新しい機能がマップに追加された直後に、this.saveData()機能を強制的に起動する方法、イベントリスナーがありますか?

答えて

6

ので、機能があるときに(本当に)の代わりにdrawendol.source.Vectorに追加聴く:

this.vectorLayer.getSource().on('addfeature', function(event){ 
    // ... 
}); 
+0

おかげで多くのことを、このために、私はドロー相互作用にイベントとしてこれを追加することをお勧めしたいことができます。 – zsero

+1

@CoreyAlix反対です。 "once"は、あなたが聴いているイベントでハンドラが一度起動されたことを意味します。したがって、OPはまったく同じシナリオで座り、ハンドラだけが一度発射します。 「一度」は「イベントが終了すると」発射しません。それは単にいつでも発射しません。 – DeVil

関連する問題