openlayers点击某个瓦片高亮展示

  • 使用矢量图层vectorLayer进行图层高亮, 拿到点击的那个瓦片的feature, 他是一个renderFeature ,

  • 不是创建矢量图层时需要的Feature, 需要将renderFeature

  • 通过获取他的几何图形坐标,通过一个二维数组的数组生成Polygon ,

  • 通过Polygon 创建一个geometry,在创建Feature

详细构建参数请参考openlayers API :
openlayers API

import Feature from "ol/Feature";
import Polygon from "ol/geom/Polygon";
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";

removeHighLightLayer() {
      // 移除高亮矢量图层
      if (this.vectorLayer) {
        this.map.removeLayer(this.vectorLayer);
      }
    },

initSingleClickEventLister() {
      const that = this;
      //为图层增加点击事件,查看图层属性字段,不希望点击到的图层,可以在geoserver中将图层queryable去掉勾选
      this.map.on("singleclick", (evt) => {
        if (this.isDraw) {
          return;
        }
        // 移除高亮矢量图层
        that.removeHighLightLayer();

        // 定义状态值,只取一个图层上的feature,即如果取到了房屋图层的要素,就不显示宅基地的要素信息
        let hasSelected = 0;
        this.map.forEachFeatureAtPixel(
          evt.pixel,
          (feature) => {
            console.log(feature)
            if (hasSelected > 0) {
              return false;
            }
            let record = feature.getProperties();
            let selection = {};
            selection[feature.getId()] = feature;
            //转二维数组
            //每一行 有108 和34两个值 所以下面 取余 相除都是 2
            let arr = new Array();
            let baseArray = feature.getGeometry().getFlatCoordinates();
            let len = baseArray.length;
            let lineNum = len % 2 === 0 ? len / 2 : Math.floor(len / 2 + 1);
            for (let i = 0; i < lineNum; i++) {
              let temp = baseArray.slice(i * 2, i * 2 + 2);
              arr.push(temp);
            }
            //创建高亮层
            that.vectorLayer = new VectorLayer({
              source: new VectorSource({
                features: [
                  new Feature({
                  //这里new Polygon 构造时 需要传一个数组其元素由二维数组构成
                    geometry: new Polygon([arr]),
                  }),
                ],
              }),
              zIndex: 3,
              style: that.highlightStyle,//高亮样式
            });
            that.map.addLayer(that.vectorLayer);
            hasSelected++;
            //弹出详情框
            this.$refs.information.showInit(record);
          },
          {
            hitTolerance: 0, // 点击面不需要缓冲区,点或线等不容易被点中的可以加缓冲区帮助点中
            layerFilter: function f(obj) {
              //必须是有意义图层, 即mapping中定义的图层,避免其他绘制的临时图层
              return new Set(mapconfig.mapping.mapLayers.keys()).has(
                obj.get("name")
              );
            },
          }
        );
      });
    },

拓展

这个思路适合点击的瓦片是整体展示的,且该方法实现的性能较好.

还有一种思路是使用VectorTileLayer,
数据源放入当前layer的source,而不是上述方法中的
点击直接在生成一层图层,拿出地块id一样的区域进行高亮,这个性能较差,需要遍历全部的瓦片信息,但是不会出现高亮区域不全是自己需要的
这里 我画个图:

在这里插入图片描述
现象描述:
如上图,红色框为地块,蓝色线将地图信息分割为不同的瓦片或其他的元素.
期望效果,点击红色任意部分,红色全部高亮.
期望效果:
在这里插入图片描述

进行矢量图层的:
点击左下角时, 只有左下角的红色部分高亮,而红色地块其余部分并未高亮
如图:
在这里插入图片描述
在这里插入图片描述
原因:
这是因为此时点击返回的是点击的地块所在瓦片的那一部分的几何图形的坐标集合. 而不是我们需要的整个地块的坐标集合

源码地址:

https://github.com/qlanto224/mmap

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
OpenLayers是一个强大的JavaScript开源库,用于在Web地图应用中加载和展示地理数据。要加载本地瓦片包,可以按照以下步骤进行操作: 1. 将瓦片图块文件准备好:首先,需要获取瓦片图块文件(通常是PNG或JPEG格式),并按照切片格式进行命名和组织。每个瓦片图块都应该位于对应的文件夹中,并按照行列号进行命名。 2. 创建图层:在OpenLayers中,通过`ol.layer.Tile`类来加载和显示瓦片图块。使用这个类,可以定义一个新的Tile图层对象,并设置相应的瓦片源(TileSource)。 3. 配置瓦片源:在TileSource对象中,可以选择不同的源类型来加载瓦片图块。对于加载本地瓦片包,可以使用`ol.source.XYZ`类,并设置相应的URL模板。URL模板包含一个包含占位符(像`{z}`,`{x}`,`{y}`)的字符串,用来根据图层的缩放级别和瓦片坐标来加载图块。 4. 添加图层到地图:使用`ol.Map`类来创建地图对象,然后将之前创建的瓦片图层添加到地图中。 下面是一段简单的代码示例,演示了如何加载本地瓦片包: ```javascript // 创建图层 var tileLayer = new ol.layer.Tile({ source: new ol.source.XYZ({ url: 'path/to/tiles/{z}/{x}/{y}.png' // 指定本地瓦片图块路径 }) }); // 创建地图 var map = new ol.Map({ target: 'map', layers: [tileLayer], view: new ol.View({ center: [0, 0], zoom: 2 }) }); ``` 上述示例中,`path/to/tiles/{z}/{x}/{y}.png`是本地瓦片图块所在的路径,`{z}`代表缩放级别,`{x}`和`{y}`分别代表瓦片坐标的行列号。 通过上述步骤,就能够成功加载并显示本地瓦片包了。请根据实际情况,替换示例代码中的路径和其他相关参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qlanto

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值