2009-05-19 4 views
2

J'ai créé un site link text en utilisant l'API produite par Ordnance Survey (je pense que cela s'appelle OpenSpace) qui est basée sur OpenLayers. Je l'ai donc vous pouvez cliquer sur la carte pour ajouter un marqueur et je veux ensuite pouvoir cliquer sur les marqueurs et le faire glisser sur la carte. Existe-t-il un moyen simple de le faire en utilisant l'API OpenSpace ou OpenLayers.Glisser des marqueurs avec Ordnance Survey/Openlayers api

Répondre

6

L'API OpenLayers vous permet d'ajouter des marqueurs et des fonctionnalités à la carte. Si vous ajoutez des fonctionnalités plutôt que des marqueurs, vous pouvez les faire glisser en ajoutant le code suivant.

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

Ceci vous permettra de faire glisser des entités autour d'une carte. Si vous souhaitez ajouter un comportement personnalisé lorsque vous faites glisser des objets, vous pouvez enregistrer des écouteurs sur vectorLayer. Par exemple, pour enregistrer un écouteur lorsque des fonctions sont modifiées (c'est-à-dire déplacées et relâchées), vous devez utiliser le code suivant.

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

Pour une liste complète des événements qui peuvent être écoutées pour voir le OpenLayers api doc OpenLayers api doc

+0

Je viens d'utiliser le code ci-dessus et cela fonctionne bien en dehors d'un problème: lorsque vous faites glisser/déplacer le marqueur, puis zoom avant ou arrière, ma fonction de vecteur disparaît. Des idées? – nickdos

1

Comme moyen plus facile de le faire est en utilisant la commande de traînée OpenLayer, qui prend une couche vectorielle comme cible.

En supposant une couche vecteur contenant des icônes (ce qui est préféré à des marqueurs, que les développeurs de OL décourageait l'emploi), des vecteurs appelés, vous pouvez simplement faire:

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

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

L'autre avantage d'utiliser le contrôle de traînée est vous pouvez vous connecter à divers rappels, qui renvoient la position de la fonction et du pixel, comme onStart et onDrag. par exemple,

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

Voir http://trac.osgeo.org/openlayers/browser/trunk/openlayers/lib/OpenLayers/Control/DragFeature.js pour plus de détails.

Questions connexes