【问题标题】:How to select a feature on WMS or Vector layer如何在 WMS 或矢量图层上选择要素
【发布时间】:2012-07-18 09:18:55
【问题描述】:

我在 WMS 图层上设置了一个矢量图层,我需要在该图层上选择要素并在地图上突出显示这些要素,而不是通过单击地图,而是通过单击按钮或地图外部的东西。这是代码:

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 方法,但我没有那个对象,只有fid 或 WMS 层中包含的一些信息。

我在 tomcat7 上使用 Geoserver 和 Openlayers。有什么想法吗?

【问题讨论】:

    标签: gis openlayers layer geoserver


    【解决方案1】:

    我尝试做同样的事情,但我做不到。 我不确定您的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多