2009-05-19 69 views
2

我已经创建了一个基于OpenLayers的使用由Ordnance Survey(我认为这叫做OpenSpace)生成的API的网站link text。我已经得到了它,所以你可以点击地图添加一个标记,然后我想要点击标记并在地图上拖动它。有没有简单的方法来使用OpenSpace或OpenLayers API进行此操作。使用Ordnance Survey/Openlayers API拖动标记

回答

6

OpenLayers api允许您将标记和要素添加到地图。如果添加Features而不是Markers,则可以通过添加以下代码使它们可拖动。

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

这将允许您拖动地图周围的功能。如果要在拖动要素时添加自定义行为,可以在vectorLayer上注册侦听器。例如,要在功能被修改(即拖动和释放)时注册侦听器,您需要使用以下代码。

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

对于可以边听边看的的OpenLayers API文档OpenLayers api doc

+0

我刚刚使用了上面的代码,除了一个问题之外,它工作得很好:当拖动/移动标记然后放大或缩小时,我的矢量特征消失。有任何想法吗? – nickdos 2010-08-20 05:13:23

1

至于更简单的方式做,这是通过使用openlayer拖动控制,这需要一个载体层作为事件的完整列表目标。

假设包含图标的载体层(这是首选到标记,OL的开发商劝阻使用哪个),称为载体,可以简单地做:

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

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

使用拖曳控制的另一个优点是您可以挂钩到各种回调函数,这些回调函数返回像素位置和像素位置,例如onStart和onDrag。例如,

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

查看http://trac.osgeo.org/openlayers/browser/trunk/openlayers/lib/OpenLayers/Control/DragFeature.js了解更多详情。