SuperMap iClient3D for WebGL之电子围栏特效

作者:nannan

目录

前言

一、动态上升

1.1 实现效果

1.2 实现方法

1.2.1 材质

1.2.2 代码

二、静态纹理

2.1 实现效果

2.2 实现方法

2.2.1 材质

2.2.2 代码

三、渐变纹理

3.1 实现效果

3.2 实现方法

3.2.1 材质

3.2.2 代码

四、循环运动

4.1 实现效果

4.2 实现方法

4.2.1 材质

4.2.2 代码

五、箭头运动

5.1 实现效果

5.2 实现方法

5.2.1 材质

5.2.2 代码


前言

       在现代地理信息系统中,电子围栏(Geofencing)技术已经成为了一种常见的功能,用于监控和管理特定区域的活动。电子围栏技术被广泛应用于物流管理、安防监控、智慧城市等领域。在本文中,我们将探讨如何利用SuperMap iClient3D for WebGL实现不同类型的电子围栏特效。

        首先来看整体效果:

        其次我们分别对每个电子围栏特效效果及实现方法做详细描述。

一、动态上升

1.1 实现效果

1.2 实现方法

1.2.1 材质

1.2.2 代码

        以下这段代码通过viewer.entities.add方法向三维场景中添加一个墙体实体。墙体的位置信息、最小高度信息和最大高度信息都被设置,其中最大高度信息通过回调函数CallbackProperty动态计算和更新。墙体的材质属性被设置为图片材质,使用了指定路径的图片,并设置了透明度。

var handlerLine = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Line);
				//绘制线的监听事件
				handlerLine.drawEvt.addEventListener(function(result) {
					handlerLine.polyline.show = false; //隐藏之前绘制的线
					var Line = result.object; //获取当前绘制线的对象
					var positions = Line.positions; //获取当前绘制线的节点坐标
					console.log("positions", positions)
					var flatPoints = [];
					//循环遍历线节点,将经纬度、高度传给flatPoints数组
					for(var i = 0, j = positions.length; i < j; i++) {
						var position = positions[i];
						var cartographic = SuperMap3D.Cartographic.fromCartesian(position);
						var lon = SuperMap3D.Math.toDegrees(cartographic.longitude);
						var lat = SuperMap3D.Math.toDegrees(cartographic.latitude);
						var height = cartographic.height;
						flatPoints.push(lon, lat, height);
					}
					//为了使绘制的线自动闭合,在最后将起点经纬度高度值传给flatPoints为终点
					for(var i = 0; i < 3; i++) {
						flatPoints.push(flatPoints[i]);
					}
					console.log("动态立体墙:", flatPoints);
					var minHeights = [];
					var maxHeights = [];
					var minH2 = [];
					var minH3 = [];
					var isShan = true;

					for(var i = 0; i < flatPoints.length / 3; i++) {
						// // 将每个点的高度取整后加入minHeights数组中
						minHeights.push(Math.floor(flatPoints[i * 3 + 2]));
						 检查当前高度与前一个高度是否相同,如果不同则将当前高度赋值为前一个高度,否则保持不变
						if(minH2[i - 1] && Math.floor(flatPoints[i * 3 + 2]) !== minH2[i - 1]) {
							minH2[i] = minH2[i - 1];
						} else {
							minH2[i] = Math.floor(flatPoints[i * 3 + 2])
						}
						// 如果当前高度小于0,则将当前高度设置为0
						if(minH2[i] < 0) {
							minH2[i] = 0
						}
					}
					for(var i = 0; i < flatPoints.length / 3; i++) {
						// 将每个点的高度加上80后加入maxHeights数组中
						maxHeights.push(flatPoints[i * 3 + 2] + 80)
					}
					console.log("最小高度:", minHeights);
					viewer.entities.add({
						wall: {
							positions: new SuperMap3D.Cartesian3.fromDegreesArrayHeights(flatPoints),
							minimumHeights: minHeights,
							maximumHeights: new SuperMap3D.CallbackProperty(function() {

								for(var i = 0; i < minH2.length; i++) {
									minH2[i] += 3; // // 将每个最小高度值增加3
									if(minH2[i] >= Math.max.apply(null, maxHeights)) { // 如果当前最小高度值大于等于所有最大高度值中的最大值

										if(Math.min.apply(null, minHeights) < 0) {
											minH2[i] = 0 + 3; // 如果所有最小高度值中的最小值小于0,则将当前最小高度值设置为0加3
										} else {
											minH2[i] = Math.min.apply(null, minHeights) + 3;
											// 否则将当前最小高度值设置为所有最小高度值中的最小值加3
										}
									}
								}
								return minH2;
							}, false),

							material: new SuperMap3D.ImageMaterialProperty({
								image: "./images/蓝1.png",
								transparent: true,
							})
						}
					})

					console.log("最大高度:", minH2);
				});

二、静态纹理

2.1 实现效果

2.2 实现方法

2.2.1 材质

2.2.2 代码

        以下这段代码通过viewer.entities.add方法向3D场景中添加另一个墙体实体。墙体的位置信息、最小高度信息和最大高度信息都被设置,最小高度信息和最大高度信息是固定的,这里是静态,与动态不同。同时设置了墙体的轮廓线为可见,并指定了轮廓线的颜色和宽度。墙体的材质属性被设置为图片材质,并指定了图片路径、透明度以及颜色为半透明的红色。

var handlerLine1 = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Line);

				handlerLine1.drawEvt.addEventListener(function(result) {
					handlerLine1.polyline.show = false;
					var Line = result.object;
					var positions = Line.positions;
					console.log("positions", positions)
					var flatPoints1 = [];
					let maxH = [];
					let minH = [];
					for(var i = 0, j = positions.length; i < j; i++) {
						var position = positions[i];
						var cartographic = SuperMap3D.Cartographic.fromCartesian(position);
						var lon = SuperMap3D.Math.toDegrees(cartographic.longitude);
						var lat = SuperMap3D.Math.toDegrees(cartographic.latitude);
						var height = Math.floor(cartographic.height);
						flatPoints1.push(lon, lat, height + 100);
						minH.push(0);
						maxH.push(180);
					}

					for(var i = 0; i < 3; i++) {
						flatPoints1.push(flatPoints1[i]);

					}

					console.log(maxH);
					console.log(minH);
					minH.push(minH[0]);
					maxH.push(maxH[0]);
					viewer.entities.add({
						wall: {
							positions: new SuperMap3D.Cartesian3.fromDegreesArrayHeights(flatPoints1),
							minimumHeights: minH,
							maximumHeights: maxH,
							outline: true,
							outlineColor: SuperMap3D.Color.RED,
							outlineWidth: 3,
							material: new SuperMap3D.ImageMaterialProperty({
								image: "./images/渐变.png",
								transparent: true,
								color: SuperMap3D.Color.RED.withAlpha(0.5)
							})

						}
					})
				});

三、渐变纹理

3.1 实现效果

3.2 实现方法

3.2.1 材质

3.2.2 代码

        该渐变纹理与静态纹理是一样的,只不过是材质有区别,材质为纯色渐变。代码具体如下:

var handlerLineg = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Line);

				handlerLineg.drawEvt.addEventListener(function(result) {
					handlerLineg.polyline.show = false;
					var Line = result.object;
					var positions = Line.positions;
					console.log("positions", positions)
					var flatPoints1 = [];
					let maxH = [];
					let minH = [];
					for(var i = 0, j = positions.length; i < j; i++) {
						var position = positions[i];
						var cartographic = SuperMap3D.Cartographic.fromCartesian(position);
						var lon = SuperMap3D.Math.toDegrees(cartographic.longitude);
						var lat = SuperMap3D.Math.toDegrees(cartographic.latitude);
						var height = Math.floor(cartographic.height);
						flatPoints1.push(lon, lat, height + 100);
						minH.push(0);
						maxH.push(180);
					}

					for(var i = 0; i < 3; i++) {
						flatPoints1.push(flatPoints1[i]);

					}

					console.log(maxH);
					console.log(minH);
					minH.push(minH[0]);
					maxH.push(maxH[0]);
					viewer.entities.add({
						wall: {
							positions: new SuperMap3D.Cartesian3.fromDegreesArrayHeights(flatPoints1),
							minimumHeights: minH,
							maximumHeights: maxH,
							material: new SuperMap3D.ImageMaterialProperty({
								image: "./images/黄1.png",
								transparent: true,
								color: SuperMap3D.Color.YELLOW
							})

						}
					})
				});

四、循环运动

4.1 实现效果

4.2 实现方法

4.2.1 材质

4.2.2 代码

       循环运动的电子围栏主要用到的接口为SuperMap3D.DynamicWallMaterialProperty,该接口为SuperMap iClient3D 11i(2024) for WebGL新增接口,大家可以在2024年SuperMap的beta版本发布后,在官方网站获取下载体验。

注意,在使用该接口前需要调用:

<!--循环运动-->
		<script type="text/javascript" src="./js/MaterialProperty/DynamicWallMaterialProperty_vertical.js"></script>
var handlerLinex = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Line);

				handlerLinex.drawEvt.addEventListener(function(result) {
					handlerLinex.polyline.show = false;
					var Line = result.object;
					var positions = Line.positions;
					console.log("positions", positions)
					var flatPoints1 = [];
					let maxH = [];
					let minH = [];
					for(var i = 0, j = positions.length; i < j; i++) {
						var position = positions[i];
						var cartographic = SuperMap3D.Cartographic.fromCartesian(position);
						var lon = SuperMap3D.Math.toDegrees(cartographic.longitude);
						var lat = SuperMap3D.Math.toDegrees(cartographic.latitude);

						flatPoints1.push(lon, lat);
						minH.push(0);
						maxH.push(60);
					}

					for(var i = 0; i < 2; i++) {
						flatPoints1.push(flatPoints1[i]);

					}

					console.log(maxH);
					console.log(minH);
					minH.push(minH[0]);
					maxH.push(maxH[0]);
					console.log("测试", flatPoints1);
					viewer.entities.add({
						wall: {
							positions: SuperMap3D.Cartesian3.fromDegreesArray(flatPoints1),
							maximumHeights: maxH,
							minimumHeights: minH,
							material: new SuperMap3D.DynamicWallMaterialProperty({
								trailImage: './images/ElectronicWall/wall.png',
								color: SuperMap3D.Color.CYAN,
								duration: 1500
							})

						},
					});
				});

五、箭头运动

5.1 实现效果

5.2 实现方法

5.2.1 材质

5.2.2 代码

       箭头运动的电子围栏主要用到的接口为SuperMap3D.ArrawWallMaterialProperty,该接口为SuperMap iClient3D 11i(2024) for WebGL新增接口,大家可以在2024年SuperMap的beta版本发布后,在官方网站获取下载体验。

注意,在使用该接口前需要调用:

<!--箭头运动-->
		<script type="text/javascript" src="./js/MaterialProperty/DynamicWallMaterialProperty_standard.js"></script>
var handlerLinef = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Line);

				handlerLinef.drawEvt.addEventListener(function(result) {
					handlerLinef.polyline.show = false;
					var Line = result.object;
					var positions = Line.positions;
					console.log("positions", positions)
					var flatPoints1 = [];
					let maxH = [];
					let minH = [];
					for(var i = 0, j = positions.length; i < j; i++) {
						var position = positions[i];
						var cartographic = SuperMap3D.Cartographic.fromCartesian(position);
						var lon = SuperMap3D.Math.toDegrees(cartographic.longitude);
						var lat = SuperMap3D.Math.toDegrees(cartographic.latitude);

						flatPoints1.push(lon, lat);
						minH.push(0);
						maxH.push(60);
					}

					for(var i = 0; i < 2; i++) {
						flatPoints1.push(flatPoints1[i]);

					}

					console.log(maxH);
					console.log(minH);
					minH.push(minH[0]);
					maxH.push(maxH[0]);
					console.log("测试", flatPoints1);
					viewer.entities.add({
						wall: {
							positions: SuperMap3D.Cartesian3.fromDegreesArray(flatPoints1),
							maximumHeights: maxH,
							minimumHeights: minH,
							material: new SuperMap3D.ArrawWallMaterialProperty({
								trailImage: './images/ElectronicWall/arrow.png',
								color: SuperMap3D.Color.YELLOW,
								duration: 1500
							})

						},
					});
				});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SuperMap iClient 3D for WebGL 是一款基于 WebGL 技术的三维地图开发工具,主要用于构建具有三维效果的地图应用程序。该工具提供了丰富的 API 接口和示例代码,可以帮助开发者快速上手,实现各种三维地图功能,如地形展示、建筑物模型、动态效果等。同时,SuperMap iClient 3D for WebGL 还支持多种数据格式,包括 SuperMap iServer 数据、OGC 标准数据、KML、GeoJSON 等,可以满足不同应用场景的需求。 ### 回答2: SuperMap iClient3D for WebGL是一个基于WebGL技术的三维地图开发框架。它提供了一系列的API和工具,使开发人员能够更加轻松地构建出高质量的三维地图应用。下面,我将从以下几个方面介绍SuperMap iClient3D for WebGL教程。 一、环境配置 SuperMap iClient3D for WebGL的开发需要先配置开发环境,包括安装Node.js、下载安装SuperMap iServer、下载安装SuperMap iClient3D资源包、创建Web应用程序。 二、基本概念 在学习SuperMap iClient3D for WebGL之前,需要了解一些基本概念。这些概念包括:场景(Scene)、层(Layer)、覆盖物(Overlay)等。在使用SuperMap iClient3D for WebGL时需要理解这些概念。 三、API使用 SuperMap iClient3D for WebGL提供了众多的API,使用这些API能够快速构建出一个三维地图应用。这些API包括:场景相关的API,如创建场景、设置场景属性等;层相关的API,如加载图层数据、隐藏、显示图层等;覆盖物相关的API,如创建点、线、面等覆盖物。 四、进阶应用 在掌握SuperMap iClient3D for WebGL的基础之后,可以通过进阶应用来进一步加深对这个框架的理解。进阶应用包括地球的三维测量、地球的动态效果、地球的热点区域等。 总之,SuperMap iClient3D for WebGL是一个非常实用的三维地图开发框架。通过学习其教程,开发人员可以更加方便、快速地构建出高质量的三维地图应用。 ### 回答3: SuperMap iClient 3D for WebGL是一款基于WebGL技术的开源GIS JavaScript库,用于构建高效、功能强大的3D GIS应用程序。这个库支持在Web浏览器里实现高质量的三维可视化效果,包括三维地形、建筑物、模型、标签等。现在,我来为你们讲解一下关于SuperMap iClient 3D for WebGL的教程。 一、前置知识 在接触SuperMap iClient 3D for WebGL之前,建议你先学习基本的WebGL知识和JavaScript语言,也应该具备计算机图形学基础和3D模型制作知识。 二、环境配置 在使用SuperMap iClient 3D for WebGL前,我们需要进行环境配置,在编写和运行项目时可以根据需要安装一系列依赖项,例如Node.js、npm包管理器、Gulp自动化工具、webpack工具和TypeScript编译器等。 三、基本使用 SuperMap iClient 3D for WebGL提供了丰富的API以实现3D可视化应用程序的开发,其中包括地图、图层、标注、工具、渲染等方面。同时,它还提供了多种数据格式的支持,如XYZ、OGC、JSON、KML、GML等。此外,SuperMap iClient 3D for WebGL还支持多种操作和交互方式,如平移、旋转、缩放、选取、编辑等,让用户可以更加自由地探索和编辑地图数据。 四、示例应用 SuperMap iClient 3D for WebGL提供了一系列的示例应用程序,可以帮助用户更好的理解其使用方法和特点,其中包括一些经典的三维场景展示和实时数据可视化等。例如,用户可以体验到城市三维建模、天气预报、热力图、空气质量监控等实用的功能。此外,SuperMap iClient 3D for WebGL也提供了一些模板和组件,供用户快速搭建自己的3D GIS应用程序。 总之,SuperMap iClient 3D for WebGL是一款非常优秀的基于WebGL技术的GIS JavaScript库,具有开源、高效、功能强大、易用等特点,可以为用户提供丰富多彩的三维GIS应用程序。当然,在使用前,建议用户先了解基本的WebGL和JavaScript知识,同时还需配置好开发环境。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值