三十一、openlayers官网示例Draw Features解析——在地图上自定义绘制点、线、多边形、圆形并获取图形数据

news2025/2/23 10:24:17

官网demo地址:

Draw Features 

先初始化地图,准备一个空的矢量图层,用于显示绘制的图形。

initLayers() {
      const raster = new TileLayer({
        source: new XYZ({
          url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
        }),
      });

      const source = new VectorSource({ wrapX: false });

      this.vectorlayer = new VectorLayer({
        source: source,
      });
      this.map = new Map({
        layers: [raster, this.vectorlayer],
        target: "map",
        view: new View({
          center: [-11000000, 4600000],
          zoom: 4,
        }),
      });
    },

 想要在地图上绘制图形,需要用到一个交互类Draw,new Draw,设置绘制的图形类型。常见类型包括 'Point', 'LineString', 'Polygon', 'Circle', 'MultiPoint', 'MultiLineString', 'MultiPolygon'

addDrawInteraction() {
      this.draw = new Draw({
        source: this.vectorlayer.getSource(),
        type: this.type,
      });
      this.map.addInteraction(this.draw);
    },

Draw还有些常用参数

  1. clickTolerance:

    • 类型: number
    • 描述: 指定绘制时允许的点击距离容差(以像素为单位)。这是为了允许用户在移动鼠标时具有一定的容差,以便更容易地点击绘制。
    • 默认值: 6
  2. features:

    • 类型: ol.Collection<ol.Feature>
    • 描述: 一个 Collection 实例,用于存储绘制的特征。如果指定了此属性,绘制的特征将添加到该集合中。
  3. source:

    • 类型: ol.source.Vector
    • 描述: 一个 VectorSource 实例,用于存储绘制的特征。如果没有指定 features,绘制的特征将添加到此数据源中。
  4. dragVertexDelay:

    • 类型: number
    • 描述: 指定绘制顶点时拖动操作的延迟时间(以毫秒为单位)。
    • 默认值: 500
  5. snapTolerance:

    • 类型: number
    • 描述: 指定绘制时顶点的捕捉容差(以像素为单位)。这是为了使用户更容易将新顶点捕捉到现有顶点上。
    • 默认值: 12
  6. stopClick:

    • 类型: boolean
    • 描述: 是否停止点击事件。设置为 true 时,绘制交互将停止触发地图的点击事件。
    • 默认值: false
  7. maxPoints:

    • 类型: number
    • 描述: 绘制的最大顶点数。对于线和多边形,这个值可以限制绘制的顶点数量。
    • 默认值: Infinity
  8. minPoints:

    • 类型: number
    • 描述: 绘制的最小顶点数。例如,对于多边形,至少需要三个顶点来形成一个闭合的形状。
    • 默认值: 2
  9. style:

    • 类型: ol.style.StyleArray<ol.style.Style>ol.StyleFunction
    • 描述: 指定绘制过程中几何图形的样式。可以是一个样式实例、样式实例数组或一个样式函数。
  10. geometryFunction:

    • 类型: function
    • 描述: 自定义几何生成函数,用于在绘制时生成几何图形。该函数接收两个参数:coordinates(当前坐标数组)和 geometry(当前几何图形)。

下拉框切换时需要先移除之前的Draw,再实例化一个新的Draw添加到地图上。

  changeDrawType() {
      this.map.removeInteraction(this.draw);
      this.addDrawInteraction();
    },

使用removeLastPoint方法可以撤回最后绘制的一个点。

document.getElementById("undo").addEventListener("click",  ()=> {
      this.draw.removeLastPoint();
    });

 一般来说,在地图上绘制完图形肯定要拿到图形数据上传或者做其他的操作,我们来看看怎么获取数据。

方法一:直接从vectorlayer图层上获取 

this.vectorlayer.getSource().getFeatures()

方法二:使用Draw的参数features绑定数组

let featureArr = new Collection();
this.draw = new Draw({
    features: featureArr,
});

features绑定的数组不是普通的数组,Collection是openlayers内部定义的一个类似数组的集合。它拥有一些跟数组类似的方法。具体介绍和方法可以参考官网文档:

OpenLayers v9.2.4 API - Class: Collection

如果获取数据的时机是绘制完成之后点击按钮后获取,那两种方式没什么区别。但若是希望绘制完成后马上获取,使用this.vectorlayer.getSource().getFeatures()就会有一点小问题。。。

 this.draw.on("drawend", (e) => {
        console.log("draw", e.feature);
        console.log("获取数据:", this.vectorlayer.getSource().getFeatures());
  });

已经绘制了一个图形,但是并没有获取到 。this.vectorlayer.getSource().getFeatures()不能实时获取到绘制图形的数据,因为drawend事件里feature还没被加到图层上。

但,也不是没有解决办法,变成异步就可以。

setTimeout(() => {
    console.log("获取数据:", this.vectorlayer.getSource().getFeatures());
});

而使用Draw的features参数绑定Collection就不会有这个问题。

this.draw.on("drawend", (e) => {
        console.log("draw", e.feature);
        console.log("featureArr", this.featureArr);
  });

总的来说,两种方法都可以,甚至可以定义一个数组,每次绘制完都push一下当前绘制的feature。 具体怎么使用看业务需求喽。

  完整代码:


<template>
  <div class="box">
    <h1>Draw Features绘制图形</h1>
    <div id="map"></div>
    <div class="row">
      <div class="col-auto">
        <span class="input-group">
          <label class="input-group-text" for="type">Geometry type:</label>
          <select
            class="form-select"
            id="type"
            @change="changeDrawType"
            v-model="type"
          >
            <option value="Point">Point</option>
            <option value="LineString">LineString</option>
            <option value="Polygon">Polygon</option>
            <option value="Circle">Circle</option>
            <option value="None">None</option>
          </select>
          <input class="form-control" type="button" value="Undo" id="undo" />
        </span>
        <el-button type="primary" @click="getDrawFeatures">获取</el-button>
      </div>
    </div>
  </div>
</template>
 
<script>
import Draw from "ol/interaction/Draw.js";
import { createBox } from "ol/interaction/Draw";
import Map from "ol/Map.js";
import View from "ol/View.js";
import { OSM, Vector as VectorSource } from "ol/source.js";
import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer.js";
import XYZ from "ol/source/XYZ";
import Feature from "ol/Feature.js";
import Polygon from "ol/geom/Polygon.js";
import Point from "ol/geom/Point.js";
import { Collection } from "ol";
export default {
  data() {
    return {
      map: null,
      vectorlayer: null,
      type: "Point",
      draw: null,
      featureArr: new Collection(),
    };
  },
  methods: {
    getDrawFeatures() {
      console.log("方法一", this.vectorlayer.getSource().getFeatures());
      console.log("方法二", this.featureArr);
    },
    changeDrawType() {
      this.map.removeInteraction(this.draw);
      this.addDrawInteraction();
    },
    initLayers() {
      const raster = new TileLayer({
        source: new XYZ({
          url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
        }),
      });

      const source = new VectorSource({ wrapX: false });

      this.vectorlayer = new VectorLayer({
        source: source,
      });
      this.map = new Map({
        layers: [raster, this.vectorlayer],
        target: "map",
        view: new View({
          center: [-11000000, 4600000],
          zoom: 4,
        }),
      });
    },
    addDrawInteraction() {
      this.draw = new Draw({
        source: this.vectorlayer.getSource(),
        type: this.type,
        features: this.featureArr,
        //freehand: true, //是否启用自由绘制模式
      });
      this.map.addInteraction(this.draw);
      this.draw.on("drawend", (e) => {
        console.log("draw", e.feature);
        // console.log("获取数据:", this.vectorlayer.getSource().getFeatures());
        console.log("featureArr", this.featureArr);
        // setTimeout(() => {
        //   console.log("source", this.vectorlayer.getSource().getFeatures());
        // });
      });
    },
  },
  mounted() {
    this.initLayers();
    this.addDrawInteraction();

    document.getElementById("undo").addEventListener("click", () => {
      this.draw.removeLastPoint();
    });
  },
};
</script>
<style scoped>
#map {
  width: 100%;
  height: 500px;
}
.box {
  height: 100%;
}
</style>

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1709377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快团团帮卖团长怎么对供货大团长进行评分?

都说帮卖“躺赚”&#xff1f; 一旦遇团不淑&#xff0c;惨遭不靠谱团长挖坑&#xff0c;售后拖延、发货慢、产品瑕疵…… 加上顾客夺命连环催&#xff0c;双面夹击&#xff0c;夹缝生存。供货团长靠不靠谱太重要了&#xff01; 快团团供货团长评分系统上线&#xff01; 帮卖团…

深入理解MySQL索引下推优化

在MySQL中&#xff0c;索引的使用对于查询性能至关重要。然而&#xff0c;即使有合适的索引&#xff0c;有时查询性能仍然不尽如人意。索引下推&#xff08;Index Condition Pushdown&#xff0c;ICP&#xff09;是一项能够进一步优化查询性能的技术。本文将详细讲解索引下推的…

Postman入门 - 环境变量和全局变量

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、发送请求 二、设置并引用环境变量 比如&#xff1a;我建的这个生产环境 使用环境有两个方式&…

大学数学常用的搜题软件?分享四个搜题直接出答案的软件 #微信#媒体#职场发展

以下软件拥有强大的搜索功能&#xff0c;能够快速找到与题目相关的资料和答案&#xff0c;让大学生们更容易理解和掌握知识点。 1.The Sky The Sky 是一个让人惊艳的天文知识学习软件&#xff0c;也是一个唯美好看的天文科普软件。 它的功能全面丰富&#xff0c;支持识别查看…

常见排序算法之插入排序

目录 一、直接插入排序 1.1 什么是插入排序 1.2 代码思路 1.3 C语言源码 二、希尔排序 2.0 插入排序的弊端 2.1 什么是希尔排序&#xff1f; 2.2 排序思路 2.3 C语言源码 一、直接插入排序 1.1 什么是插入排序 插入排序是一种简单直观的排序算法&#xff0c;它通过构…

003 仿muduo实现高性能服务器组件_前置知识

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言时间轮timewheel设计正则表达式介绍&#xff08;了解知道怎么使用&#xff09;通用型any容器的实现 小结 …

蓝牙模块选型之蓝牙功能

蓝牙模块&#xff0c;是一种集成蓝牙功能的PCBA板&#xff0c;用于短距离无线通讯&#xff0c;蓝牙模块将芯片和外围硬件电路集成到一个PCB上&#xff0c;开发出所需的内置程序实现蓝牙功能的设备。可以通过相关接口和MCU控制设备进行数据传输、可实现蓝牙标准通信和组网。 目前…

海外仓系统要多少钱?最贵的未必是最好的,性价比高的才是

海外仓系统可以说已经是现在海外仓管理不可或缺的重要工具&#xff0c;然而&#xff0c;很多海外仓企业在选择海外仓系统时最头疼的问题就是不知道到底多少钱才合适。 确实&#xff0c;现在的海外仓系统市场价格体系非常多&#xff0c;几万几十万各种定价都有&#xff0c;让人…

揭秘编程逻辑:布瑞克(break)与坎特牛(continue)的较量

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、布瑞克与坎特牛&#xff1a;逻辑差异的探索 二、代码案例分析&#xff1a;布瑞克与坎特…

远程抄表及预付费管理系统:智能管理的新篇章

1.系统简述 远程抄表及预付费管理系统是现代能源管理方面的一项重要自主创新&#xff0c;它将传统手动式抄水表方式转变为自动化技术、智能化管理模式&#xff0c;大大提高了高效率并减少了经营成本。该系统搭载了前沿的通讯技术、数据分析技术和财务管理系统核心理念&#xf…

UVa1466/LA4849 String Phone

UVa1466/LA4849 String Phone 题目链接题意分析AC 代码 题目链接 本题是2010年icpc亚洲区域赛大田赛区的G题 题意 平面网格上有n&#xff08;n≤3000&#xff09;个单元格&#xff0c;各代表一个重要的建筑物。为了保证建筑物的安全&#xff0c;警察署给每个建筑物派了一名警察…

使用 Flask 和 Vue.js 构建 Web 应用

文章目录 入门1. 设置 Flask 后端2. 设置 Vue.js 前端 将 Flask 与 Vue.js 集成1. 配置 Flask 来提供 Vue.js 文件2. 构建 Vue.js 组件3. 运行应用程序 结论 在现代 Web 开发中&#xff0c;创建动态和响应式的应用通常涉及将后端框架如 Flask 与前端库如 Vue.js 结合起来。这种…

深度合作!博睿数据联合中国信通院开展公网服务质量评估工作!

近日&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;算网质量保障工作全面启动&#xff0c;博睿数据&#xff08;bonree.com&#xff0c;股票代码688229&#xff09;作为信通院算网质量测试独家技术支持单位&#xff0c;提供公网服务质量测评整体解…

新手做抖店该怎么选品?怎么选爆款?选爆品牢记这五大方法

大家好&#xff0c;我是电商花花。 不论之前还是现在&#xff0c;我们做电商想要出单&#xff0c;赚钱&#xff0c;选品对于我们店铺来说都是至关重要的&#xff0c;我们能不能在抖店上赚钱&#xff0c;就看我们的选品&#xff0c;看我们商品选的怎么样了。 如果品选的不错&a…

鸿蒙ArkUI-X跨平台开发:【资源分类与访问】

资源分类与访问 应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同…

vue/uniapp 企业微信H5使用JS-SDK

企业微信H5需要我们使用一些SDK方法如获取外部联系人userid 获取当前外部联系人userid 使用SDK前提是如何通过config接口注入权限验证配置 使用说明 - 接口文档 - 企业微信开发者中心 当前项目是vue项目&#xff0c;不好直接使用 引入JS文件&#xff0c;但我们可以安装依赖…

Codeforces Round 946 (Div.3)

C o d e f o r c e s R o u n d 946 ( D i v . 3 ) \Huge{Codeforces~Round~946~(Div.3)} Codeforces Round 946 (Div.3) 题目链接&#xff1a;Codeforces Round 946 (Div. 3) 文章目录 Problems A. Phone Desktop题意思路标程 Problems B. Symmetric Encoding题意思路标程 Pr…

Linux:IPC - System V

Linux&#xff1a;IPC - System V 共享内存 shm创建共享内存shmgetshmctlftok 挂接共享内存shmatshmdt shm特性 消息队列 msgmsggetmsgctlmsgsndmsgrcv 信号量 semSystem V 管理机制 System V IPC 是Linux系统中一种重要的进程间通信机制&#xff0c;它主要包括共享内存 shm&am…

centos下给es7.12.1设置密码

安装可参考&#xff1a; centos7下安装elasticsearch7.8.1并配置远程连接_在一台服务器centos7上安装和配置elasticsearch。-CSDN博客 1、先停掉es进程 2、设置输入密码后访问配置 cd /home/soft/elasticsearch-7.12.1/config vim elasticsearch.yml 3、启动es服务 cd /home/…