mapbox实现3d建筑物分层效果(类似单体化)

mapbox实现3d建筑物分层效果


前言

大家再使用mapboxgl做前端webgis可视化的时候有时候需要遇到加载的矢量白膜如何能分楼层呢(类似于单体化),下面我们就给大家讲下如何mapbox实现建筑物的单体化。


一、效果展示

效果展示如下图:将建筑物可以进行分层展示,基于目前mapbox自带的fill-extrusion图层实现效果,逻辑相对简单无需修改mapbox源码
在这里插入图片描述

二、实现过程

1.数据格式相关示例

数据格式可以参考以下,关键字段楼层的索引,楼层的高度(距离地面),当然这里可以根据自己的逻辑和需求做相关调整优化:
在这里插入图片描述

2.可视化代码

主要核心逻辑就是根据同一个面的楼层通过 fill-extrusion-height(高度) 和 fill-extrusion-base(底部高度)两个参数去实现

代码如下(示例):

			var map = new mapboxgl.Map({
				container: 'map',
				antialias:true,
				style: '底图服务路径'
			});


			map.on('load', function() {

				//加入建筑物数据源
				map.addSource('3dbuilding', {
					"type": "geojson",
					"data": "数据路径"
				});

				//根据数据源添加对应的图层
				map.addLayer({
					"id": "3dbuildlayer", // 唯一 id (必填)
					"type": "fill-extrusion", // 类型(必填)
					"source": "3dbuilding", // 数据源的名称
					"paint": { // 绘制类属性
						"fill-extrusion-color": "#308cd3",
						"fill-extrusion-height": ["get", "height"],
						// "fill-extrusion-base": ["*",["get","floorIndex"]-1,5]
						"fill-extrusion-base":["-",  ["*",["get","floorIndex"],5], 5]
					}
				})
				
				//高亮显示临时图层
				map.addLayer({
					"id": "3dbuildlayer-highlight", // 唯一 id (必填)
					"type": "fill-extrusion", // 类型(必填)
					"source": "3dbuilding", // 数据源的名称
					"paint": { // 绘制类属性
						"fill-extrusion-color": "#d31cac",
						"fill-extrusion-height": ["get", "height"],
						"fill-extrusion-base":["-",  ["*",["get","floorIndex"],5], 5]
					},
					"filter": ["==", "floorIndex", 0]
				})

				//鼠标移入事件
				map.on('mouseenter', '3dbuildlayer', function(e) {
					map.getCanvas().style.cursor = 'pointer';
					//选择的要素高亮展示
					var feature = e.features[0];
					map.setFilter('3dbuildlayer-highlight', ['==', 'floorIndex', feature.properties.floorIndex]);
				});

				//鼠标移出事件
				map.on('mouseleave', '3dbuildlayer', function(e) {
					map.getCanvas().style.cursor = '';
					map.setFilter('3dbuildlayer-highlight', ['==', 'floorIndex', 0]);
				});
			});
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值