vue+openlayers之几何图形交互绘制基础与实践

news/2024/7/8 4:49:45 标签: vue.js, 交互, 前端

文章目录

  • 1.实现效果
  • 2.实现步骤
  • 3.示例页面代码
  • 3.基本几何图形绘制的关键代码

1.实现效果

绘制点、线、多边形、圆、正方形、长方形
在这里插入图片描述

2.实现步骤

  1. 引用openlayers开发库。
  2. 加载天地图wmts瓦片地图。
  3. 在页面上添加几何图形绘制的功能按钮,使用下拉列表(select)设置几何图形绘制功能项,并设置其样式。其中,当“几何图形类型”为“无”时清除当前绘制的所有图形。

3.示例页面代码

<template>
  <div id="map" class="imap">
  </div>
  <div class="menu">
    <label>几何图形类型:</label>
    <select id="type" v-model="typeSelect" @change="typeSelectOnChange">
      <option value="">无</option>
      <option value="Point">点</option>
      <option value="LineString">线</option>
      <option value="Polygon">多边形</option>
      <option value="Circle">圆</option>
      <option value="Square">正方形</option>
      <option value="Box">长方形</option>
    </select>
  </div>
</template>

3.基本几何图形绘制的关键代码

<script setup>
  // vue+openlayers之几何图形交互绘制基础与实践

  import {
    onMounted,
    ref
  } from 'vue'
  import 'ol/ol.css';
  import {
    Map,
    View
  } from 'ol';
  import TileLayer from 'ol/layer/Tile';
  import XYZ from 'ol/source/XYZ';
  import VectorLayer from "ol/layer/Vector";
  import VectorSource from "ol/source/Vector";
  import {
    Circle,
    Fill,
    Stroke,
    Style,
    Text
  } from "ol/style";
  import Draw, {
    createRegularPolygon
  } from "ol/interaction/Draw";
  import {
    LinearRing,
    LineString,
    MultiLineString,
    MultiPoint,
    MultiPolygon,
    Point,
    Polygon,
  } from 'ol/geom';

  var map = null;
  var draw; // 绘制对象
  // 实例化一个矢量地图vector
  var source = new VectorSource({
    wrapX: false
  })
  var vector = new VectorLayer({
    source: source,
    style: new Style({
      fill: new Fill({ //填充样式
        color: 'rgba(225,225,225,0.2)'
      }),
      stroke: new Stroke({ //边界样式
        color: '#ece034',
        width: 2
      }),
      image: new Circle({ //点要素样式
        radius: 7,
        fill: new Fill({
          color: '#ece034'
        })
      }),
    })
  })
  onMounted(() => {
    map = new Map({
      target: 'map',
      layers: [
        new TileLayer({
          source: new XYZ({
            url: "你的天地图地址",
            attributions: '影像底图',
            crossOrigin: 'anonymous',
            wrapX: false //如果设置为 false,地图在横向滚动到最右侧时不会出现重复的地图;
          }),
          preload: Infinity
        })
      ],
      view: new View({
        //地图初始中心点
        center: [0, 0],
        minZoom: 2,
        maxZoom: 18,
        zoom: 5
      })
    });

    window.olmap = map
    map.addLayer(vector)

  })

  const typeSelect = ref('')

  function typeSelectOnChange() {
    map.removeInteraction(draw)
    addInteraction()
  }

  //根据几何图形类型进行绘制
  function addInteraction() {
    var value = typeSelect.value //几何图形类型
    if (value) {
      if (source == null) {
        source = new VectorSource({
          wrapX: false
        });
        vector.setSource(source); //添加数据源
      }
      var geometryFunction, maxPoints;
      if (value === 'Square') { //正方形
        value = 'Circle'; //设置几何图形类型为Circle(圆形)
        //设置几何图形类型,即创建正多边形
        geometryFunction = createRegularPolygon(4);
      } else if (value === 'Box') { //长方形
        value = 'LineString'; //设置绘制类型为LineString(线)
        maxPoints = 2; //设置最大点数为2
        //设置几何图形类型,即设置长方形的坐标点
        geometryFunction = function (coordinates, geometry) {
          var start = coordinates[0];
          var end = coordinates[1];
          if (!geometry) {
            //多边形
            geometry = new Polygon([
              [start, [start[0], end[1]], end, [end[0], start[1]], start]
            ]);
          }
          geometry.setCoordinates([
            [start, [start[0], end[1]], end, [end[0], start[1]], start]
          ]);
          return geometry;
        };
      }
      //实例化交互式图形绘制控件并添加到地图容器中
      draw = new Draw({
        source: source, //数据源
        type: /**@type{ol.geom.GeometryType}*/ (value), //几何图形类型
        geometryFunction: geometryFunction, //几何图形变更时调用函数
        maxPoints: maxPoints, //最大点数
        style: new Style({
          image: new Circle({
            radius: 7,
            fill: new Fill({
              color: '#ece034',
            }),
          }),
          stroke: new Stroke({ //边界样式
            color: '#ece034',
            width: 2
          }),
        }),
      });
      map.addInteraction(draw);
    } else {
      source = null;
      vector.setSource(source); //清空绘制的图形
    }
  }
</script>

http://www.niftyadmin.cn/n/5536605.html

相关文章

Proteus-51单片机-DS18B20多点测温

DS18B20多点测温 一、Proteus仿真演示 每个DS18B20都有一个唯一的64位序列号,这使得在同一总线上可以挂载多个传感器,无需额外的地址分配。主机(通常为单片机)通过特定的时序控制,可以依次读取各个DS18B20的温度数据,实现分布式测温。 主机通过RS485接口可以分别获取从机…

谷粒商城学习-09-配置Docker阿里云镜像加速及各种docker问题记录

文章目录 一&#xff0c;配置Docker阿里云镜像加速二&#xff0c;Docker安装过程中的几个问题1&#xff0c;安装报错&#xff1a;Could not resolve host: mirrorlist.centos.org; Unknown error1.1 检测虚拟机网络1.2 重设yum源 2&#xff0c;报错&#xff1a;Could not fetch…

商用车水箱浮球液位开关

商用车水箱浮球液位开关概览 商用车水箱浮球液位开关是一种用于监测商用车辆水箱液位的设备&#xff0c;它可以有效地控制和监控水箱中的水位&#xff0c;确保车辆的正常运作。这种液位开关通常安装在水箱内部&#xff0c;通过浮球和磁性原理来感知液位的变化&#xff0c;并通…

SQL二次注入原理分析

二次注入在测试的时候比较少见&#xff0c;或者说很难被测出来&#xff0c;因为测的时候首先要去找注入的位置&#xff0c;其次是去判断第一次执行的SQL语句&#xff0c;然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。 下面以一个常用过滤方法…

vue全局方法plugins/utils

一、在src目录下创建一个plugins文件夹 test.ts文件存放创建的方法&#xff0c;index.ts用于接收所有自定义方法进行统一处理 二、编写自定义方法 // test.ts文件 export default {handleTest(val1: number, val2: number) {// 只是一个求和的方法return val1 val2;}, };三…

行业模板|DataEase旅游行业大屏模板推荐

DataEase开源数据可视化分析工具于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

easyquotation获取港股的bug

easyquotation&#xff1a;实时股票数据获取 easyquotation库&#xff0c;是一个非常好用的实时股票数据获取库&#xff0c;可以实时获取新浪、腾讯的免费股票行情&#xff0c;集思路的分级基金行情 安装 项目地址&#xff1a;https://github.com/shidenggui/easyquotation.…

Trinity Bots战场以及游荡佣兵设置相关

bots开关 NpcBot.Ebable.Raid 1 打开raid允许&#xff0c;这样团本也能带佣兵进去打了。 NpcBot.Ebable.BG 1 打开战场允许&#xff0c;这样战场也能带佣兵进去了。 NpcBot.Ebable.Arena 1 竞技场带佣兵。 默认已经开放的是&#xff1a; NpcBot.Ebable.Dungeon 1…