[英]How to select a feature programmatically on a vector layer in OpenLayers?
I'm currently searching for a solution to select (or highlight) a vector in a OpenLayers.Layer.Vector. 我目前正在寻找一种解决方案来选择(或突出显示)OpenLayers.Layer.Vector中的向量。
I've build a simple gridtable where a user can pick a vector (given as WKT formatted string) which should highlight the corresponding vector on the layer. 我已经构建了一个简单的网格表,用户可以在其中选择一个向量(以WKT格式的字符串给出),该向量应突出显示图层上的相应向量。 All the vectors in the gridtable are drawn to the vector layer on the map when the user visits the the site.
当用户访问网站时,网格表中的所有向量都将绘制到地图上的矢量图层。
I found out that I either need the OpenLayers.Control.ModifyFeature 's selectFeature(feature) function or the OpenLayers.Control.SelectFeature (see dev.openlayers.org/apidocs/files/OpenLayers/Control/SelectFeature-js.html's select(feature) function (which probably does not exists or doesn't exists any longer?). See a post from a Mailinglist: osgeo-org.1803224.n2.nabble.com/Programatically-Select-a-Feature-tt2192485.html#a2193928 for more infos. 我发现我需要OpenLayers.Control.ModifyFeature的selectFeature(feature)函数或者OpenLayers.Control.SelectFeature(参见dev.openlayers.org/apidocs/files/OpenLayers/Control/SelectFeature-js.html的select(功能(可能不存在或不再存在?)。请参阅邮件列表中的帖子:osgeo-org.1803224.n2.nabble.com/Programatically-Select-a-Feature-tt2192485.html# a2193928更多信息。
I tried the following with no success, so I hope someone could grab this code lines and could show me a working code snippet ;-) 我尝试了以下但没有成功,所以我希望有人可以抓住这些代码行,并可以向我展示一个有效的代码片段;-)
// ... 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);
Later in code: 后来的代码:
// ... 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;
}
}
}
I don't understand why you are using ModifyFeature to select a feature. 我不明白你为什么使用ModifyFeature来选择一个功能。 OpenLayers.Control.SelectFeature is done specifically to select features so I suggest that you use this control instead.
OpenLayers.Control.SelectFeature专门用于选择功能,所以我建议您使用此控件。
So, create SelectFeature control: 因此,创建SelectFeature控件:
var selectFeature = new OpenLayers.Control.SelectFeature(this.vlayer);
selectFeature.activate();
Then in you if-statement(I guess it works to find a feature you want to select by comparing geometries?) use select method: 然后在你的if语句中(我想它可以通过比较几何来找到你想要选择的特征?)使用select方法:
if (wktVector == wktVectorCurrent) {
selectFeature.select(this.vlayer.features[i]);
}
According to documentation this method should mark feature as selected and raise appropriate events: 根据文档,此方法应将功能标记为已选择并引发适当的事件:
* Method: select
* Add feature to the layer's selectedFeature array, render the feature as
* selected, and call the onSelect function.
If you want to do something on the map when feature gets selected(like showing a popup), you should subscribe vector layer to select-event when you create it: 如果您想在选择要素时在地图上执行某些操作(如显示弹出窗口),则应在创建时将矢量图层订阅为select-event:
this.vlayer.events.on({'featureselected': function(){
//Handle select event
}});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.