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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 OpenLayers Overlay 与 Vue 组件结合的案例: 1. 在 Vue 组件定义一个 div 元素,并设置其样式和位置,作为 OpenLayers Overlay 的容器。 ```html <template> <div class="map-overlay" ref="overlay"></div> </template> <style> .map-overlay { position: absolute; top: 10px; right: 10px; z-index: 100; } </style> ``` 2. 在 Vue 组件引入 OpenLayers 库,并在 mounted 钩子函数创建一个 Overlay 对象,并将其添加到地图上。 ```javascript import ol from 'openlayers'; export default { mounted() { const map = new ol.Map({ target: 'map', // ... }); const overlay = new ol.Overlay({ element: this.$refs.overlay, positioning: 'top-right' }); map.addOverlay(overlay); } } ``` 3. 在 Vue 组件定义一个方法,用于更新 Overlay 的内容。这个方法可以根据需要接受一个参数,并将其渲染到 Overlay 容器。 ```javascript export default { // ... methods: { updateOverlay(content) { this.$refs.overlay.innerHTML = content; } } } ``` 4. 在 Vue 组件使用 updateOverlay 方法,更新 Overlay 的内容。 ```javascript export default { // ... mounted() { // ... const overlay = new ol.Overlay({ element: this.$refs.overlay, positioning: 'top-right' }); map.addOverlay(overlay); // 更新 Overlay 内容 this.updateOverlay('Hello, World!'); } } ``` 这个案例,我们使用了 OpenLayers 的 Overlay 对象来创建一个浮动面板,然后将其与 Vue 组件结合,通过 updateOverlay 方法来更新 Overlay 的内容。这种方式可以方便地将 OpenLayers 的地图功能与 Vue 组件结合起来,实现更加灵活和丰富的交互效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值