高德地图加载海量点

本文介绍了一种使用AMap.MassMarks进行地图上海量点标记的优化方案,通过按需加载和分类显示图标来提高加载效率,并附带了具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实现效果的时候主要参考了两个例子:

1、点击打开链接

2、官方API列子

需求:本来我做的是加载点然后点击弹窗,但是由于数量多加载速度太慢,同事建议我换成海量点

参考例子1时,其他的都很好理解,就是

数据集格式为:, data: Array 坐标数据集. 例:data: [{lnglat: [116.405285, 39.904989], name: i,id:1},{}, …],{}, …]} 

首先我照着格式拼凑data

$.ajax( {
	        type : "post",
	        url : "simple.do?action=conditionQuery",
	        data:{
	        	'type':ss,
	            'province': provinceValue,
	            'city' : city,
	            'month':month,
	        },
	      	error:function () {
	           alert('服务器请求失败,请重新请求')
	        }, 
	        success : function(data){
	            var dt = JSON.parse(data.resultData);	
	            if(dt.length>0){
	            	  var style = [{
	                      url: 'resource/img/7.png',
	                      anchor: new AMap.Pixel(6, 6),
	                      size: new AMap.Size(8, 8)
	                    },{
	                      url: 'resource/img/9.png',
	                      anchor: new AMap.Pixel(3, 3),
	                      size: new AMap.Size(8, 8)
	                    },{
	                      url: 'resource/img/8.png',
	                      anchor: new AMap.Pixel(4, 4),
	                      size: new AMap.Size(8, 8)
	                    }
	                  ];
	            	 var massMarks = [];
		            for(var i=0;i<dt.length;i++){
		            	      
		            	var point={'lnglat':[dt[i].LNG,dt[i].LAT],'name':dt[i].CT,'id':dt[i].ID};
		            	massMarks.push(point);
		            }
		            var mass = new AMap.MassMarks(massMarks, {
				           opacity:0.8,
				           zIndex: 111,
				           cursor:'pointer',
				           style:style
				     });
		                                  
		            var marker = new AMap.Marker({content:' ',map:map});
				     mass.on('mouseover',function(e){
				       marker.setPosition(e.data.lnglat);
				       marker.setLabel({content:e.data.name})
				     })
				     mass.setMap(map); 
	            }else{
	            	alert('周边扩容小区未查询到相关数据');
	            }
	
	        }
 });

因为是筛选查询还有一个需求:按照不同分类加载的点的图标做区分

网上能够参考的例子也很少,我原来想着总共分为三类点,难道要做三个海量点的图层,再给每个图层的mark添加mouseover事件,但是不可能这么笨拙吧,于是我又去查了官网的参考文档,还真得找到了符合我需求的解释:


原有代码照着官方说明改进了一下

 $.ajax( {
	        type : "post",
	        url : "simple.do?action=conditionQuery",
	        data:{
	        	'type':ss,
	            'province': provinceValue,
	            'city' : city,
	            'month':month,
	        },
	      	error:function () {
	           alert('服务器请求失败,请重新请求')
	        }, 
	        success : function(data){
	            var dt = JSON.parse(data.resultData);	
	            if(dt.length>0){
	            	  var style = [{
	                      url: 'resource/img/7.png',
	                      anchor: new AMap.Pixel(6, 6),
	                      size: new AMap.Size(8, 8)
	                    },{
	                      url: 'resource/img/9.png',
	                      anchor: new AMap.Pixel(3, 3),
	                      size: new AMap.Size(8, 8)
	                    },{
	                      url: 'resource/img/8.png',
	                      anchor: new AMap.Pixel(4, 4),
	                      size: new AMap.Size(8, 8)
	                    }
	                  ];
	            	 var massMarks = [];
		            for(var i=0;i<dt.length;i++){
		            	var sn;
		            	if(dt[i].CT.indexOf("RRC") != -1){
			                sn=0;
		                }else if(dt[i].CT.indexOf("空口下行") != -1){
		                	sn=1;
		                }else{              
		                	sn=2;
		                }		       
		            	var point={'lnglat':[dt[i].LNG,dt[i].LAT],'name':dt[i].CT,'id':dt[i].ID,'style':sn};
		            	massMarks.push(point);
		            }
		            var mass = new AMap.MassMarks(massMarks, {
				           opacity:0.8,
				           zIndex: 111,
				           cursor:'pointer',
				           style:style
				     });
		                                  
		            var marker = new AMap.Marker({content:' ',map:map});
				     mass.on('mouseover',function(e){
				       marker.setPosition(e.data.lnglat);
				       marker.setLabel({content:e.data.name})
				     })
				     mass.setMap(map); 
	            }else{
	            	alert('周边扩容小区未查询到相关数据');
	            }
	
	        }
});
即实现了想要的效果

后记:加载速度确实比原先快了很多

高德地图Vue插件的开发手册通常会指导开发者如何在基于Vue.js的应用中集成和使用高德地图API,包括自定义海量的显示。以下是实现这一功能的一些关键步骤: 1. **安装依赖**:首先需要在项目中安装高德地图的官方Vue组件,例如`vue-amap`,通过npm或yarn进行安装。 ```bash npm install vue-amap @amap/api-v3 --save ``` 2. **注册并配置**:在Vue的main.js或入口文件里注册并初始化高德地图服务,设置所需的API Key。 ```javascript import VueAMap from 'vue-amap' Vue.use(VueAMap, { ak: 'your_amap_key', // 你需要替换为实际的高德地图API Key }) ``` 3. **创建地图组件**:创建一个新的Vue组件,利用`VueAMap.Map`组件,并设置地图容器和中心、缩放级别等属性。 ```html <template> <div ref="map" :style="{ width: '100%', height: '400px' }"></div> </template> <script> export default { components: { VueAMapMap: { extends: VueAMap.Map, props: ['center', 'zoom'] } }, data() { return { map: null, }; }, mounted() { this.initMap(); }, methods: { initMap() { const map = new this.VueAMapMap(this.$refs.map); map.setCenter(this.center).setZoom(this.zoom); // 接下来会教你如何添加和管理海量数据 }, }, }; </script> ``` 4. **处理大量数据**:由于一次性加载所有可能会导致性能问题,可以采取分页加载或者懒加载策略。你可以使用`MarkerClusterer`组件对密集进行聚合,或者使用`AMap.Marker`动态添加标记,只在用户查看到某个区域时才加载对应的数据。 5. **自定义标记样式**:对于海量,可能需要提供一种可视化的方式来区别不同类型的。你可以覆盖`Marker`的默认样式,并在每个上绑定事件监听器。 ```javascript // 示例:按颜色分类的 this.data.map(point => { const marker = new AMap.Marker({ position: point.location, icon: { url: `marker-${point.category}.png`, // 根据类别加载不同图标 size: new AMap.Size(32, 32), }, events: { click: () => console.log(point) } }); map.add(marker); }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛七分

随多随少随你心意^-^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值