我会有一个openlayers矢量图层,其中的功能散布在整个地图上。我希望能够点击某个功能并显示一条消息。
我不确定是否有办法为每个功能添加一个监听器/处理程序。
有什么想法吗?
答案 0 :(得分:8)
添加SelectFeture控件:
var selectFeature = new OpenLayers.Control.SelectFeature(vector_layer);
map.addControl(selectFeature);
selectFeature.activate();
之后,您可以在矢量图层上收听选择/取消选择事件:
vector_layer.events.on({
'featureselected': function(feature) {
//display your message here
},
'featureunselected': function(feature) {
//hide message
}
});
答案 1 :(得分:5)
您需要结合使用SelectFeature
控件和OpenLayers.Popup
类之一,例如OpenLayers.Popup.FramedCloud
。这是一个例子:
http://openlayers.org/dev/examples/select-feature-openpopup.html
在该示例中,尝试使用“绘制多边形”选项绘制多边形(双击地图以完成多边形)。然后使用“单击时选择多边形”并单击多边形,您将获得一个框架云弹出窗口。
您可以查看该页面的来源,了解它是如何完成的。以下是代码的相关部分。当然,您可以将message
更改为您想要在框架云中显示的内容:
var map = <your OpenLayers.Map object>;
var polygonLayer = <your vector layer>;
selectControl = new OpenLayers.Control.SelectFeature(polygonLayer,
{onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
map.addControl(selectControl); // not in the example, but do this
function onPopupClose(evt) {
selectControl.unselect(selectedFeature);
}
function onFeatureSelect(feature) {
var message = "<div style='font-size:.8em'>Feature: " + feature.id +"<br>Area: " + feature.geometry.getArea()+"</div>";
selectedFeature = feature;
popup = new OpenLayers.Popup.FramedCloud("chicken",
feature.geometry.getBounds().getCenterLonLat(),
null,
message,
null, true, onPopupClose);
feature.popup = popup;
map.addPopup(popup);
}
function onFeatureUnselect(feature) {
map.removePopup(feature.popup);
feature.popup.destroy();
feature.popup = null;
}
以下是您将使用的控件的参考:
答案 2 :(得分:0)
如果有很多矢量图层,是否需要为每一层写“layer_name.events.on ...”?是否可以制作图层列表并为所有图层分配“.events.on”?