2010-12-08 2 views
6

Я знаю, что я могу легко разрешить пользователю выбирать несколько функций/геометрий в OpenLayers, но затем я хочу, чтобы пользователь мог легко перетащить/переместить все выбранные функции одновременно.Перемещение/перемещение нескольких выбранных функций - OpenLayers

С помощью управления ModifyFeature он перемещает только одну функцию за раз ... есть ли способ легко расширить этот элемент управления (или что-то работает), чтобы переместить все выбранные объекты на этом уровне?

ответ

12

Хорошо, пропустите управление 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; 
    } 
} 
+0

Спасибо за это - это работает для меня также, не ожидал, что когда-то особенности оттащили, они больше не«выбирается»из окна выбора, и не могут быть перемещены снова. У вас была эта проблема? – 2011-02-14 10:53:42

+0

Спасибо за простой пример, мне потребовался почти день, чтобы найти простой пример перетаскивания и событий. Это здорово! Я не использую его для нескольких функций, но для 1. – Marco 2011-04-07 09:49:01

0

Хм ...

Я попробовал код выше, и не может сделать он работает. Два вопроса: 1) Чтобы переместить каждую функцию, вам нужно использовать исходное положение этой функции и добавить «вектор перетаскивания» из любой функции, которую DragControl перемещает сам по себе (т. Е. Параметр функции toDrag). 2) Поскольку собственный код DragFeatures устанавливает lastPixel = pixel перед вызовом onDrag, вызов вызова 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); 
     } 
    } 
} 
0

Я имел подобную проблему и решить ее с помощью переопределения функции moveFeature DragFeature и положить this.lastPixel = пиксель внутри для цикла, который применяет ход ко всем функциям в пределах мой вектор слоя. Пока я не переместил this.lastPixel = пиксель внутри цикла, все функции, кроме тех, которые были перетащены, были безумно искажены.

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

`

Смежные вопросы