【问题标题】:How to get top layer information from getFeatureInfoUrl?如何从 getFeatureInfoUrl 获取顶层信息?
【发布时间】:2020-12-07 05:07:42
【问题描述】:

我正在尝试使用 openlayers 中的 getFeatureInfoUrl 获取我用鼠标单击的地图的特征信息。

但是无论我点击哪里,我都会得到有关底层的信息。 ex) 我点击的地方是下面的idc_gis:adhp_boundary,但是我想知道的信息是idc_gis:adhp_buld。

如何只有点击点上的最高层才能获取信息? 我发现使用 QUERY_LAYERS 属性只有某些图层可以获取信息,但是当我使用该属性命名它们时,如果它们不在点击中,我会返回未定义的。

我只想获取有关我曾经在特定图层中单击过的最高图层的信息。

这是我的代码。谢谢。

function addLayerTileWMS(layer_id, layer_name, visible, url, params){
    var layer = new ol.layer.Tile({id : layer_id, name : layer_name});
    
    layer.setVisible(visible);
    layer.setSource(new ol.source.TileWMS({
            url: url,
            serverType: 'geoserver',
            params: {
                'TILED': true,
                'VERSION': !params.version ? '1.1.0' : params.version,  // must be 1.1.0, not 1.3.0
                'SRS' : !params.srs ? this.getView().getProjection().getCode() : params.srs,    //Spatial Reference System  
                'FORMAT': !params.format ? 'image/png' : params.format,
                'TRANSPARENT': !params.transparent ? true : params.transparent,
                'LAYERS' : !params.layers ? '' : params.layers,
                'STYLES' : !params.styles ? '' : params.styles,
                'VIEWPARAMS' : !params.viewparams ? '' : params.viewparams,
                'CQL_FILTER' :  !params.cqlFilter ? null : params.cqlFilter 
            }
    }));
    return layer;
}


var map = new ol.Map({
    layers: [],
    target: 'map',
    view: new ol.View({
        projection: 'EPSG:5179',
        zoom: 15,
        minZoom: 6,
        maxZoom: 20
    }),
    controls: []
});

var url = 'http://myurl/geoserver/wms';
var params = {layers : 'idc_gis:adhp_boundary,idc_gis:adhp_surface_a,idc_gis:adhp_surface_runway,idc_gis:adhp_buld,idc_gis:adhp_surface_ap', srs : 'EPSG:5179'}
var legendLayer = addLayerTileWMS("legendLayer", "legendLayer", true, url, params);

map.addLayer(legendLayer);

map.on('click', function(evt){
    var coordinate = evt.coordinate;
    var viewResolution = map.getView().getResolution();
    var viewProjection = map.getView().getProjection();

    var layers = map.getLayers().getArray();
    for(var i=0; i<layers.length; i++){
        if(layers[i].get('name') == 'legendLayer'){
            legendSource = layers[i].getSource();
            var url = legendSource.getFeatureInfoUrl(
                    coordinate, viewResolution, viewProjection,
                    { 'INFO_FORMAT': 'application/json',
                    }
            );
            console.log(url);
        }
    }
    
});

【问题讨论】:

  • 您是否正在制作具有地图功能的自定义内部应用程序?您尝试向最终用户展示的功能到底是什么?您在哪个平台上编写代码?

标签: javascript gis openlayers


【解决方案1】:

经过几个小时的搜索,我不确定这是一个完美的解决方案,但我找到了一种方法。 答案是“FEATURE_COUNT”属性。

如果添加此属性,则返回的 URL 包含来自您单击的所有功能的 json 对象。 然后就可以使用整个json对象列表中最后一个索引的特征信息了。

但是,我们不能保证点击返回的json对象列表长度小于FEATURE_COUNT集合。

for(var i=0; i<layers.length; i++){
        if(layers[i].get('name') == 'legendLayer'){
            legendSource = layers[i].getSource();
            var url = legendSource.getFeatureInfoUrl(
                    coordinate, viewResolution, viewProjection,
                    { 'INFO_FORMAT': 'application/json',
                      'FEATURE_COUNT':'9999',
                    }
            );
            console.log(url);
        }
    }

如果点击返回的json ovejct列表长度大于FEATURE_COUNT,则无法确定最后一个json对象就是最高层的信息。

设置足够的值

【讨论】:

    【解决方案2】:

    如果您打算查询多个层,除了需要将FEATURECOUNT 参数设置为大于 1 的数字外,还可以通过仅将该层添加到 @987654322 来将查询限制为仅一层@参数。

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 2012-04-04
      • 2020-09-07
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多