MapBox GL集成自定义Canvas制作动态效果

Mapbox GL JS 中文文档 Mapbox GL JS-地图是通过在浏览器中而不是在服务器上将矢量瓦片与样式规则相结合来动态渲染的,这使得可以根据用户交互来更改地图的样式和显示数据。在开始使用Mapbox GL JS之前,您需要有一个Mapbox访问令牌,并使用 CDN 或 Mapbox GL-npmpackage 将 Mapbox GL JS.添加到您的项目中。由于Mapbox GL JS中的层是远程的,所以它们是异步的。有关Mapbox GL JS地图中使用的Mapbox设计和自定义地图样式的更多示例,请参阅我们的。 阅读详情

问题描述

当我们在使用MapBox过程中,有时需要添加动态图标或者一些其他复杂的效果。由于MapBox未提供添加GIF格式图片的接口。所以添加起来比较麻烦。而往往这些效果使用HTML或使用Canvas绘制很容易实现,所以本文主要介绍如何在MapBox中集成HTML或集成自定义Canvas效果。

相关接口

MapBox提供了addImage(id,image,options)方法,其具体介绍如下:

 Add an image to the style. This image can be displayed on the map like any other icon in the style's sprite using the image's ID with icon-image, background-pattern, fill-pattern, or line-pattern. A Map#error event will be fired if there is not enough space in the sprite to add this image.

Parameters
id(string)The ID of the image.
image((HTMLImageElement | ImageBitmap | ImageData | {width: number, height: number, data: (Uint8Array | Uint8ClampedArray)} | StyleImageInterface))The image as an HTMLImageElement , ImageData , ImageBitmap or object with width , height , and data properties with the same format as ImageData .

从接口中,我们可以看到,在image参数中,可以使用HTMLImageElement图片,我们可以查看HTMLImageElement的介绍。这就为我们使用自动有HTML或Canvas提供了方法。

官方示例

在MapBox的官方示例中提供了一种绘制动态点的例子。Add an animated icon to the map。该示例如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Add an animated icon to the map</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
<script src="https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v1.8.1/mapbox-gl.css" rel="stylesheet" />
<style>
	body { margin: 0; padding: 0; }
	#map { position: absolute; top: 0; bottom: 0; width: 100%; }
</style>
</head>
<body>
<div id="map"></div>
 
<script>
	mapboxgl.accessToken = '<your access token here>';
var map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v9'
});
 
var size = 200;
 
// implementation of CustomLayerInterface to draw a pulsing dot icon on the map
// see https://docs.mapbox.com/mapbox-gl-js/api/#customlayerinterface for more info
var pulsingDot = {
width: size,
height: size,
data: new Uint8Array(size * size * 4),
 
// get rendering context for the map canvas when layer is added to the map
onAdd: function() {
var canvas = document.createElement('canvas');
canvas.width = this.width;
canvas.height = this.height;
this.context = canvas.getContext('2d');
},
 
// called once before every frame where the icon will be used
render: function() {
var duration = 1000;
var t = (performance.now() % duration) / duration;
 
var radius = (size / 2) * 0.3;
var outerRadius = (size / 2) * 0.7 * t + radius;
var context = this.context;
 
// draw outer circle
context.clearRect(0, 0, this.width, this.height);
context.beginPath();
context.arc(
this.width / 2,
this.height / 2,
outerRadius,
0,
Math.PI * 2
);
context.fillStyle = 'rgba(255, 200, 200,' + (1 - t) + ')';
context.fill();
 
// draw inner circle
context.beginPath();
context.arc(
this.width / 2,
this.height / 2,
radius,
0,
Math.PI * 2
);
context.fillStyle = 'rgba(255, 100, 100, 1)';
context.strokeStyle = 'white';
context.lineWidth = 2 + 4 * (1 - t);
context.fill();
context.stroke();
 
// update this image's data with data from the canvas
this.data = context.getImageData(
0,
0,
this.width,
this.height
).data;
 
// continuously repaint the map, resulting in the smooth animation of the dot
map.triggerRepaint();
 
// return `true` to let the map know that the image was updated
return true;
}
};
 
map.on('load', function() {
map.addImage('pulsing-dot', pulsingDot, { pixelRatio: 2 });
 
map.addSource('points', {
'type': 'geojson',
'data': {
'type': 'FeatureCollection',
'features': [
{
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [0, 0]
}
}
]
}
});
map.addLayer({
'id': 'points',
'type': 'symbol',
'source': 'points',
'layout': {
'icon-image': 'pulsing-dot'
}
});
});
</script>
 
</body>
</html>

修改示例

在我们自定义HTML或Canvas时,只需更改上述示例中的pulsingDot即可。下面我们修改一个扇形扫描的效果。

var pulsingDot= {
      width: size,
      height: size,
      data: new Uint8Array(size * size * 4),
      // get rendering context for the map canvas when layer is added to the map
      onAdd: function () {
        let canvas = document.createElement('canvas');
        canvas.width = this.width;
        canvas.height = this.height;
        this.context = canvas.getContext('2d');
      },

      // called once before every frame where the icon will be used
      render: function () {
        let t = (performance.now() % duration) / duration;

        let radius = (size / 2) * 0.3;
        let outerRadius = (size / 2) * 0.7 * t + radius;
        let context = this.context;
        context.clearRect(0, 0, this.width, this.height);
        context.beginPath();
        context.arc(
          this.width / 2,
          this.height / 2,
          outerRadius,
          0,
          Math.PI * 2
        );
        context.fillStyle = 'rgba(' + colorList[0] + ',' + colorList[1] + ',' + colorList[2] + ',' + (1 - t) + ' )';
        context.fill();

        // draw inner circle
        context.beginPath();
        context.arc(
          this.width / 2,
          this.height / 2,
          radius,
          0,
          Math.PI * 2
        );
        this.data = context.getImageData(
          0,
          0,
          this.width,
          this.height
        ).data;

        // continuously repaint the map, resulting in the smooth animation of the dot
        map.triggerRepaint();

        // return `true` to let the map know that the image was updated
        return true;
      }
    };

扫描下方二维码,关注微信公众号,精彩内容同步更新,有问题可随时交流
微信公众号

Mapbox添加图片层 一、前言 上篇文章简单的介绍并使用了mapbox地图组件。这次我们在地图上添加图片。 效果图: 二、添加图片api 官方文档将图像添加到样式。 完整HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> 阅读详情

相关推荐

mapbox基础,加载canvas数据源,实现加载粒子效果图层

本文详细介绍如何基于mapbox-gl v3.*.* 版本,加载canvas数据源,实现加载粒子效果图层,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 440

Mapbox GL JS介绍和简单使用

可以显示立体地图并且支持移动端,是一款十分优秀的WEB GIS开发框架。Mapbox GL JS 是Mapbox的一个开源客户端库,用于渲染 Web 端的可交互地图。作为 Mapbox 生态系统的一部分,它通常与 Mapbox 提供的其他服务集成在一起,统一对外使用。WebGL渲染意味着高性能,MapboxGL能够渲染大量的地图要素,拥有流畅的交互以及动画效果、可以显示立体地图并且支持移动端,是一款十分优秀的WEB GIS开发框架。

weixin_39676449的博客 4939

mapbox基础,导出地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,导出地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 573

Mapbox GL JS学习之路(一):初识 Mapbox GL JS

初识 Mapbox GL JS

孙悟空 5578

从零构建:用Arduino和MCP2515模块搭建你的第一个CAN Bus网络

本文详细介绍了如何使用Arduino和MCP2515模块从零搭建CAN Bus网络,实现温湿度数据的传输与显示。涵盖硬件连接、软件配置、发送端与接收端代码实现,以及系统调试和进阶应用,帮助初学者快速掌握CAN总线通信技术。

d6e7f8的博客 831

nacos3.1.0适配国产数据库

Nacos 3.1.0适配国产数据库指南 本文介绍了Nacos 3.1.0版本适配达梦数据库和人大金仓数据库的具体步骤。主要内容包括:添加达梦和人大金仓的JDBC驱动依赖,修改nacos-persistence模块的配置文件及相关Java类,以及打包和运行注意事项。文章特别指出3.1.0版本需要JDK17环境,并提供了解决常见问题的建议,如添加VM options配置和不同启动方式等。通过本文的配置指导,可以实现Nacos服务在国产数据库环境下的正常运行。

梦昼初的博客 1463

Mapbox GL JS介绍及使用

Mapbox GL JS介绍及使用: Mapbox GL JS 是一个 JavaScript 库,它使用 WebGL,以 vector tiles 和 Mapbox styles 为来源,将它们渲染成互动式地图。 想要了解更多如何使用mapbox GL JS实现各个图层进行交互与基于mapbox的数据可视化,请参考mapbox web端开发文档http://www.mapbox.cn/mapbox-gl-js/api/和mapbox基本原理http://www.mapbox.cn/tutorials/glj

weixin_45697971的博客 6896

labview中DAQ采集多个数据通道(温度传感器)(TTL信号的曲轴位置传感器)总结

文章目录前言一、面对的问题篇二、问题解决篇三、后续工作总结 前言 我研一的项目利用labview软件和NI数据采集卡采集发动机传感器的信号然后进行采集,发动机传感器是有很多种的,所以难以避免的需要采集多个通道的传感器信号。 一、面对的问题篇 前篇已经写道我已经将温度传感器的信号采集出来,也可以将其数据进行信号处理,由电压信号转变为温度值。但是想要采集多个通道的信号,加上TTL信号的曲轴位置传感器,我模仿温度传感器采集的程序另加了一个DAQ助手进行采集。也就是如图所示的程序: 但是这个程序不能正常显

xiaobaiwsc的博客 1万+

mapbox-gl开发:自定义图层CustomLayer

在mapbox-gl过程中,当现有的图层效果不能满足实现效果时,可以使用自定义图层,关于CustomLayer API的官方说明: https://docs.mapbox.com/mapbox-gl-js/api/properties/#customlayerinterface mapbox-gl开发:deck.gl轨迹图效果,deck.gl叠加在mapbox-gl上的图层也是通过CustomLayer实现的。 CustomLayer上可以以webgl的方式实现,也能够以html5 canvas形式去实现

地理信息技术杂谈 博客,欢迎技术交流 4992

用户行为数据分析 User Behavior Data from Taobao for Recommendation

一、提出问题 二、理解数据 数据来源 阿里云天池数据集:(https://tianchi.aliyun.com/dataset/dataDetail?dataId=649) 本文选取的数据集为UserBehavior.csv,共有5242880条数据。数据的具体类别如下表所示: 用户行为种类有四种,如下表所示 对于数据维度的说明如下: 在本文选取的2017年11月25日到2017年12月3日的时间范围内,不重复的用户数量为10202,不重复的商品ID数为412369,不重复的商品类目ID数为5859,

cccxxxqq的博客 5205

反激开关电源设计全解析:从CCM/DCM原理到PCB布局实战

开关电源作为现代电子设备的能量转换核心,其核心原理是通过高频开关动作实现高效的电能变换。反激拓扑因其结构简单、成本低廉且易于实现电气隔离,成为小功率离线式电源的主流选择。其技术价值在于通过变压器耦合实现能量存储与传递,解决了安全隔离与多路输出等关键需求,广泛应用于充电器、适配器及家电供电等场景。本文聚焦反激电路,深入剖析其CCM与DCM两种工作模式的原理差异及选型考量,并结合伏秒平衡定律与RCD钳位等热词,详解从变压器计算到MOSFET选型的完整工程设计流程。

weixin_31951365的博客 342

在Mapbox-gl-js中添加自定义图层

在Mapbox-gl-js中添加自定义图层前言一、制作geojson地图二、使用Tippecanoe将geojson转换成vector tile(.pbf)文件三、使用mapbox-gl-js三、Mapbox-gl-js中根据矢量数据的属性过滤显示 前言 本文说明如何制作自定义的地图数据,并使用mapbox-gl-js进行显示 一、制作geojson地图 如果自定义的地图格式已经是geojson可跳过。 有时自定义数据来源较多,格式不定,此时需要将这些五花八门的格式统一成geojson格式。 可以通过Pyt

Kevin00Xu的博客 2514

Isograph Reliability Workbench 14实战:从零构建故障树分析模型

本文以“马达不转”为例,手把手教你使用Isograph Reliability Workbench 14从零构建故障树分析模型。内容涵盖创建工程、定义顶事件、添加逻辑门与基础事件等核心步骤,并介绍了模型检查与定性定量分析,帮助你系统掌握这一强大的可靠性工程工具。

weixin_29309213的博客 359

避开这3个坑!Mapbox GL自定义图层与原生地图事件冲突解决方案

本文深入探讨了在Mapbox GL JS地图上叠加自定义Canvas图层时,如何解决用户交互事件被上层图层“吞噬”导致地图无法操作的难题。文章剖析了事件冒泡与捕获机制冲突的根源,并提供了三种实战解决方案:智能事件代理与路由、双缓冲Canvas与地图变换同步、以及利用Mapbox原生Custom Layer接口实现无缝集成。重点介绍了如何通过`hitTest`碰撞检测和事件转发机制,在保留自定义图层交互能力的同时,确保地图的拖拽、缩放等原生操作不受影响,为开发高性能动态地理可视化应用提供了完整架构指南。

ttt77的博客 702

9.27华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

9.26华为OD机试真题 新系统 - 均衡调度 (Java/Py/C/C++/Js/Go)

算法大师! 489

容器化部署指南——Docker/K8s环境下的OpenClaw实践(附Dockerfile)

通过本文的详细指导,你已经掌握了OpenClaw在Docker和Kubernetes环境中的容器化部署方法。从基础镜像构建到高级部署策略,从开发环境到生产环境,你现在已经具备了完整的容器化部署能力。 容器化技术为OpenClaw提供了灵活、可扩展、可移植的部署方案,能够满足不同规模和需求的应用场景。通过合理使用Docker和Kubernetes,你可以实现高效的部署管理和运维自动化。 在实际应用中,建议根据具体的业务需求选择合适的部署策略,并结合监控、日志、安全等最佳实践,确保系统的稳定性和可靠性。同时

博客 493

探索Mapbox插件的无限可能:mapbox-plugins项目推荐

探索Mapbox插件的无限可能:mapbox-plugins项目推荐 项目介绍 mapbox-plugins 是一个为Mapbox地图库量身定制的开源插件集合,旨在扩展Mapbox的功能,提供更加丰富和动态的地图交互体验。无论是游戏控制、Canvas覆盖层、场景动画,还是与Chart.js的集成,mapbox-plugins 都能满足开发者对地图可视化的多样化需求。 项目技术分析 mapbox-p...

gitblog_00692的博客 857

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Mapbox GL JS自定义图层教程:如何深度集成Three.js 3D场景

Mapbox GL JS 是一个基于矢量瓦片和 WebGL 的浏览器地图引擎,它的**自定义图层(Custom Layer)**机制允许你把 Three.js 3D 场景直接渲染进地图的同一个 WebGL 上下文中——同一个画布、同一套相机、像素级对齐,无需 DOM 叠层。本教程带你从零理解自定义图层接口,并实战把 3D 模型"钉"到地图地形上。 --- ## 🗺️ 什么是自定义图层? 自

gitblog_00457的博客 167

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Mapbox 插件项目教程

Mapbox 插件项目教程 1. 项目介绍 mapbox-plugins 是一个开源项目,旨在为 Mapbox 提供自定义插件,扩展其功能。该项目包括游戏控制、Canvas 覆盖层、场景动画等功能,使用 ES6 编写。通过这些插件,开发者可以轻松地将高级功能集成到 Mapbox 地图中,从而创建更具交互性和动态性的地图应用。 2. 项目快速启动 安装 首先,通过 npm 安装 mapbox-plu...

gitblog_00381的博客 802

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

平衡车FOC固件刷写指南:从读保护到串口调参

二手平衡车到手,一开机就嗡嗡作响,起步一顿一顿,推着走像抱着台电动剃须刀。你以为电机老化了,其实多半是主板上跑的原厂程序还在用换相控制硬推转子——电机没问题,是固件太糙。hoverboard-firmware-hack-FOC 这套开源固件就是干这个的:把控制升级为 FOC(Field Oriented Control,磁场定向控制)。全文只教你一件正事:把这份 FOC 固件刷进 STM32F10

gitblog_00893的博客 820

ipaverse隐私与License完整解读:本地优先设计、Keychain安全存储与GPL/LGPL第三方组件

ipaverse 是一款运行在 Mac 上的 App Store 应用下载、重签名与侧载工具,无需 Xcode 或 Terminal 即可完成 IPA 的下载、检查、重签名与安装。本文从普通用户视角完整解读 ipaverse 的隐私架构:本地优先(local-first)设计、macOS Keychain 凭证存储机制,以及 GPL/LGPL 第三方组件带来的 License 边界,帮助你放心使用

gitblog_00432的博客 480

终极Eve离线地图实现指南:Mapbox GL与本地缓存深度解析

Eve是一个专注于提供“Better tools for thought”的开源项目,其核心功能之一是通过高效的本地缓存机制实现离线地图功能。本指南将详细介绍如何利用Eve的缓存系统构建离线地图应用,帮助用户在无网络环境下也能流畅使用地图服务。 ## 🌐 本地缓存机制核心原理 Eve的缓存系统通过路径缓存和运行时缓存双层架构实现高效数据存储。在[src/watchers/canvas.ts]

gitblog_00112的博客 1017

Super Simple Software Factory 12个ADW工作流全解:从单Agent到完整SDLC

**Super Simple Software Factory**(简称 SSSF)是一个可重复执行的 **agents-plus-code 工作流工具**:它把 AI 编码代理(Agent)封装成有边界的节点,由确定性的 Python 脚本(ADW,AI Developer Workflow)负责编排、重试与验收。项目内置 **12 个 ADW 工作流**,覆盖从「单个 Agent 一次提问」到

gitblog_00036的博客 1019

mapbox-gl:自定义webgl图层(1)

在mapbox-gl的开发中,除了默认的地图动态效果,可以通过两种方式增加地图中的显示效果,一是修改mapboxg-gl的源代码,另外就是通过加载自定义图层(CustomLayer)的方式,CustomLayer上可以以webgl的方式实现,也能够以html5 canvas形式去实现。 下边简单的以代码形式展示地图上的–动态闪光圆环效果: //定义着色器代码 ```javascript const vertexSource = `uniform mat4 u_matrix; a

地理信息技术杂谈 博客,欢迎技术交流 1251

地图框架之mapbox——(六)

今天跟大家分享一下popup、标注、以及canvas,到这里基本上mapbox的基本内容也就告一段落,后续根据我在工作中遇到的问题再做相关的分享。核心逻辑:把canvas动画与layout结合添加到图层中设置图层样式。首先记住标记不是图层,他只是作为一个单独的对象,被添加到地图上了。1、popup和marker结合使用。3、通过点击事件添加canvas动画。一、标注(marker)1、设置canvas动画。2、封装canvas动画。六、控制图层的显示和隐藏。1、如何向地图添加标记。四、canvas动画。

qq_45751819的博客 1958

使用mapbox源码分支创建3D气泡图

前言前言一、引入库二、创建3d气泡专题图定义一个专题图对象构建数据添加图层总结 前言 在研究webGL和Three.js之前,曾经看过mapbox-gl源码的一个分支,在mapbox主分支不支持 symbol 类型 layer 的3D效果(也就是Z轴传值)时,根据源码内容新建一个demo研究此类型的3d效果,现在我把成果分享出来! 一、引入库 需要引入 jquery、mapbox-gl分支代码和自己定义的测试数据json.js <script type="text/javascript" src=

sun_falls的博客 1347
上一篇: GeoServer发布shp数据
下一篇: PostGIS 查询某点周围指定范围内的兴趣点
giscoder
博客等级 码龄7年 20粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值