OpenLayers矢量图层特征处理程序

gbe*_*927 4 vector listener handler openlayers

我会有一个openlayers矢量图层,其中的功能散布在整个地图上.我希望能够点击某个功能并显示一条消息.

我不确定是否有办法为每个功能添加一个监听器/处理程序.

有任何想法吗?

igo*_*rti 8

添加SelectFeture控件:

var selectFeature = new OpenLayers.Control.SelectFeature(vector_layer);
map.addControl(selectFeature);
selectFeature.activate();
Run Code Online (Sandbox Code Playgroud)

之后,您可以在矢量图层上收听选择/取消选择事件:

vector_layer.events.on({
  'featureselected': function(feature) {
       //display your message here
  },
  'featureunselected': function(feature) {
       //hide message
  }
});
Run Code Online (Sandbox Code Playgroud)


Roh*_*ngh 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;
    }
Run Code Online (Sandbox Code Playgroud)

以下是您将使用的控件的参考: