当前位置: 首页 > news >正文

五十三、openlayers官网示例Layer Spy解析——跟随鼠标透视望远镜效果、图层剪裁

官网demo地址:

Layer Spy

 这篇实现了鼠标跟随望远镜效果,鼠标移动时绘制一个圆形的剪裁区剪裁上层图层。

container.addEventListener("mousemove", function (event) {mousePosition = map.getEventPixel(event);map.render();});container.addEventListener("mouseout", function () {mousePosition = null;map.render();});

通过map.render()触发prerender,postrender两个函数来完成裁剪,其原理和上篇的卷帘效果一样。

上篇地址: 

 完整代码:

<template><div class="box"><h1>Layer Spy</h1><div id="map" class="map"></div></div>
</template><script>
import StadiaMaps from "ol/source/StadiaMaps.js";
import Map from "ol/Map.js";
import TileLayer from "ol/layer/Tile.js";
import View from "ol/View.js";
import XYZ from "ol/source/XYZ.js";
import { fromLonLat } from "ol/proj.js";
import { getRenderPixel } from "ol/render.js";
export default {name: "",components: {},data() {return {map: null,};},computed: {},created() {},mounted() {const container = document.getElementById("map");const layer = new TileLayer({source: new StadiaMaps({layer: "stamen_terrain_background",}),zIndex: 2,});const map = new Map({layers: [layer,new TileLayer({source: new StadiaMaps({layer: "outdoors",}),}),],target: "map",view: new View({center: [0, 0],zoom: 2,projection: "EPSG:4326",}),});let radius = 75;document.addEventListener("keydown", function (evt) {if (evt.key === "ArrowUp") {radius = Math.min(radius + 5, 150);map.render();evt.preventDefault();} else if (evt.key === "ArrowDown") {radius = Math.max(radius - 5, 25);map.render();evt.preventDefault();}});let mousePosition = null;container.addEventListener("mousemove", function (event) {mousePosition = map.getEventPixel(event);map.render();});container.addEventListener("mouseout", function () {mousePosition = null;map.render();});layer.on("prerender", function (event) {const ctx = event.context;ctx.save();ctx.beginPath();if (mousePosition) {const pixel = getRenderPixel(event, mousePosition);const offset = getRenderPixel(event, [mousePosition[0] + radius,mousePosition[1],]);const canvasRadius = Math.sqrt(Math.pow(offset[0] - pixel[0], 2) + Math.pow(offset[1] - pixel[1], 2));ctx.arc(pixel[0], pixel[1], canvasRadius, 0, 2 * Math.PI);ctx.lineWidth = (5 * canvasRadius) / radius;ctx.strokeStyle = "rgba(0,0,0,0.5)";ctx.stroke();}ctx.clip();});layer.on("postrender", function (event) {const ctx = event.context;ctx.restore();});},methods: {},
};
</script><style lang="scss" scoped>
#map {width: 100%;height: 500px;
}
.box {height: 100%;
}</style>

相关文章:

  • LeetCode 3186 最大施法伤害
  • 如何选择适合的LabVIEW版本进行开发
  • 注解详解系列 - @ResponseStatus
  • Java中将文件转换为Base64编码的字节码
  • LabVIEW的热门应用
  • JAVA学习笔记DAY6——SSM_Spring
  • 在Linux上为Windows目标配置Qt交叉编译
  • 鸿蒙开发网络管理:【@ohos.request (上传下载)】
  • 48-4 内网渗透 - Rotten Potato(烂土豆) 提权
  • StableSwarmUI 安装教程(详细)
  • 【朝花夕拾】RT1170 CSI 如何使能摄像头Y8功能
  • 【自动驾驶】从零开始做自动驾驶小车
  • scale()函数详解
  • MySQL笔记——事务
  • 分享HTML显示2D/3D时间
  • 【技术性】Search知识
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Flex布局到底解决了什么问题
  • Gradle 5.0 正式版发布
  • Iterator 和 for...of 循环
  • Java 网络编程(2):UDP 的使用
  • Javascript设计模式学习之Observer(观察者)模式
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 高度不固定时垂直居中
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我这样减少了26.5M Java内存!
  • 阿里云服务器购买完整流程
  • #1015 : KMP算法
  • #单片机(TB6600驱动42步进电机)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (八)Flask之app.route装饰器函数的参数
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (过滤器)Filter和(监听器)listener
  • (含答案)C++笔试题你可以答对多少?
  • (六)DockerCompose安装与配置
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 的缓存方案
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 反射 Reflect
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)