2009-05-19 6 views
2

Я создал сайт link text с использованием api, созданного Surd Survey (я думаю, это называется OpenSpace), который основан на OpenLayers. У меня есть это, поэтому вы можете щелкнуть по карте, чтобы добавить маркер, и я хочу, чтобы затем щелкнуть маркеры и перетащить его по карте. Есть ли простой способ сделать это, используя OpenSpace или OpenLayers apis.Перетаскивание маркеров с помощью обряда/Openlayers api

ответ

6

OpenLayers api позволяет добавлять маркеры и функции к карте. Если вы добавите функции, а не маркеры, вы можете сделать их перетаскиваемыми, добавив следующий код.

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 апи документ OpenLayers api doc

+0

Я только что использовал код выше, и он отлично работает, кроме одной проблемы: когда перетащить/переместить маркер, а затем увеличить или уменьшить масштаб, моя векторная функция исчезает. Есть идеи? – nickdos

1

Как более простой способ сделать это с помощью регулятора сопротивления openlayer, который принимает векторный слой в качестве цель.

Предполагая векторный слой, содержащий значки (это предпочитаемый к маркерам, которые разработчики ПР отговорить использование), называемые векторам, вы можете просто сделать:

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.