2012-01-12 16 views
12

Şu anda OpenLayers.Layer.Vector'da bir vektör seçmek (veya vurgulamak) için bir çözüm arıyor.OpenLayers'ta bir vektör katmanında programlı bir özellik nasıl seçilir?

Kullanıcının katmanda karşılık gelen vektörü vurgulaması gereken bir vektörü (WKT formatlı dizesi olarak verilen) seçebileceği basit bir ızgara oluşturabilirim. Izgarada bulunan tüm vektörler, kullanıcı siteyi ziyaret ettiğinde haritadaki vektör katmanına çizilir.

Ben de OpenLayers.Control.ModifyFeature 'ın selectFeature(feature) işlev veya OpenLayers.Control.SelectFeature (belirli (özelliği) işlevi dev.openlayers.org/apidocs/files/OpenLayers/Control/SelectFeature-js.html's bkz gerektiğini öğrendim (Muhtemelen mevcut değildir veya artık mevcut değildir?) Daha fazla bilgi için bir Posta Listesinden bir gönderiye bakın: osgeo-org.1803224.n2.nabble.com/Programatic-Select-a-Feature-tt2192485.html#a2193928 infos.

hiçbir başarı ile yapmak istedim, bu yüzden birisi bu kod satırları kapmak olabilir ve bana bir çalışma kod parçacığını ;-)

// ... some initializing code 
this.vlayer = new OpenLayers.Layer.Vector("VectorLayer"); // VectorLayer 

// some controls 
this.openLayerControlPoint = new OpenLayers.Control.DrawFeature(this.vlayer, OpenLayers.Handler.Point); 
this.openLayerControlPolygon = new OpenLayers.Control.DrawFeature(this.vlayer, OpenLayers.Handler.Polygon); 
this.openLayerControlModify = new OpenLayers.Control.ModifyFeature(this.vlayer, { 
    mode: OpenLayers.Control.ModifyFeature.RESHAPE | OpenLayers.Control.ModifyFeature.DRAG, 
    standalone: false 
}); 

// just deactivate to make sure everything is really deactivated 
this.openLayerControlPoint.deactivate(); 
this.openLayerControlPolygon.deactivate(); 
this.openLayerControlModify.deactivate(); 

// add the just created layer to the map 
this.map.addLayer(this.vlayer); 

// add all (deactivated) controls to the map 
this.map.addControl(this.openLayerControlPoint); 
this.map.addControl(this.openLayerControlPolygon); 
this.map.addControl(this.openLayerControlModify); 
gösterebilirim umut kodunda Sonra

:

// ... another function doing the action 
selectVector: function(wktVector) { 
    this.openLayerControlModify.activate(); 

    // this is no elegant solution, this should only show how I would 
    // test the functionallity. 
    for (var i = 0; i < this.vlayer.features.length; ++i) { 
    // returns a WKT formatted string: 
    // 'POLYGON((xxxx.xxx xxxx.xxx), (xxxx.xxx xxxx.xxx))' 
    var wktVectorCurrent = this.vlayer.features[i].geometry.toString(); 
    if (wktVector == wktVectorCurrent) { 
     // \/ doesn't work :-(
     this.openLayerControlModify.selectFeature(this.vlayer.features[i]); 
     break; 
    } 
    } 
} 

cevap

20

Sana bir özelliği seçmek için ModifyFeature kullanırken neden anlamıyorum. OpenLayers.Control.SelectFeature özellikle özellikleri seçmek için yapılır, bu nedenle bu denetimi yerine kullanmanızı öneririz.

Yani, SelectFeature kontrolünü oluşturun: sende Ardından

var selectFeature = new OpenLayers.Control.SelectFeature(this.vlayer); 
selectFeature.activate(); 

if-ifadesi kullanmak seçme yöntemi (Ben size geometri karşılaştırarak seçmek istediğiniz bir özelliği bulmak için çalıştığını tahmin?):

if (wktVector == wktVectorCurrent) { 
    selectFeature.select(this.vlayer.features[i]); 
} 
belgelere göre

seçilmiş olarak özelliğini işaretlemek ve uygun olayları yükseltmek gerekir bu yöntem:

* Method: select 
* Add feature to the layer's selectedFeature array, render the feature as 
* selected, and call the onSelect function. 
Eğer (bir popup göstermek gibi) özelliği seçildiğinde, harita üzerinde bir şeyler yapmak istiyorsanız

, seçtiğiniz etkinlik için vektör katmanını abone olmaları gerektiğini oluşturduktan: Bu benim için çalıştı Yanıtınız için

this.vlayer.events.on({'featureselected': function(){ 
    //Handle select event 
}}); 
+1

teşekkürler! Mevcut sürümdeki OpenLayers API Doc'un bozulduğunu öğrendim (ve 'select' yöntemi yoktu). İşte [OpenLayers API'sine bağlantı] (http://dev.openlayers.org/docs/files/OpenLayers/Control/SelectFeature-js.html#OpenLayers.Control.SelectFeature.select) –

+4

geleceğim için tavsiyem de doc'lar yerine openlayers kaynak koduna bakın. Orada ihtiyacınız olan şeyi bulmak kolay ve işlerin nasıl yürüdüğünü daha iyi anlayacaksınız. Genellikle, kaynak kodunda, dokümanlarda göremeyeceğiniz değerli yorumlar bulabilirsiniz. – igorti

+4

, "selectFeature" kontrolünü haritada etkinleştirmeden önce haritaya eklemeniz gerektiğini unutmayın. map.addControl (selectFeature); – JSancho

İlgili konular