2017-04-25 2 views
0

Gibt es eine korrekte Möglichkeit, einen einzelnen Vertex programmatisch in OpenLayers 2 zu verschieben?OpenLayers 2 - Vertex programmatisch verschieben

Das Problem ist, ich muss verhindern, dass Benutzer ungültige Polygone zeichnen (z. B. sich selbst kreuzende). Um dies zu tun, habe ich eine Funktion erstellt, um Polygone zu validieren, und dann validiere ich die Polygone in dragComplete Methode von OpenLayers.Control.ModifyFeature Klasse (Ich habe meine eigene Klasse basierend auf diesem).

Grundsätzlich speichern ich aktuelle Vertex-Position in dragStart Methode, dann validiere ich das Polygon in dragComplete Methode, und wenn das Polygon nicht gültig ist, ändere ich die Koordinaten des Scheitelpunkts auf die Koordinaten, die ich zuvor gespeichert habe.

Es funktioniert, der Scheitelpunkt bewegt sich zurück zur vorherigen Position. Aber es gibt ein Problem mit Ziehen und Drehen-Handlern. Diese Handler kümmern sich nicht darum, dass dieser Vertex verschoben wurde, sie sind Positionen, die auf den Mittelpunkt der Geometrie mit diesem falschen Vertex (bevor er verschoben wurde) gesetzt sind. Beide Handler kehren zur richtigen Position zurück, wenn ich die Funktion ziehe oder drehe. Ich brauche sie richtig eingestellt zu sein, wenn dieser Eckpunkt bewegt wird.

Gibt es ein Ereignis oder eine Methode, die ich aufrufen muss, damit es korrekt funktioniert?

Dies ist, was ich am Anfang der dragComplete Methode gestellt habe.

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

    ... 
} 

Sie verschiebt den Scheitelpunkt an die angegebene Position. Die Sache hat keine Auswirkungen auf den Drag-Handler und den Rotations-Handler. Dies ist, was ich zu verwenden versucht, ohne Wirkung (es geht nur unter vertex.geometry.y = this.vertexPosition.y; in dragComplete-Methode):

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

Nichts davon funktioniert. Gibt es eine Möglichkeit, diese Handler zu aktualisieren?

Antwort

0

ich es geschafft, eine einfache Abhilfe zu schaffen - aufgerufen nur rotate Methode aus dem geometry Objekt mit Null als Winkel und Mittelpunkt als Ursprung:

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

es ist nicht eine perfekte Art und Weise Mag sein, aber es funktioniert :)

Verwandte Themen