Vue+penlayers实现多边形绘制及展示


Posted in Vue.js onDecember 24, 2020

本文实例为大家分享了Vue+penlayers实现多边形绘制展示代码,供大家参考,具体内容如下

<!--
 * @Description: 绘制多边形
 * @Author: Dragon
 * @Date: 2020-12-17 16:02:06
 * @LastEditTime: 2020-12-18 17:20:33
 * @LastEditors: Dragon
-->

<template>
 <div>
  <div class="query-wrap">
   <el-button type="primary" @click="drawStart('Polygon')">
    {{ isDraw ? "绘制区域" : "重新绘制" }}
   </el-button>
  </div>
  <div id="map"></div>
 </div>
</template>

<script>
import "ol/ol.css";
import { Map, View } from "ol";
import { Image as ImageLayer, Vector as VectorLayer } from "ol/layer";
import { ImageStatic, Vector as VectorSource } from "ol/source";
import { getCenter } from "ol/extent";
import { Projection } from "ol/proj";

import Draw from "ol/interaction/Draw";
import { Style, Fill, Stroke } from "ol/style";

import { GeoJSON } from "ol/format";
import staticMap from "@/assets/map.png";

export default {
 data() {
  return {
   map: null, // 地图
   imgx: 0, // 当前地图宽
   imgy: 0, // 当前地图高
   isDraw: true, // 是否绘制
   draw: null,
   source: null,
   vector: null,
   styles: [
    new Style({
     stroke: new Stroke({
      color: "rgba(255,0,0,0.6)",
      width: 2,
     }),
     fill: new Fill({
      color: "rgba(255,0,0,0.3)",
     }),
    }),
   ],
   geojsonObject: {
     'type': 'FeatureCollection',
     'features': [
      {
       'type': 'Feature',
       'geometry': {
        'type': 'Polygon',
        'coordinates': [
         [
          [97.16862961519749, 322.26517247174047],
          [117.3211820327625, 481.9353954724479],
          [1.056456546810466, 489.6863771715114],
          [13.458027265312012, 320.71497613192776],
          [97.16862961519749, 322.26517247174047]
                   ]
        ],
       },
      },
     ],
    },
  };
 },
 methods: {
  // 初始化地图
  initMap() {
   let extent = [0, 0, this.imgx, this.imgy];
   let projection = new Projection({
    code: "xkcd-image",
    units: "pixels",
    extent: extent,
   });
   let $this = this;
   this.map = new Map({
    target: "map",
    layers: [
     new ImageLayer({ // 展示地图层
      source: new ImageStatic({
       url: staticMap,
       projection: projection,
       imageExtent: extent,
      }),
     }),
     new VectorLayer({
      source: new VectorSource({
       features: new GeoJSON().readFeatures($this.geojsonObject),
      }),
      style: $this.styles,
     }),
    ],
    view: new View({
     projection: projection,
     center: getCenter(extent),
     zoom: 2,
     maxZoom: 18,
    }),
   });

   this.source = new VectorSource({ wrapX: false })
   this.vector = new VectorLayer({
    source: this.source,
    style: this.styles
   })
   this.map.addLayer(this.vector)
  },
  
  // 开始绘制多边形
  drawStart(type) {
   let that = this;
   if(this.isDraw) {
    this.isDraw = false
    this.draw = new Draw({
     source: this.source,
     type: type,
    });
    this.map.addInteraction(this.draw);
    this.draw.on("drawend", function (evt) {
     that.drawingEnd(evt);
    });
   } else {
    this.source.clear()
    this.map.removeInteraction(this.draw);
    this.isDraw = true
   }
   
  },

  // 构建多边形结束
  drawingEnd(evt) {
   let that = this
   const geo = evt.feature.getGeometry();
   const t = geo.getType();
   if (t === "Polygon") {
    // 获取坐标点
    const points = geo.getCoordinates();
    console.warn(points, "绘制结束,点坐标")
    this.map.removeInteraction(this.draw); // 移除绘制
   }
  },
 },
 mounted() {
  let that = this;
  let img = new Image();
  setTimeout(function() {
   img.src = staticMap;
   img.onload = function (res) {
    that.imgx = res.target.width;
    that.imgy = res.target.height;
    that.initMap();
   };
  }, 500)
  
 },
};
</script>

<style>
#map {
 width: 100%;
 height: calc(100vh - 50px);
}
</style>

效果图:

Vue+penlayers实现多边形绘制及展示

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue组件是如何解析及渲染的?
Jan 13 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
Vue Mint UI mt-swipe的使用方式
Jun 05 Vue.js
Vue3实现简易音乐播放器组件
Aug 14 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 #Vue.js
vue绑定class的三种方法
Dec 24 #Vue.js
全面解析Vue中的$nextTick
Dec 24 #Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 #Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 #Vue.js
Vue3 实现双盒子定位Overlay的示例
Dec 22 #Vue.js
详解Vue的异步更新实现原理
Dec 22 #Vue.js
You might like
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
判断控件是否已加载完成的代码
2010/02/24 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
python 画条形图(柱状图)实例
2020/04/24 Python
python编写实现抽奖器
2020/09/10 Python
struct和class的区别
2015/11/20 面试题
夜大毕业自我鉴定
2013/10/11 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
迎新生晚会主持词
2015/06/30 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
全新239军机修复记
2022/04/05 无线电
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js