百度地图采用MarkerClusterer生成聚合点,解决海量点造成地图卡顿的问题

2023-11-01

一、问题
最近在做公司的一个项目,需要在百度地图生成海量点,最开始只是把全部的marker一起显示到地图上,因为一次生成的点比较多,会发生地图卡顿等问题;
二、解决方案:MarkerClusterer
百度地图-JS API官方文档
MarkerClusterer:多标注聚合器。此工具解决加载大量点要素到地图上造成缓慢,且产生覆盖现象的问题。
步骤:
1、在html文件中引入MarkerClusterer_min.js 、 TextIconOverlay_min.js 文件
MarkerClusterer_min.js 聚合器的库文件
TextIconOverlay_min.js 标记器样式的库文件

<script type="text/javascript" src="static/js/bmap-offline/TextIconOverlay_min.js"></script>
<script type="text/javascript" src="static/js/bmap-offline/MarkerClusterer_min.js"></script>

2、将所有生成的标记marker存入一个数组markers,再new BMapLib.MarkerClusterer传给第二个参数的markers属性,第一个参数传入地图实例

this.markerClusterer = new BMapLib.MarkerClusterer(this.map, {markers});

3、创建时也可根据需求自定义参数配置param,比如修改聚合器的图片和样式之类的:


 * MarkerClusterer  创建时传入的参数列表
 * @class 用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能
 * @constructor
 * @param {Map} map 地图的一个实例。
 * @param {Json Object} options 可选参数,可选项包括:<br />
 *    markers {Array<Marker>} 要聚合的标记数组<br />
 *    girdSize {Number} 聚合计算时网格的像素大小,默认60<br />
 *    maxZoom {Number} 最大的聚合级别,大于该级别就不进行相应的聚合<br />
 *    minClusterSize {Number} 最小的聚合数量,小于该数量的不能成为一个聚合,默认为2<br />
 *    isAverangeCenter {Boolean} 聚合点的落脚位置是否是所有聚合在内点的平均值,默认为否,落脚在聚合内的第一个点<br />
 *    styles {Array<IconStyle>} 自定义聚合后的图标风格,请参考TextIconOverlay类<br />

三、采用聚合点的代码

this.markerClusterer && this.markerClusterer.clearMarkers(); //如果有聚合标记器,生成点之前从地图上彻底清除所有的标记
let markers = [];//存标记的数组
this.baiduMapMakerData.forEach((item, i) => {  //baiduMapMakerData 后端返回的Marker数据
		let {
			X,
			Y,
			abnormal_type,
			station_area_name
		} = item;
		let iconUrl = !abnormal_type ? '正常' : '异常';
		var icon = new BMap.Icon(`static/image/mapicon/${iconUrl}.png`, new BMap.Size(24, 30));
		let marker = new BMap.Marker(new BMap.Point(X, Y), {  //生成maker
			icon
		});
		markers.push(marker); //存入数组
})
let options = {
	markers,
	minClusterSize:5,
	styles:[],
	maxZoom:15,
	isAverangeCenter:true
}
// 设置聚合icon样式
var sizes = [53, 56, 66, 78, 90];
for(var i = 0, size; size = sizes[i]; i++){
			options.styles.push({
					url:this.combineIconUrl + i + '.png',
					size: new BMap.Size(size, size)
			});
	}//for循环的简洁写法
this.markerClusterer = new BMapLib.MarkerClusterer(this.map, options); //生成聚合器

四、改之前代码

//改之前的生成点的代码
this.map.clearOverlays();
this.baiduMapMakerData.forEach((item, i) => {
	let index = i;
	this.allBaiduIconcCreateTimer[index] = setTimeout(() => {
		let {
			X,
			Y,
			abnormal_type,
			station_area_name
		} = item;
		let iconUrl = !abnormal_type ? '正常' : '异常';
		var icon = new BMap.Icon(`static/image/mapicon/${iconUrl}.png`, new BMap.Size(24, 30));
		let marker = new BMap.Marker(new BMap.Point(X, Y), {
			icon
		});
		this.map.addOverlay(marker);
	}, index * 5)
})

五、效果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百度地图采用MarkerClusterer生成聚合点,解决海量点造成地图卡顿的问题 的相关文章

  • JW Player javaScript API 不工作

    我使用 jwplayer version 5 10 2295 和浏览器 chrome 25 My code jwplayer container setup file path width 300px height 100px autost
  • 获取express.js中间件请求中“#”后的url

    我需要获取服务器中间件上的 url 使用express js 我用req url但是当 url 开头时 some urlreq url 返回 与req path 有没有办法获取url之后 在express js中 No URL 中以 符号永
  • axios 请求中未发送正文数据

    我试图通过 axios 请求将数据发送到我的后端脚本 但正文看起来是空的 这是前端发送的请求 axios request method GET url http localhost 4444 next api headers Authori
  • 如何判断一个网页是否支持jquery?

    确定网页是否启用 jquery 的最佳方法是什么 如果这是确定它的最佳方法 则使用 jquery 本身 if jQuery jquery object exists jQuery 并不神奇 它本质上只是一个大对象 您可以像检查任何其他对象一
  • 在随机位置启动 HTML5

    我有一个大约 2 小时长的音轨 我想在我的网站上使用它 我希望它在页面加载时在随机位置开始播放曲目 使用 HTML5 可以吗 我知道您可以使用 element currentTime 函数来获取当前位置 但是如何在完全下载之前获取曲目的总时
  • 如何立即启动setInterval循环? [复制]

    这个问题在这里已经有答案了 在一个简单的setInterval setInterval function Do something every 9 seconds 9000 第一个动作将在 9 秒后发生 t 9s 如何强制循环立即执行第一个
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 这种类型注释在没有 TypeScript 的 React 代码中如何工作?

    我在看这段代码示例 https reacttraining com react router web example auth workflow在 ReactRouter 页面上 这篇文章很有趣 const PrivateRoute com
  • 全局传递 xhr onload 函数的值

    在我正在创建的应用程序中 我有以下 XMLHttpRequest 并且我正在尝试传递结果data在 的里面xhr onload 到在同一父函数中创建的数组中 var url http api soundcloud com resolve j
  • 为什么在 JavaScript 中 if([]) 被验证而 [] == false ?

    if false alert empty array is false alert alert 0 if alert empty array is true 他们都会运行警报 Demo http jsfiddle net roine ZFD
  • 如何在 Web 服务器上设置 gzip 压缩?

    我有一个嵌入式网络服务器 总共有 2 兆空间 通常 您使用 gzip 文件对客户端有利 但这会节省我们在服务器上的空间 我读到你可以只 gzip js 文件并将其保存在服务器上 我在 IIS 上测试过 但没有任何运气 为了使这项工作成功 我
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • 如果一个对象结构与另一个对象结构不匹配/不匹配,如何引发异常

    我将读取格式正确的用户输入对象 也就是说 输入对象现在可以具有接口中未定义的任何键或子结构 如果用户提供了无效的对象 我如何抛出异常 预定义接口 export interface InputStructureInterface tableN
  • 如何将 arraylist 从 servlet 传递到 javascript?

    我通过在属性中设置数组列表并将其转发到 jsp 来从 servlet 传递数组列表 Servlet ArrayList
  • Web组件中嵌套槽的内容不可见

    我有一个 Web 组件 它应该接受任意元素来包装其内容 虽然我可以在 Chrome 开发工具中看到插槽已正确分配 但 DOM 中什么也没有出现 以前有人见过这个问题吗 定义 class ExampleParent extends HTMLE
  • 如何在 webpack 中渲染嵌套的 SASS?

    采取以下CSS MyComponent color blue Button color red 以及以下 React 组件 import React from react import classes from MyComponent sc
  • Javascript 浮点乘以 100 仍然有错误

    我有一个货币字段的文本输入 我在字段中输入 33 91 并在尝试使用 乘以 100 技术时得到以下结果 var curWth parseInt trans withdraw index val 100 3390 var curWth par
  • 扩展 RegExp 以获取文件扩展名

    我知道 已经有很多基于 RegExp 的解决方案 但是我找不到适合我需求的解决方案 我有以下函数来获取 URL 的各个部分 但我还需要文件扩展名 var getPathParts function url var m url match w
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解

随机推荐