2017-04-25 30 views
0

有沒有一種在OpenLayers 2中以編程方式移動單個頂點的正確方法?OpenLayers 2 - 以編程方式移動頂點

問題是,我需要防止用戶繪製無效(例如自交)多邊形。爲此,我創建了一個函數來驗證多邊形,然後驗證dragComplete方法OpenLayers.Control.ModifyFeature類中的多邊形(我基於此創建了自己的類)。

基本上,我保存當前頂點位置dragStart方法,那麼我驗證了多邊形dragComplete方法,如果多邊形是無效的,我改變了頂點之前我已經保存的座標的座標。

它正在工作,頂點移回到先前的位置。但拖動和旋轉處理程序存在問題。這些處理程序不關心這個頂點已經移動,它們的位置被設置爲具有這個錯誤頂點的幾何體的中心(在移動之前)。當我拖動或旋轉特徵時,這兩個處理程序都會回到正確的位置。當這個頂點移動時,我需要正確設置它們。

是否有某些事件或方法需要調用才能正常工作?

這是我在dragComplete方法的開頭提出的。

dragComplete: function (vertex) { 
    if (this.feature.geometry.isValid && 
     !this.feature.geometry.isValid()) { 
     vertex.geometry.x = this.vertexPosition.x; 
     vertex.geometry.y = this.vertexPosition.y; 
     this.layer.drawFeature(this.feature); 
    } 

    ... 
} 

它將頂點正確地移動到給定位置。事情是它不會影響拖動處理程序和旋轉處理程序。這是我嘗試使用,未經效應(它會略低於vertex.geometry.y = this.vertexPosition.y;dragComplete法):

this.layer.events.triggerEvent('vertexmodified', { 
    feature: this.feature, 
    vertex: vertex 
}); 
this.layer.events.triggerEvent('featuremodified', { 
    feature: this.feature 
}); 
this.layer.events.triggerEvent('refresh'); 
this.onModification(vertex); 
this.onModification(this.feature); 
this.layer.drawFeature(vertex); 
this.layer.redraw(); 

這一切都不工作。有沒有辦法讓這些處理程序更新?

回答

0

我成功地創建一個簡單的解決方法 - 只要調用rotate方法從geometry對象以零角度和中心點爲原點:

var bounds = this.feature.geometry.bounds; 
var center = { 
    x: bounds.left + (bounds.right - bounds.left)/2, 
    y: bounds.bottom + (bounds.top - bounds.bottom)/2 
}; 
this.feature.geometry.rotate(0, new OpenLayers.Geometry.Point(
    center.x, center.y 
)); 

也許這不是一個完美的方式,但它的工作:)

相關問題