2009-05-19 4 views
2

Ich habe eine Website link text mit dem Api erstellt von der Ordnance Survey erstellt (ich glaube, das heißt OpenSpace), die auf OpenLayers basiert. Ich habe es so, dass Sie auf die Karte klicken können, um eine Markierung hinzuzufügen, und ich möchte dann in der Lage sein, auf die Markierungen zu klicken und sie über die Karte zu ziehen. Gibt es eine einfache Möglichkeit, dies mit OpenSpace oder OpenLayers apis zu tun?Ziehen von Markern mit Ordnance Survey/Openlayers api

Antwort

6

Mit der OpenLayers API können Sie Markierungen und Funktionen zur Karte hinzufügen. Wenn Sie Features anstelle von Markern hinzufügen, können Sie sie durch Hinzufügen des folgenden Codes ziehbar machen.

var vectorLayer = new OpenLayers.Layer.Vector("Vector Layer"); 
var osMap = new OpenSpace.Map('map'); 
osMap.addLayer(vectorLayer); 

var modifyFeaturesControl = new OpenLayers.Control.ModifyFeature(vectorLayer); 
modifyFeaturesControl.mode = OpenLayers.Control.ModifyFeature.RESHAPE; 
osMap.addControl(modifyFeaturesControl); 
modifyFeaturesControl.activate(); 

Damit können Sie Features um eine Karte ziehen. Wenn Sie beim Ziehen von Objekten ein benutzerdefiniertes Verhalten hinzufügen möchten, können Sie Listener auf der Vektorschicht registrieren. Um beispielsweise einen Listener zu registrieren, wenn Features geändert (z. B. verschoben und freigegeben) werden, müssen Sie den folgenden Code verwenden.

vectorLayer.events.register('featuremodified', vectorLayer, function(feature) { 
    //custom behavior 
}); 

Für eine vollständige Liste der Ereignisse, die die Openlayers api doc angehört werden können OpenLayers api doc

+0

Ich habe nur den obigen Code verwendet und es funktioniert gut abgesehen von einem Problem: Wenn Sie den Marker ziehen und verschieben und dann hinein- oder herauszoomen, verschwindet meine Vektor-Funktion. Irgendwelche Ideen? – nickdos

1

Als einfacher Weg, um zu sehen dies mit der Openlayers Drag Steuerung zu tun ist, die eine Vektorebene als nimmt Ziel.

eine Vektorebene enthält Symbole Angenommen (dies Marker bevorzugt wird, die die Entwickler von OL discourage verwenden), die so genannte Vektoren, können Sie einfach tun:

var drag=new OpenLayers.Control.DragFeature(vectors); 

map.addControl(drag); 
drag.activate(); 

Der andere Vorteil der Drag Kontrolle der Verwendung ist dass Sie verschiedene Callbacks verwenden können, die das Feature und die Pixelposition zurückgeben, z. B. onStart und onDrag. zB

var drag=new OpenLayers.Control.DragFeature(vectors,{  
    'onDrag':function(feature, pixel){ 
      console.log(pixel.x);//this can be used to do something else, such as move another feature 
    } 
}); 

Weitere Details finden Sie unter http://trac.osgeo.org/openlayers/browser/trunk/openlayers/lib/OpenLayers/Control/DragFeature.js.