OpenLayers多要素旋转平移缩放及olext深度定制化

目录

  • 1.前言
  • 2.olext官方示例
  • 3.重写Transform.js
  • 4.自定义样式
  • 5.自定义选中机制
  • 6.拓展思考
    • 6.1包围框的角度问题
    • 6.2不选中要素如何平移
  • 7总结

1.前言

  首先OpenLayers本身是支持旋转、平移、缩放的。olext 只是在 OpenLayers 的基础上又做了一层封装,使得看起来比较好看,用起来也比较好用。当然,olext 里的功能可不止旋转、平移缩放,还有很多,比如样式、动画、过滤器、控制器、各类要素交互、重做撤销、图例、搜索、路径规划、等高线以及移动端适配等等。官方示例地址为 GitHub ,ES6版本可以参考 olext4.0.14 ,ES5及以下版本可以参考 olext3.1.5

2.olext官方示例

  olext 的使用很简单,只需要引入olext,初始化一下就 ok 了。

import ExtTransform from 'ol-ext/interaction/Transform'
import {always} from 'ol/events/condition'
const transform = new ExtTransform({hitTolerance: 2,//点选容差,即将鼠标所在位置扩大2px进行选择translate: false, // 平移-点击要素的中心触发translateFeature: true,//平移-点击要素任意位置触发stretch: false, // 拉伸scale: true, // 缩放rotate: true, // 旋转noFlip: true,//禁止翻转keepRectangle:true,//保持包围框为矩形状态keepAspectRation:always //保持要素宽高比(缩放时)})
this.map.addInteraction(transform)

在这里插入图片描述

3.重写Transform.js

  现在我们知道了是 Transform 这个类在控制这图形的变换。那我们就来看下源码就知道是怎么回事了。
在这里插入图片描述
  原来是重写了ol/interaction/Pointer.js这个类。那我们怎么重写这个类呢?抄呗!不会写还不会抄么?代码原封不动,我们自己写个类,把它的代码复制过去。文件就叫olPaintingTransform.js,然后引入我们自己的文件, new 的时候就 new 我们自己的类,然后加上事件的监听。

// import ExtTransform from 'ol-ext/interaction/Transform'
import olPaintTransfrom from './olPaintTransform'
const transform = new olPaintTransfrom({hitTolerance: 2,//点选容差,即将鼠标所在位置扩大2px进行选择translate: false, // 平移-点击要素的中心触发translateFeature: true,//平移-点击要素任意位置触发stretch: true, // 拉伸scale: true, // 缩放rotate: true, // 旋转noFlip: true,//禁止翻转keepRectangle:true,//保持包围框为矩形状态keepAspectRation:always //保持要素宽高比(缩放时)
})map.addInteraction(transform)//开始事件transform.on(['rotatestart','translatestart'], function(e){// Rotationlet startangle = e.feature.get('angle')||0;// Translationconsole.log(xxx);console.log(startangle);});//旋转transform.on('rotating', function (e){console.log(xxx);console.log("rotate: "+((e.angle*180/Math.PI -180)%360+180).toFixed(2));console.log(e);});//移动transform.on('translating', function (e){console.log(xxx);console.log(e.delta);console.log(e);});//拖拽事件transform.on('scaling', function (e){console.log(xxx);console.log(e.scale);console.log(e);});//事件结束transform.on(['rotateend', 'translateend', 'scaleend'], function (e) {console.log(xxx);});

4.自定义样式

  现在我觉的这个样式不好看,缩放和拉伸我不想要方框了,我要改成实心圆,并且加上颜色来区分功能,修改 setDefaultStyle方法中bigpt samllpt的样式即可。
在这里插入图片描述
在这里插入图片描述

setDefaultStyle(options) {options = options || {}// Stylevar stroke = options.pointStroke || new ol_style_Stroke({ color: [255, 0, 0, 1], width: 1 })var strokedash = options.stroke || new ol_style_Stroke({ color: [255, 0, 0, 1], width: 1, lineDash: [4, 4] })var fill0 = options.fill || new ol_style_Fill({ color: [255, 0, 0, 0.01] })var fillScale = options.pointFill || new ol_style_Fill({ color: [255, 255, 255, 0.8] })var fill = options.pointFill || new ol_style_Fill({ color: [255, 255, 255, 0.8] })var circle = new ol_style_RegularShape({fill: fill,stroke: stroke,radius: this.isTouch ? 12 : 6,displacement: this.isTouch ? [24, -24] : [12, -12],points: 15})// Old version with no displacementif (!circle.setDisplacement)circle.getAnchor()[0] = this.isTouch ? -10 : -5var bigpt = new ol_style_RegularShape({fill: new ol_style_Fill({ color: '#0029f3' }),stroke: new ol_style_Stroke({ color: '#0029f3' , width: 1 }),radius: this.isTouch ? 12 : 6,points: 18,angle: Math.PI / 4})var smallpt = new ol_style_RegularShape({fill: new ol_style_Fill({ color: '#00f31e' }),stroke: new ol_style_Stroke({ color: '#00f31e' , width: 1 }),radius: this.isTouch ? 12 : 6,points: 18,angle: Math.PI / 4})function createStyle(img, stroke, fill) {return [new ol_style_Style({ image: img, stroke: stroke, fill: fill })]}/** Style for handles */this.style = {'default': createStyle(bigpt, strokedash, fill0),'translate': createStyle(bigpt, stroke, fill),'rotate': createStyle(circle, stroke, fill),'rotate0': createStyle(bigpt, stroke, fill),'scale': createStyle(bigpt, stroke, fill),'scale1': createStyle(bigpt, stroke, fill),'scale2': createStyle(bigpt, stroke, fill),'scale3': createStyle(bigpt, stroke, fill),'scalev': createStyle(smallpt, stroke, fill),'scaleh1': createStyle(smallpt, stroke, fill),'scalev2': createStyle(smallpt, stroke, fill),'scaleh3': createStyle(smallpt, stroke, fill),}this.drawSketch_()}

  这个旋转点位置也看起来怪怪的,移动正上方去吧,修改画草图方法drawSketch_中的Rotate的计算方式和setDefaultStyle中的circle 的样式
在这里插入图片描述

// Rotate
if (!this.iscircle_ && this.get('rotate')) {f = new ol_Feature({ geometry: new ol_geom_Point([(g[0][0]+g[2][0])/2,g[2][1]]), handle: 'rotate' })features.push(f)
}
var circle = new ol_style_RegularShape({fill: fill,stroke: stroke,radius: this.isTouch ? 12 : 6,//displacement: this.isTouch ? [24, -24] : [12, -12],displacement: [0, 30],points: 15
})

5.自定义选中机制

  现在我们已经改完样式了,接下要做的是我不想通过鼠标点选来设置。为什么?因为鼠标点选只能选择一个,我们要做的是,通过代码设置,想设置选中多少个就设置选中多少个。首先设置多个选中在olext里是提供了方法的,叫做setSelection
在这里插入图片描述
  那么我们要做的就是取消olext默认的选中事件就行了。而默认选中事件的逻辑是在handleDownEvent中处理,我们只需要注销掉最后一个else if就可以了。
在这里插入图片描述

6.拓展思考

6.1包围框的角度问题

  当我的要素旋转了以后,我希望olext画出来的包围框角度也跟着变化一下该怎么做呢?
  :当前也是在画草图方法drawSketch_中找到new Polygon的地方,设置角度即可。

6.2不选中要素如何平移

  olext唯一不好的地方就是不选中就不能进行旋转、平移、缩放。但是一些情况下需要不选中也能平移要素。这种应该怎么实现?
  :自然也是用ol/interaction/Pointer类来实现,因为这里能处理mouseDown事件,具体可以参考OpenLayers官网的不选中平移例子

7总结

  本篇中我们深刻的剖析了olext中的Transform类,修改了默认的样式,默认的选中事件等等。还提出了拓展思考及对应的解决方案,希望能对后来者有所启发,回见~。

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

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

相关文章

函数栈帧的创建及销毁(超详解)

目录 1.预备知识 1.1内存区的划分 1.2认识相关寄存器和汇编指令 1.2.1寄存器 1.2.2相关汇编指令 2.测试前 2.1测试代码及环境 2.2 main函数也是被其他函数调用的 3.函数栈帧的创建 4.进入函数内部 5.形参与实参 6.call/jump add函数 7.函数栈帧的销毁 7.1保存…

使用transformer来训练自己的大模型实现自定义AI绘图软件的详细操作步骤

使用transformer来训练自己的大模型实现自定义AI绘图软件的详细操作步骤!下面的步骤是非常细致的,如果你有一台自己的GPU算力还算可以的服务器主机,想自己训练AI大模型。可以按照如下步骤开展操作。 要使用 Transformer 框架训练属于自己的大…

哪种游泳耳机品牌更好?2024四款甄选高评分榜单好物!

在繁忙的都市生活中,游泳已经成为了许多人释放压力、保持健康的重要方式。而随着科技的进步,游泳耳机也逐渐走进了人们的视野,让音乐与游泳完美结合,为游泳爱好者带来了全新的运动体验。然而,在琳琅满目的游泳耳机市场…

matlab|计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

1 主要内容 该程序参考《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》模型,主要实现的是计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度模型。通过引入碳捕集电厂–电转气–燃气机组协同利用框架,碳捕集的CO2 可作为电转气原料&#xf…

Linux下出现ERROR: 1 Can‘t create/write to filexxxxxx

此类问题大多都是权限问题,将根目录的读写权限设置为最高即可解决 案例,ubantu中安装mysql,出现ERROR: 1 Cant create/write to file /home/utf/server_202402/db/mysql/data/mysql/db.MYI (Errcode: 13) 解决办法:将/home/utf目…

【算法与数据结构】417、LeetCode太平洋大西洋水流问题

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:题目要求雨水既能流向太平洋也能流向大西洋的网格。雨水流向取决于网格的高度。一个比较直接的方式是对…

element ui 安装 简易过程 已解决

我之所以将Element归类为Vue.js,其主要原因是Element是(饿了么团队)基于MVVM框架Vue开源出来的一套前端ui组件。我最爱的就是它的布局容器!!! 下面进入正题: 1、Element的安装 首先你需要创建…

Java设计模式-结构型-适配器模式

Java设计模式-结构型-适配器模式 本文我们简单说下设计模式中的适配器模式。 一、概述 ​ 与电源适配器相似,在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是…

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Spring Security 重点解析

Spring Security 重点解析 文章目录 Spring Security 重点解析1. 简介2. 依赖3. 登录认证3.1 登录校验流程3.2 Spring Security 默认登录的原理3.2.1 Spring Security 完整流程3.2.2 登录逻辑探究 3.3 自定义改动3.3.1 自定义用户密码校验3.3.2 自定义 UserDetails 获取方式 F1…

基于Spring Boot的安康旅游网站的设计与实现,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1760645517548793858

SpringSecurity + OAuth2 详解

SpringSecurity入门到精通 ************************************************************************** SpringSecurity 介绍 **************************************************************************一、入门1.简介与选择2.入门案例-默认的登录和登出接口3.登录经过了…

不做内容引流,你凭什么在互联网上赚钱?

孩子们放寒假了,待在家里不是看电视,就是拿着手机刷视频,脸上是各种欢快和满足。只是一切换到写作业模式,孩子是各种痛苦表情包,家长则是使出浑身解数,上演亲子大战。可见娱乐常常让人愉悦,而学…

鼠标事件和滚轮事件

1. 介绍 QMouseEvent类用来表示一个鼠标事件,当在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件。利用QMouseEvent类可以获知鼠标是哪个键按下了,还有鼠标指针的当前位置等信息。通常是重定义部件的鼠标事件处理函数来进行一些自定…

ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器

ubuntu系统上的软件相比CentOS更新还是比较快的,但是还是难免有一些软件更新得不那么快,比如LLVM Clang编译器,目前ubuntu 22.04版本最高还只能安装LLVM 15,而LLVM 18 rc版本都出来了。参见https://github.com/llvm/llvm-project/…

【STM32】Keil RTE使用记录

0 前言 最近因为任务需要,再次开始研究STM32,打算过一遍之前记录的笔记,在创建工程模板时,突然发现一个之前被自己忽略的东西,那就是创建项目时会弹出的Run-Time Environment,抱着好奇的心态去找了一些资料…

防御保护--入侵防御系统IPS

目录 DFI和DPI技术 --- 深度检测技术 入侵防御(IPS) 签名 入侵防御策略的配置 内容安全:攻击可能只是一个点,防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI--深度包检测技术--主要针对完整的数据包&#xff0…

冒泡排序法的名字由来,排序步骤是什么,最坏情况下的排序次数如何计算得来的呢?

问题描述:冒泡排序法的名字由来,排序步骤是什么,最坏情况下的排序次数如何计算得来的呢? 问题解答: 冒泡排序法的名字来源于排序过程中较大的元素会像气泡一样逐渐“冒”到序列的顶端,而较小的元素则会逐…

员工离职倾向分析工具

很多公司都担心员工离职,尤其是工龄久的老员工,为什么呢? 很多离职员工带走上家机密,还有的辞职后开公司成为了上家企业的对手公司等等,这类事件非常常见,因此员工离职是一个敏感的话题。 员工离职的原因 …

基于springboot+vue的植物健康系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…