如何在OpenLayers的矢量图层上以编程方式选择要素?

问题描述:

我目前正在寻找一种解决方案来选择(或突出显示)OpenLayers.Layer.Vector中的矢量。如何在OpenLayers的矢量图层上以编程方式选择要素?

我已经构建了一个简单的网格表,用户可以选择一个向量(以WKT格式化字符串给出),该向量应该高亮显示图层上的相应向量。当用户访问该网站时,网格表中的所有矢量都会绘制到地图上的矢量图层。

我发现我要么需要OpenLayers.Control.ModifyFeatureselectFeature(feature)功能或OpenLayers.Control.SelectFeature(见dev.openlayers.org/apidocs/files/OpenLayers/Control/SelectFeature-js.html's选择(功能)功能(这可能不存在或不再存在?)。从邮件列表中查看帖子:osgeo-org.1803224.n2.nabble.com/Programatically-Select-a-Feature-tt2192485.html#a2193928了解更多信息相关信息。

我尝试没有成功以下,所以我希望有人能抓住这个行代码,并能告诉我一个工作代码段;-)

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

我不明白,为什么你正在使用ModifyFeature选择功能。 OpenLayers.Control.SelectFeature专门用来选择功能,所以我建议你改用这个控件。

因此,创建SelectFeature控制:

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

然后if语句(我猜它的工作原理,找到您要比较的几何形状来选择功能?)使用选择方法:

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

感谢您的答复这个工作对我来说!我发现当前版本中的OpenLayers API Doc已损坏(并且没有'select'方法)。这里的工作[链接到OpenLayers API](http://dev.openlayers.org/docs/files/OpenLayers/Control/SelectFeature-js.html#OpenLayers.Control.SelectFeature.select) – 2012-01-13 10:19:46

+4

我对未来的建议也是如此查看openlayers源代码而不是文档。很容易找到你需要的东西,并且你会更好地理解事情的工作方式。您经常会在源代码中找到您在文档中看不到的有价值的评论。 – igorti 2012-01-13 13:20:26

+4

请注意,您需要将“selectFeature”控件添加到地图,然后才能对其进行调用。 map.addControl(selectFeature); – JSancho 2013-06-15 11:35:21