2012-04-13 5 views
0

Ich bin eine Linie zu schaffen, die mit diesem Code bearbeitet werden können:Openlayers speichern eine Funktion

var line_points = Array(); 
    var lineLayer = new OpenLayers.Layer.Vector(label); 
    this.map.addLayer(lineLayer); 
    this.map.addControl(new OpenLayers.Control.DrawFeature(lineLayer, OpenLayers.Handler.Path)); 

    for (x in points) { 
     var point = points[x].split(','); 
     var lat = parseFloat(point[0]); 
     var lon = parseFloat(point[1]); 
     line_points[x] = new OpenLayers.Geometry.Point(this.Lon2Merc(lon), this.Lat2Merc(lat)); 
    } 

    var line = new OpenLayers.Geometry.LineString(line_points); 
    var lineFeature = new OpenLayers.Feature.Vector(line, null, style); 

    lineLayer.addFeatures([lineFeature]); 

Ich versuche, die Breiten- und Längengrade aus dieser Funktion zu ziehen, wenn ein Punkt bewegt wird oder geschaffen Aktualisieren Sie ein HTML-Formular, das dann zum Speichern dieser Daten verwendet wird. Ich habe von den Protokollen und dem Zeug gehört, denke aber, dass das nicht das Richtige für mich ist.

Könnte mir bitte jemand in die richtige Richtung zeigen?

EDIT: Ich habe versucht, immer die Details aus dem HTML-Code direkt:

var x = 0; 
    var y = 0; 
    $.each(document.getElementById("OpenLayers.Geometry.LineString_195").getAttribute("points").split(','), function(index, value) { 
     if(index%2){ 
      y = value; 
      console.log(MercatorToLatLon(x,y).Lat + "," + MercatorToLatLon(x,y).Lon); 
     } else { 
      x = value; 
     } 
     //console.log(value); 
    }); 

aber dies scheint keine sinnvollen Werte zu geben, und in keiner bestimmten Reihenfolge, die ich seltsam finde.

Antwort

1

Sie können die Operation getVertices verwenden, um alle aktuellen Längen- und Breitengrade der Punkte in der Funktion abzurufen.

Also rufen Sie Folgendes, wenn Sie Ihren HTML-Code aktualisieren möchten.

console.log(lineFeature.geometry.getVertices()); 

Update per Kommentar:

function report(event) { 
    console.log(event.feature.geometry.getVertices()); 
    console.log(event.type, event.feature ? event.feature.id : event.components); 
} 
lineLayer.events.on({ 
    "beforefeaturemodified": report, 
    "featuremodified": report, 
    "afterfeaturemodified": report, 
    "vertexmodified": report, 
    "sketchmodified": report, 
    "sketchstarted": report, 
    "sketchcomplete": report 
}); 
+0

bevor ich akzeptiere, ist es möglich, eine Funktion auszulösen, immer wenn sich die Geometrie ändert? – Josh

+0

Sure sehe mein Update. Ich denke, Sie möchten vielleicht 'Feature geändert' – capdragon

+0

Schöne Sachen! Prost. – Josh

1

Geometrie Zugriff auf Werte direkt aus dom ist wahrscheinlich nicht die beste Idee. Besser und einfacher zu verwenden OpenLayers API.

Sie featuremodified Ereignis Layers abonnieren und dann Zugriff auf modifizierte Funktion:

lineLayer.events.on({"featuremodified": function(feature){ 
    console.log(feature.geometry.getVertices()); 
}}); 

Sie auf andere Ereignisse hören, zum Beispiel "featureadded", "featureremoved" usw.

Hope you bekomme eine Vorstellung.

+0

Dies würde fehlschlagen, da das Ereignis kein Feature, sondern ein Objekt zurückgibt, das ein Feature enthält. also 'feature.geometry' wird zurückgeben Geometrie ist nicht definiert. – capdragon