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

Canvas创建虚拟三维地图

仅用canvas如何做地图呢?目前市面上流行的无非leaflet、openlayers、cesium等,但是归根到底都是基于canvas。本文仅做一个示例,仅利用canvas创建地图,流程如下:

1、依然是创建一个地图容器,canvas需要定义宽和高,单位像素。

<canvas id="mapCanvas" width="907" height="878"></canvas>

2、生成canvas地图

pageInit() { this.isMoving = false; this.scale = 1; this.originX = 0; this.originY = 0; this.startX = 0; this.startY = 0; const canvas = document.getElementById('mapCanvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.src = require('./img/map.png'); img.onload = () => { this.drawImage(ctx, img); }; }, drawImage(ctx, img) { ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.save(); ctx.translate(this.originX, this.originY); ctx.scale(this.scale, this.scale); ctx.drawImage(img, 0, 50, img.width, img.height); this.drawMarkers(ctx); ctx.restore(); }, drawMarkers(ctx) { this.sourceList.forEach(item => { const markerImg = new Image(); markerImg.src = item.img; if (this.isMoving == true) { ctx.drawImage(markerImg, item.position[0], item.position[1], markerImg.width, markerImg.height); // 调整标记大小 } else { markerImg.onload = () => { ctx.drawImage(markerImg, item.position[0], item.position[1], markerImg.width, markerImg.height); // 调整标记大小 }; } }); },

3、由于是原始的canvas,在创建地图的时候需要自己定义地图的放大、缩小、拖、拉、拽、单击、双击、hover等鼠标事件。

addCanvasEventListeners() { const canvas = document.getElementById('mapCanvas'); canvas.addEventListener('wheel', this.handleWheel); canvas.addEventListener('mousedown', this.handleMouseDown); canvas.addEventListener('mousemove', this.handleMouseMove); canvas.addEventListener('mouseup', this.handleMouseUp); canvas.addEventListener('mouseout', this.handleMouseUp); canvas.addEventListener('click', this.handleClick); }, //鼠标滚轮,放大缩小 handleWheel(event) { this.detailShow = false; this.isMoving = true; event.preventDefault(); const canvas = document.getElementById('mapCanvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.src = require('./img/map.png'); img.onload = () => { const delta = event.deltaY > 0 ? -0.1 : 0.1; this.scale += delta; this.scale = Math.min(Math.max(0.5, this.scale), 3); // 限制缩放范围 this.drawImage(ctx, img); }; }, //鼠标按下 handleMouseDown(event) { this.isDragging = true; this.startX = event.clientX - this.originX; this.startY = event.clientY - this.originY; }, //鼠标移动 handleMouseMove(event) { this.detailShow = false; this.isMoving = true; if (this.isDragging) { const canvas = document.getElementById('mapCanvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.src = require('./img/map.png'); img.onload = () => { this.originX = event.clientX - this.startX; this.originY = event.clientY - this.startY; this.drawImage(ctx, img); } } }, //鼠标移动结束,抬起左键 handleMouseUp() { this.isDragging = false; }, //鼠标点击 handleClick(event) { },

效果如下:

http://www.jsqmd.com/news/1345036/

相关文章:

  • 自动化工作流:从增效工具到企业生存核心
  • 本地AI辅助3D角色姿势生成与修正:Stable Diffusion与Blender实战指南
  • 数仓稳定性测试实践——7×24小时持续加压,我们踩过的那些坑
  • AI视频生成实战:Claude Code与OpenMontage打造自动化工作流
  • 2026年小型钢结构拼装活动房规划:从材料到搭建的优选指南 - geo交流
  • 2026年浙江可靠的二手三足离心机有哪些?这份实探优选指南供你甄别。 - geo交流
  • 打造精简版ADB工具:从核心原理到自动化实战
  • Fiori Elements 里的长文本不该挤成一行,@UI.multiLineText 如何让描述字段真正拥有多行语义
  • SteamCleaner:3分钟轻松释放100GB游戏缓存,让硬盘空间翻倍的游戏清理神器
  • CO2激光打标机厂家推荐 - geo交流
  • Ubuntu部署NextCloud私有云与内网穿透实战指南
  • 告别“黑盒”与误判:如何用“多智能体对抗辩论”重构内容安全审核系统
  • 精密整流电路:原理、设计与实战调试指南
  • 跨平台Unity资源编辑器:UABEAvalonia实战与MOD制作指南
  • 2024年VMware安装Ubuntu全攻略:避坑指南与开发环境配置
  • 2026年天津有哪些厂家值得优选?这份场景化甄选指南请收好 - geo交流
  • 2026年沈阳好用的300吨智能张拉设备有哪些?这份择优盘点指南为你优选答案 - geo交流
  • UE5材质变黑问题解析:环境光遮蔽与动态光照的兼容性解决方案
  • 2026年对羟基苯甲酸丁酯批发商如何优选?3个关键指标助你甄选 - geo交流
  • 高性价比儿童写字课推荐:【简知科技】性价比优
  • 【ACM 出版|EI+SCOPUS 双检索】2026 多模态、机器学习与数据科学国际会议 MMLDS 2026 征稿指南(郑州主场)
  • 从插件到权限系统:AI Agent工具使用的安全管控设计
  • Windows键盘按键管理:从屏蔽、重映射到个性化定制全攻略
  • Electron渲染进程与工具进程通信:原理、方案与实战避坑指南
  • 2026医疗器械国产PLM系统推荐:PDM系统厂商前十**实战手册 - 运营深度观察
  • 从Notion到Excel:如何构建个人知识管理与投稿追踪系统
  • 2026年佛山有实力的报废电缆回收多少钱一米?这份严选指南帮你避开高价陷阱 - geo交流
  • Ubuntu APT国内镜像源更换指南:原理、选型与实战
  • Ubuntu 20.04 Realtek无线网卡驱动安装与故障排查全指南
  • AI编程助手实战:提升开发效率与规避陷阱的深度指南