2010-12-08 20 views
6

Bir kullanıcının OpenLayers'ta birden çok Özellik/Geometri seçmesine kolayca izin verebileceğimi biliyorum, ancak daha sonra kullanıcının seçili özelliklerin tümünü aynı anda kolayca sürükleyip/sürüklemesini etkinleştirmek istiyorum.Birden Çok Seçilen Özelliği Sürükle/Taşı - OpenLayers

ModifyFeature denetimi ile tek seferde tek bir özellik taşır ... seçili özelliklerin tümünü bu katman üzerinde taşımak için bu denetimi (veya her neyse) kolayca genişletmenin bir yolu var mı?

cevap

12

Tamam, ModifyFeature denetimini atlayın ve seçilen özelliklerin kaydını tutmak için SelectFeature denetimine bağlanın ve ardından seçilen noktaları aynı anda işlemek için DragControl kullanın. Kontrol örnekleme ait

Örnek: Olayın

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

Örnek işleme fonksiyonları:

/* 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

Teşekkür - o da benim için çalışıyor, özellikleri sürüklenen edildikten sonra, artık seçim kutusundan "seçilebilir" olduğunu beklemek ve yine taşınamaz. Bu problemin var mıydı? –

+0

Net örnek için, sürükleme ve olaylar hakkında basit bir örnek bulmak neredeyse bir gün sürdü. Bu harika! Ben çoklu özellikler için kullanmıyorum ama 1 için. – Marco

+0

Bulundu, kullanıldı ve çalışıyor :). Yani bir büyük TEŞEKKÜR EDERİZ! – elrado

0

Hmm ...

Ben yukarıdaki kodu denedim ve gelemedi

çalışır. İki sorun: 1) Her özelliği taşımak için, bu özelliğin orijinal konumunu kullanmanız ve DragControl öğesinin kendi kendine göre hareket etmesinden (yani, doDrag öğesinin özellik parametresi) herhangi birinden "sürükleme vektörü" eklemeniz gerekir. 2) DragFeatures'ın kendi kodu onDrag'ı çağırmadan önce lastPixel = pikselini ayarladığından, satır çağırma taşı() özelliği özelliği (0,0) olarak hareket ettirir.

Benim kod şöyle görünür: Ben benzer bir sorun vardı ve DragFeature en moveFeature işlevini geçersiz kılma ve iç this.lastPixel = pikseli koyarak çözmüş

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

Yığın Taşmasına Hoş Geldiniz! YENİ bir sorunuz varsa, lütfen [Soru Sor] (http://stackoverflow.com/questions/ask) düğmesini tıklayarak sorun. Eğer yeterli bir saygınlığa sahipseniz, [http://stackoverflow.com/privileges/vote-up] adresine başvurabilirsiniz. Alternatif olarak, favori olarak "yıldız" ve yeni cevaplardan haberdar edileceksiniz. – jjnguy

0

tüm özelliklerine hareket içinde geçerli olduğunu döngü benim katman vektörüm. Döngünün içinde this.lastPixel = pikselini taşıyana kadar sürüklenenin dışındaki tüm özellikler çılgınca bozuk. Bunun için

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

`

İlgili konular