如何在WMS或矢量图层上选择要素

时间:2012-07-18 09:18:56

标签: gis openlayers layer geoserver

我在WMS图层上设置了一个Vector图层,我需要在其上选择要素并在地图上突出显示这些要素,而不是点击地图,而是点击按钮或地图外部的某些内容。这是代码:

regioni = new OpenLayers.Layer.WMS(
            "regioni",
            "http://localhost:8080/geoserver/mmasgis/wms",
            {layers: 'mmasgis:reg2011_g', format: 'image/gif'}
);

select = new OpenLayers.Layer.Vector("Selection", {styleMap:
            new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"])
});

map.addLayers([regioni, select]);

selectionControl = new OpenLayers.Control.GetFeature({
            protocol: OpenLayers.Protocol.WFS.fromWMSLayer(regioni),
            box: true,
            hover: true,
            multipleKey: "shiftKey",
            toggleKey: "ctrlKey"
        });
        selectionControl.events.register("featureselected", this, function(e) {
            select.addFeatures([e.feature]);
        });
        selectionControl.events.register("featureunselected", this, function(e) {
            select.removeFeatures([e.feature]);
        });
map.addControl(selectionControl);
selectionControl.activate(); 

使用此代码,我可以通过单击地图选择功能而没有任何问题,但我需要通过单击地图外部的某些内容来选择功能。主要问题是我必须将OpenLayers.Feature对象传递给selectionControl.addFeatures方法,但我没有那个Object,只有fid或WMS层中包含的一些信息。< / p>

我正在使用Geoserver&amp; tomcat7上的Openlayers。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我试图做同样的事情而且我做不到。 我不确定你的selectionControl是否有addFeatures方法/函数。 实际上它根本没有任何方法:

http://dev.openlayers.org/releases/OpenLayers-2.12/doc/apidocs/files/OpenLayers/Control/GetFeature-js.html

我认为GetFeature控件是一个黑盒子,我们无法以编程方式添加新选择的功能。如果您愿意,可以修改源代码。

我将这样做: - 拦截onclick事件 - 从鼠标的x和y获取lon / lat - 使用WMS的GetFeature函数从GeoServer获取功能 - 将它们添加到选择图层

我还没有完成。从WMS获取ID的代码示例:

function preSelect(fID) {

    var processResponse = function (resp) {
            console.log(resp);
            console.log(resp.error);
            var data = resp.responseText;               
            var geojson_format = new OpenLayers.Format.GeoJSON();
            var features = geojson_format.read(data,null,null);
            select.addFeatures(features);
    };

    OpenLayers.Request.issue({
        url: 'http://localhost:8080/geoserver/wfs',
        method: 'GET',
        params: {
            service: 'WFS',
            version: '2.0.0',
            request: 'GetFeature',
            typeName: 'ESD:LLSOA',
            outputFormat:'json',
            featureID: fID,                             
        },
        callback: processResponse
    });
}

我认为你可以用bbox参数替换featureID。或者,WMS具有类似的GetFeatureInfo函数,它接受x和y。在这两种情况下,坐标必须与基础图层位于同一投影中。

另外,我遇​​到了WFS GetFeature方法的准确性问题。这里解释了同样的问题:

http://osgeo-org.1560.x6.nabble.com/Problems-with-WFS-GetFeature-Bounding-Box-low-accuracy-td3799986.html