vue2+OpenLayers 天地图上画图层(3)把当前的图层放上去

点击画笔按钮
开始框画
取当前的裁剪图层为后面的图层
恢复画笔
这里提前引入了Draw

import Draw, { createRegularPolygon, createBox } from "ol/interaction/Draw";

在这里插入图片描述
在这里插入图片描述
代码如下


<template>
  <div class="container">
    <div id="vue-openlayers" class="map-x"></div>
    <div
      id="info-box"
      class="info-box"
      style="width: 100px; height: 100px"
    ></div>
    <div id="canv" style="width: 100px; height: 100px"></div>
    <div class="btn">
      <el-button type="primary" @click="drawLine"> 画塘口</el-button>
      <el-button type="primary" @click="huanyuan"> 还原 </el-button>
      
    </div>
  </div>
</template>
<script>
import "ol/ol.css";
import { Map, View, style, Feature, geom, Overlay } from "ol";
import TileLayer from "ol/layer/Tile";
import XYZ from "ol/source/XYZ";
import { Vector as VectorSource } from "ol/source";
import VectorLayer from "ol/layer/Vector";
import { Point, LineString } from "ol/geom";
import { Style, Icon, Stroke, Text, Fill } from "ol/style";
import logo from "@/assets/logo.png";
import * as ol from "ol";
import "ol-ext/dist/ol-ext.css";

import Draw, { createRegularPolygon, createBox } from "ol/interaction/Draw";
export default {
  name: "FirstMap",
  data() {
    return {
      map: null,
      draw: null,
      maskLayer: null,
      logo,
      layers: [],
    };
  },
  methods: {
    initMap() {
      let that = this;
      // 将图标样式应用到点要素
      const features = [];
      const point = new Point([108.56, 34.15]); // 修改坐标格式
      const feature = new Feature({
        geometry: point,
        custom: { data: "123", type: "icon" },
        type: "icon",
      });
      feature.setStyle([
        new Style({
          image: new Icon({
            crossOrigin: "anonymous",
            src: this.logo,
            // size: [40, 40],
            scale: 0.2, // 图标缩放比例
          }),
        }),
      ]);
      features.push(feature);
      //设置地图的数据源
      const source = new VectorSource({
        features,
      });
      let markLayerPoints = new VectorLayer({
        source: source,
      });

      let map = new Map({
        target: "vue-openlayers",
        layers: [
          new TileLayer({
            source: new XYZ({
              url: "https://gdtc.shipxy.com/tile.g?l=en&m=d&z={z}&x={x}&y={y}",
            }),
          }),
          markLayerPoints, // 确保图层顺序正确
          // vectorLayers,
        ],
        view: new View({
          projection: "EPSG:4326",
          center: [108.56, 34.15], // 修改中心坐标格式
          zoom: 6,
        }),
      });

      this.map = map;

      

      
    },
    // 变成画笔
    drawLine() {
      let that = this;
      const draw = new Draw({
        source: new VectorSource(),
        type: "Polygon",
        name: "huizong",
      });
      that.map.addInteraction(draw);
      that.draw = draw;
      that.draw.on("drawend", function (event) {
        const polygon = event.feature.getGeometry();
        that.clipMap(polygon);
      });
    },
    // 取当前地图的裁剪图层为下一次的图层
    clipMap(polygon) {
      console.log(polygon,'polygon');
      const extent = polygon.getExtent();
      console.log(extent,'extentextentextent');
      // 设置图层的可见范围
      const layer = this.map.getLayers().item(0); // 获取第一个图层
      console.log(layer, "layerlayerlayer");
      layer.setExtent(extent);
      // 更新地图视图以适应绘制的区域
      this.map
        .getView()
        .fit(extent, { padding: [50, 50, 50, 50], duration: 500 });
      this.map.updateSize();
      this.cancelDraw();
    },
    // 还原画笔
    cancelDraw() {
      let that = this;
      // 从地图中移除绘制交互
      that.map.removeInteraction(that.draw);
      // 如果需要,可以清除源中的所有要素
      // that.draw.getSource().clear(true);
    },
    huanyuan() {
      console.log(this.map.getLayers().getArray(), "layerlayerlayer");
      const layer = this.map.getLayers().item(0); // 获取第一个图层
      layer.setExtent(this.map.getView().getProjection().getExtent());
    },
},
  mounted() {
    this.initMap();
  },
};
</script>
<style scoped lang="scss">
.input {
  position: fixed;
  top: 10px;
  right: 10px;
  border-radius: 10px;
  background: #fff;
  display: flex;
  flex-direction: column;
  padding: 5px;
  padding-bottom: 10px;

  > * {
    margin-top: 10px;
    display: flex;
    align-items: center;
  }
}
</style>

<style scoped lang="scss">
.container {
  position: relative;

  .btn {
    position: absolute;
    left: 4%;
    top: 1%;
  }
}

#vue-openlayers {
  width: 100vw;
  height: 100vh;
}

h3 {
  line-height: 40px;
}

/* 隐藏信息盒子的初始样式 */
#info-box {
  display: none;
  position: absolute;
  background: white;
  border: 1px solid black;
  padding: 10px;
  border-radius: 5px;
  font-size: 14px;
  pointer-events: none; /* 防止信息盒子影响鼠标事件 */
}
</style>

### 回答1: Vue3是最新版本的Vue.js框架,是一种现代的JavaScript框架,用于构建交互式和响应式的应用程序。OpenLayers是一个很受欢迎的用于Web地图应用程序的JavaScript库。 Vue3和OpenLayers两者结合使用可以创建出高级的Web地图应用程序,因为Vue3拥有丰富的生态系统和丰富的组件库,能够轻松地集成OpenLayers的功能和样式。Vue3非常适合用于开发Web应用程序,因为它提供了许多工具和功能来优化应用程序的性能和开发体验。 通过Vue3,您可以轻松地将OpenLayers与其他Vue组件集成在一起,以创建具有高级功能和交互性的地图应用程序。Vue3的响应式数据绑定特性可以轻松地更新OpenLayers图层和标记等地图元素。Vue3还提供了一种方便的方法来管理地图事件,您可以方便地为每个地图事件创建自定义处理程序和生命周期钩子。 总之,Vue3和OpenLayers的结合使用可以为您带来一个强大的Web地图应用程序框架,提高开发和设计的效率,并在可扩展性和性能方面提供更好的解决方案。 ### 回答2: Vue3是一种现代web应用程序框架,可以用于构建基于数据驱动的单页面应用程序。OpenLayers则是一种开源JavaScript库,用于在Web上呈现交互式地图和地理空间数据。 Vue3和OpenLayers的结合可以为开发人员提供一种强大的工具,用于构建可视化地图和地理空间数据的应用程序。Vue3可以通过其组件系统便于地组织代码和数据,并且可以使用其响应式数据绑定来更新UI。OpenLayers可以允许开发人员轻松地创建交互式地图,并使用其丰富的API来操作地图的样式和数据。 与以前版本的Vue相比,Vue3的主要优势是其重新设计的响应式API。Vue3的响应式API更加高效和灵活,使得开发人员可以更轻松地处理大量数据的更改。在开发地图应用程序时,这非常重要,因为大量的地理空间数据会随时间而变化。Vue3的新特性还包括更简单的编译器、更好的渲染性能和更好的TypeScript支持。 熟练使用Vue3和OpenLayers可以使开发人员轻松构建功能强大且可定制的地图应用程序。使用组件化的方法来管理应用程序代码,可以使应用程序更容易维护和扩展。OpenLayers强大的功能可以使开发人员制定定制的地图风格和数据显示,从而为用户提供更丰富的交互体验。总而言之,Vue3和OpenLayers的结合是开发地图应用程序的绝佳选择。 ### 回答3: Vue3-OpenLayers是基于Vue3框架的客户端Web地图库。该库结合了Vue3的响应式数据流和OpenLayers的强大地图功能,提供了一个简单易用、灵活可定制的地图开发框架。通过Vue3-OpenLayers,开发者可以较为轻松地搭建起自己的地图应用,实现各种地图需求。 Vue3-OpenLayers库的主要特点包括: 1. 基于Vue3响应式系统,便于数据更新和管理; 2. 提供了完整的OpenLayers组件库,如地图图层、控件、交互等,方便使用; 3. 支持灵活的地图样式配置和自定义功能开发; 4. 支持OpenLayers的各种地图源,如瓦片图、WMS、WMTS等等。 Vue3-OpenLayers库的使用对于有Vue3开发经验的开发者而言较为友好,借助Vue3的响应式能力,实现地图数据和业务逻辑的跟随变化响应,并且组件化的设计模式方便了多层级嵌套的地图应用开发。同时,开发者还可以利用Vue3提供的组件化构建特性,设计出符合自己需求的定制化地图组件。 总之,Vue3-OpenLayers是一款强大的地图库,它将Vue3和OpenLayers优势结合起来,为地图应用开发者提供了更为简单、灵活的地图开发解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值