2012-01-12 13 views
12

मैं वर्तमान में एक OpenLayers.Layer.Vector में एक वेक्टर का चयन (या हाइलाइट) करने के लिए एक समाधान की तलाश कर रहा हूँ।ओपनलेयर में वेक्टर परत पर प्रोग्रामेटिक रूप से सुविधा का चयन कैसे करें?

मैंने एक साधारण ग्रिडटेबल बनाया है जहां कोई उपयोगकर्ता वेक्टर चुन सकता है (WKT स्वरूपित स्ट्रिंग के रूप में दिया गया है) जो परत पर संबंधित वेक्टर को हाइलाइट करना चाहिए। ग्रिडटेबल में सभी वैक्टर नक्शे पर वेक्टर परत पर खींचे जाते हैं जब उपयोगकर्ता साइट पर जाता है।

मुझे पता चला मैं या तो जरूरत है कि OpenLayers.Control.ModifyFeature के selectFeature(feature) समारोह या OpenLayers.Control.SelectFeature (dev.openlayers.org/apidocs/files/OpenLayers/Control/SelectFeature-js.html's देखने का चयन करें (फीचर) समारोह (जो शायद मौजूद नहीं है या अब अस्तित्व में नहीं है?)। मेलिंगलिस्ट से एक पोस्ट देखें: osgeo-org.1803224.n2.nabble.com/ प्रायोगिक रूप से- चयन- ए- फीचर-tt2192485.html#a2193928 और अधिक के लिए infos।

मुझे कोई सफलता के साथ निम्नलिखित की कोशिश की, तो मुझे आशा है कि किसी को इस कोड लाइनों हड़पने सकता है और मुझे एक काम कोड स्निपेट ;-)

// ... 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); 
दिखा सकता है कोड में बाद में

:

// ... 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; 
    } 
    } 
} 

उत्तर

20

मुझे समझ नहीं आता क्यों तुम ModifyFeature उपयोग कर रहे हैं एक सुविधा का चयन करने के लिए। OpenLayers.Control.SelectFeature विशेष रूप से सुविधाओं का चयन करने के लिए किया जाता है, इसलिए मेरा सुझाव है कि आप इसके बजाय इस नियंत्रण का उपयोग करें।

तो, SelectFeature नियंत्रण बनाने:

var selectFeature = new OpenLayers.Control.SelectFeature(this.vlayer); 
selectFeature.activate(); 
तो फिर तुम में

अगर-कथन का उपयोग चुनिंदा विधि (मैं इसे एक सुविधा आप ज्यामिति की तुलना द्वारा चयन करना चाहते हैं खोजने के लिए काम करता है लगता है?):

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

प्रलेखन के अनुसार इस विधि के रूप में चुना सुविधा निशान और उचित घटनाओं में वृद्धि करनी चाहिए:

* Method: select 
* Add feature to the layer's selectedFeature array, render the feature as 
* selected, and call the onSelect function. 

आप जब सुविधा चयनित हो जाता मानचित्र पर कुछ करने के लिए (एक पॉपअप दिखा) की तरह चाहते हैं, आप का चयन करें-इस घटना के लिए वेक्टर परत सदस्यता ले जब आप इसे बनाना चाहिए:

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

धन्यवाद आपकी प्रतिक्रिया के लिए यह मेरे लिए काम किया! मुझे पता चला कि वर्तमान रिलीज में ओपनलेयर एपीआई दस्तावेज़ टूटा हुआ है (और कोई 'चयन' विधि नहीं थी)। यहां काम कर रहा है [ओपनलेयर एपीआई से लिंक] (http://dev.openlayers.org/docs/files/OpenLayers/Control/SelectFeature-js.html#OpenLayers.Control.SelectFeature.select) –

+4

भविष्य के लिए मेरी सलाह भी है दस्तावेज़ों के बजाय ओपनलेयर स्रोत कोड देखें। आपको वहां क्या चाहिए इसकी तलाश करना आसान है और आपको चीजों को कैसे काम करने की बेहतर समझ मिल जाएगी। आपको अक्सर स्रोत कोड में मूल्यवान टिप्पणियां मिलेंगी जिन्हें आप दस्तावेज़ों में नहीं देख पाएंगे। – igorti

+4

ध्यान दें कि इससे पहले कि आप उस पर सक्रिय कॉल कर सकें, आपको मानचित्र पर "selectFeature" नियंत्रण जोड़ना होगा। map.addControl (selectFeature); – JSancho

संबंधित मुद्दे

 संबंधित मुद्दे