如何在OpenLayers的矢量图层上以编程方式选择要素?
我目前正在寻找一种解决方案来选择(或突出显示)OpenLayers.Layer.Vector中的矢量。如何在OpenLayers的矢量图层上以编程方式选择要素?
我已经构建了一个简单的网格表,用户可以选择一个向量(以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/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
}});
感谢您的答复这个工作对我来说!我发现当前版本中的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
我对未来的建议也是如此查看openlayers源代码而不是文档。很容易找到你需要的东西,并且你会更好地理解事情的工作方式。您经常会在源代码中找到您在文档中看不到的有价值的评论。 – igorti 2012-01-13 13:20:26
请注意,您需要将“selectFeature”控件添加到地图,然后才能对其进行调用。 map.addControl(selectFeature); – JSancho 2013-06-15 11:35:21