Geometry 拖动/移动多个选定功能-OpenLayers

Geometry 拖动/移动多个选定功能-OpenLayers,geometry,openlayers,drag,Geometry,Openlayers,Drag,我知道我可以很容易地允许用户在OpenLayers中选择多个特征/几何图形,但我希望用户能够同时轻松地拖动/移动所有选定的特征 使用ModifyFeature控件,它一次只移动一个功能。。。是否有一种方法可以轻松扩展此控件(或任何有效的方法)以移动该层上的所有选定功能?好的,跳过ModifyFeature控件,只需勾入SelectFeature控件即可跟踪选定的功能,然后使用DragControl同时操纵选定的点 控件实例化的示例: var drag = new OpenLayers.Contr

我知道我可以很容易地允许用户在OpenLayers中选择多个特征/几何图形,但我希望用户能够同时轻松地拖动/移动所有选定的特征


使用
ModifyFeature
控件,它一次只移动一个功能。。。是否有一种方法可以轻松扩展此控件(或任何有效的方法)以移动该层上的所有选定功能?

好的,跳过
ModifyFeature
控件,只需勾入
SelectFeature
控件即可跟踪选定的功能,然后使用
DragControl
同时操纵选定的点

控件实例化的示例:

var drag = new OpenLayers.Control.DragFeature(vectors, {
  onStart: startDrag,
  onDrag: doDrag,
  onComplete: endDrag
});
var select = new OpenLayers.Control.SelectFeature(vectors, {
  box: true,
  multiple: true,
  onSelect: addSelected,
  onUnselect: clearSelected
});
事件处理功能的示例:

/* Keep track of the selected features */
function addSelected(feature) {
    selectedFeatures.push(feature);
}

/* Clear the list of selected features */
function clearSelected(feature) {
    selectedFeatures = [];
}

/* Feature starting to move */
function startDrag(feature, pixel) {
    lastPixel = pixel;
}

/* Feature moving */
function doDrag(feature, pixel) {
    for (f in selectedFeatures) {
        if (feature != selectedFeatures[f]) {
            var res = map.getResolution();
            selectedFeatures[f].geometry.move(res * (pixel.x - lastPixel.x), res * (lastPixel.y - pixel.y));
            vectors.drawFeature(selectedFeatures[f]);
        }
    }
    lastPixel = pixel;
}

/* Featrue stopped moving */
function endDrag(feature, pixel) {
    for (f in selectedFeatures) {
        f.state = OpenLayers.State.UPDATE;
    }
}

我尝试了上面的代码,但无法运行。两个问题: 1) 要移动每个特征,需要使用该特征的原始位置,并从DragControl自身移动的任何特征(即特征参数到doDrag)添加“拖动向量”。 2) 由于DragFeatures自己的代码在调用onDrag之前设置lastPixel=pixel,因此调用move()的行将该功能移动到(0,0)

我的代码如下所示:

var lastPixels;
function startDrag(feature, pixel) {
    // save hash with selected features start position
    lastPixels = [];
    for( var f=0; f<wfs.selectedFeatures.length; f++){
         lastPixels.push({ fid: layer.selectedFeatures[f].fid, 
                           lastPixel: map.getPixelFromLonLat( layer.selectedFeatures[f].geometry.getBounds().getCenterLonLat() )
                         });
    }
}

function doDrag(feature, pixel) {
    /* because DragFeatures own handler overwrites dragSelected.lastPixel with pixel before this is called, calculate drag vector from movement of "feature" */
    var g = 0;
    while( lastPixels[g].fid != feature.fid ){ g++; }
    var lastPixel = lastPixels[g].lastPixel;

    var currentCenter =  map.getPixelFromLonLat( feature.geometry.getBounds().getCenterLonLat() );
    var dragVector = { dx: currentCenter.x - lastPixel.x, dy: lastPixel.y - currentCenter.y };

    for( var f=0; f<layer.selectedFeatures.length; f++){
         if (feature != layer.selectedFeatures[f]) {
             // get lastpixel of this feature
             lastPixel = null;
             var h = 0;
             while( lastPixels[h].fid != layer.selectedFeatures[f].fid ){ h++; }
             lastPixel = lastPixels[h].lastPixel;

             var newPixel = new OpenLayers.Pixel( lastPixel.x + dragVector.dx, lastPixel.y - dragVector.dy );
             // move() moves polygon feature so that centre is at location given as parameter
             layer.selectedFeatures[f].move(newPixel);
         }
    }
}
var像素;
功能启动标签(功能、像素){
//将哈希值与选定的功能开始位置一起保存
lastPixels=[];

对于(var f=0;f我遇到了一个类似的问题,通过覆盖DragFeature的moveFeature函数并将此.lastPixel=pixel放入将移动应用于层向量中所有特征的for循环中,我解决了这个问题。在我将此.lastPixel=pixel移至循环中之前,除被拖动的特征外,所有特征都疯狂扭曲

 `OpenLayers.Control.DragFeature.prototype.moveFeature = function (pixel) {

        var res = this.map.getResolution();         
        for (var i = 0; i < vector.features.length; i++) {
            var feature = vector.features[i];
            feature .geometry.move(res * (pixel.x - this.lastPixel.x),
                res * (this.lastPixel.y - pixel.y));
            this.layer.drawFeature(feature );
            this.lastPixel = pixel;
        }
        this.onDrag(this.feature, pixel);
    };
`OpenLayers.Control.DragFeature.prototype.moveFeature=函数(像素){
var res=this.map.getResolution();
对于(var i=0;i

`

谢谢您的帮助-这对我来说也很有用,希望一旦拖动了这些功能,它们就不再是“可选择的”从选择框中,无法再次移动..您有此问题吗?感谢清晰的示例,我花了将近一天的时间找到了一个关于拖动和事件的简单示例。这一个非常好!我不是将其用于多个功能,而是用于1。欢迎使用堆栈溢出!如果您有新问题,请单击按钮询问。如果你有足够的声誉,这个问题。或者,“星”它作为最喜欢的,你会被通知任何新的答案。