openlayers之鼠标浮动显示feature的名称并高亮显示

<template>
  <div
    class="my-road-text-popup"
    ref="popup"
  >{{roadText}}</div>
</template>

<script>
import Select from 'ol/interaction/Select';
import VectorLayer from 'ol/layer/Vector';
import { Vector as VectorSource } from 'ol/source';
import {
  readEncWkt,
  createOtherPolygonStyle,
  createCircelStyle,
  createTextStyle,
} from '@/utils/geoUtil';
import { Style } from 'ol/style';
import { pointerMove } from 'ol/events/condition';
import Overlay from 'ol/Overlay';
import { darkGrayColor, grayColor, lightBLueColor } from '@/api/mapConfig';

export default {
  name: 'ReferenceLayer',
  props: {
    map: Object,
    refDateList: {},
    codeList: {},
  },
  data() {
    return {
      roadText: undefined,
      layerList: [],
      overlay: undefined,
    };
  },
  mounted() {
    this.initOverlay();
  },
  methods: {
    //移除图层
    removeLayers() {
      if (this.layerList.length > 0) {
        for (let layer of this.layerList) {
          this.map.removeLayer(layer);
        }
      }
      this.layerList = [];
      this.roadText = '';
    },
    initLayer(arr) {
      for (let item of arr) {
        let layer = new VectorLayer({
          code: 'con_' + item.id,
          name: item.layerName,
          groupName: '参考数据',
          style: function (feature) {
            return feature.get('style');
          },
          source: new VectorSource({ wrapX: false }),
        });
        switch (item.layoutLayerType) {
          case 'plane':
            layer.setZIndex(1);
            break;
          case 'line':
            layer.setZIndex(2);
            break;
          case 'point':
            layer.setZIndex(3);
            break;
        }
        this.layerList.push(layer);
        this.map.addLayer(layer);
      }
      this.initHoverSelected();
    },
    initHoverSelected() {
      let selectPointerMove = new Select({
        condition: pointerMove,
        layers: this.layerList,
        style: (feature) => {
          const pro = feature.getProperties();
          if (pro.type === 'point') {
            return this.pointStyle(pro.name, lightBLueColor);
          } else if (pro.type === 'plane') {
            return createOtherPolygonStyle(lightBLueColor, 2);
          } else {
            return createOtherPolygonStyle(lightBLueColor, 10);
          }
        },
      });
      this.map.addInteraction(selectPointerMove);
      selectPointerMove.on(['select', 'remove', 'add'], (e) => {
        this.overlay.setPosition(undefined);
        let features = e.target.getFeatures().getArray();
        if (features.length == 0) {
          return;
        }
        let feature = features[0];
        let pro = feature.getProperties();
        //清除选中的样式
        // selectPointerMove.getFeatures().clear();
        if (pro.type === 'point') {
          return;
        }
        this.roadText = pro.name;
        this.overlay.setPosition(e.mapBrowserEvent.coordinate);
      });
    },
    pointStyle(name, color) {
      const dom = {
        textAlign: 'center',
        color: darkGrayColor,
        font: '12px sans-serif',
        offsetY: -10,
      };
      return new Style({
        image: createCircelStyle(color, 4),
        text: createTextStyle(name, dom),
      });
    },
    initOverlay() {
      let dom = this.$refs.popup;
      this.overlay = new Overlay({
        element: dom,
        autoPan: false,
        // offset: [10, 10],
      });
      this.map.addOverlay(this.overlay);
    },
    addFeatures(arr) {
      if (arr && arr.length > 0) {
        arr.forEach((polygon) => {
          let feature = readEncWkt(polygon.theGeom);
          let pro = {
            name: polygon.name,
            type: polygon.layoutLayerType,
            layerCode: 'con_' + polygon.collectLayoutLayerId,
          };
          if (pro.type === 'point') {
            feature.set('style', this.pointStyle(pro.name, darkGrayColor));
          }
          if (pro.type === 'line') {
            feature.set('style', createOtherPolygonStyle(darkGrayColor, 10));
          }
          if (pro.type === 'plane') {
            feature.set('style', createOtherPolygonStyle(darkGrayColor, 1));
          }
          feature.setProperties(pro);
          this.layerList
            .find((layer) => layer.getProperties().code === pro.layerCode)
            .getSource()
            .addFeature(feature);
        });
      }
    },
    clearFeatures() {
      this.roadText = '';
      if (this.layerList.length > 0) {
        for (let layer of this.layerList) {
          layer.getSource().clear();
        }
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.my-road-text-popup {
  font-size: 14px;
}
</style>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值