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);

小结

注意一下逻辑处理就行了

### 在 OpenLayers 中裁剪或提取指定地理区域 为了在 OpenLayers 地图中实现特定地理区域的裁剪或提取功能,可以采用多种方式来完成这一目标。一种常见的方式是通过创建一个自定义的地图视图并应用相应的几何操作。 #### 创建自定义视图和裁剪边界 可以通过设定 `ol.View` 的参数以及利用矢量 (`ol.layer.Vector`) 来限定地图展示范围。对于更精确的裁剪效果,则需借助于 GeoJSON 或其他格式的数据源配合使用 `ol.format.GeoJSON()` 解析器读取边界数据,并将其作为覆盖物添加到地图上[^1]。 ```javascript // 定义裁剪区多边形 (此处仅为示例, 实际应根据需求调整) var extentPolygon = new ol.geom.Polygon([ [[minX, minY], [maxX, minY], [maxX, maxY], [minX, maxY], [minX, minY]] ]); // 将其转换成Feature对象以便后续处理 var clipExtentFeature = new ol.Feature({ geometry: extentPolygon, }); // 添加至VectorSource用于绘制 var vectorSource = new ol.source.Vector({ features: [clipExtentFeature], }); ``` #### 应用裁剪逻辑 要真正意义上达到“裁剪”的目的,通常还需要对底瓦片服务或者 WMS 图像请求加入过滤条件。如果是在客户端面模拟这种行为的话,那么可以在渲染阶段控制哪些要素应该被隐藏起来不显示给用户看。这涉及到遍历所有可见图层中的特性(feature),判断它们是否位于预设好的裁剪区域内: ```javascript map.on('postrender', function(event){ var context = event.context; // 获取当前屏幕上的所有feature map.forEachFeatureAtPixel(pixel, function(feature, layer){ let geom = feature.getGeometry(); if (!extentPolygon.intersectsExtent(geom.getExtent())){ // 对不在范围内features执行透明化或其他样式修改 context.globalAlpha = 0; // ... 绘制代码 ... context.globalAlpha = 1; } }); }); ``` 上述方法适用于简单的场景;而对于复杂情况下的精准裁切,可能就需要考虑服务器端解决方案了,比如配置 Web Map Service(WMS) 请求时带上 BBOX 参数限制返回图像的内容仅限于所关心的小范围之内[^2]。 另外值得注意的是,某些版本更新后的 GIS 软件提供了更加便捷的功能支持直接保存带有坐标的截图等功能[^3],但这并不直接影响 OpenLayers 的开发实践。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值