openlayer点击WMS瓦片图层获取相应的feature要素信息

前言

地图是由很多个图层layer叠加在一起组成的(图层分为矢量图层vector, 瓦片图层 Tile,等),layer上面又会有很多数据源source(数据源也分为矢量源和珊格瓦片源,必须与图层相对应), 数据源上是相应的feature要素。
一般来说通过给地图组册点击事件,然后再通过forFeatureAtPixel就能获得相应的feature要素信息,但是这种方法仅适用于图层为矢量图层ol.layer.vector
当图层为瓦片图层时就需要用其他方法获取feature信息了。

处理流程

注意:我的ol版本为v5.3.3, 可以用瓦片源的getGetFeatureInfoUrl这个api,但是在后续v6的版本中这个api更改为了getFeatureInfoUrl
这里用的图层是geoserver发布的WMS服务为例

map.on('singleclick', e => {
    var viewResolution = map.getView().getResolution(); // 地图窗口分辨率
    // 获取到点击位置的wmslayer图层
    const l = map.forEachLayerAtPixel(e.pixel, l => {
      const flag = l.get('tileName') === 'wmslayer'; //这里我已经给wms图层设置了tileName属性
      if (flag) {
        return l;  
      }
    });
    // 点击空白位置或者其他图层则清空 高亮图层
    if (!l) {
      highLightLayer.getSource().clear();
      return;
    }
    // 获取图层上的数据源并调用源上面的方法 传入 坐标点 分辨率 投影 参数option
    let url = l.getSource().getGetFeatureInfoUrl(e.coordinate, viewResolution, 'EPSG:4326', {
      INFO_FORMAT: 'application/json',
    });
    if (url) {
      fetch(url)
        .then(function (res) {
          return res.json(); 
        })
        .then(data => {
        // data为geoJSON格式的数据 可以调用new GeoJSON().redFeatures(data)生成feature要素
          highLightLayer.getSource().clear();
          highLightLayer.getSource().addFeatures(new GeoJSON().readFeatures(data));
        });
    }
  });

完整代码

import { Vector as VectorSource } from 'ol/source';
import { Vector as VectorLayer } from 'ol/layer';
import { Style, Fill, Stroke } from 'ol/style';

const getStyle = () => {
  return new Style({
    fill: new Fill({
      color: '#FFF',
    }),
    stroke: new Stroke({
      width: 10,
      color: 'red',
    }),
  });
};
const source = new VectorSource();
const highLightLayer = new VectorLayer({
  source: source,
  zIndex: 100,
  style: getStyle(),
});


map.on('singleclick', e => {
    var viewResolution = map.getView().getResolution(); // 地图窗口分辨率
    // 获取到点击位置的wmslayer图层
    const l = map.forEachLayerAtPixel(e.pixel, l => {
      const flag = l.get('tileName') === 'wmslayer';
      if (flag) {
        return l;  
      }
    });
    // 点击空白位置或者其他图层则清空 
    if (!l) {
      highLightLayer.getSource().clear();
      return;
    }
    // 获取图层上的数据源并调用源上面的方法 传入 坐标点 分辨率 投影 参数option
    let url = l.getSource().getGetFeatureInfoUrl(e.coordinate, viewResolution, 'EPSG:4326', {
      INFO_FORMAT: 'application/json',
    });
    if (url) {
      fetch(url)
        .then(function (res) {
          return res.json(); 
        })
        .then(data => {
        // data为geoJSON格式的数据 可以调用new GeoJSON().redFeatures(data)生成feature要素
          highLightLayer.getSource().clear();
          highLightLayer.getSource().addFeatures(new GeoJSON().readFeatures(data));
        });
    }
  });

  map.addLayer(highLightLayer);

小结

注意一下逻辑处理就行了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值