Cesium 点击绘制线/折线(动态绘制线/折线)

思路和之前做 Cesium 点击绘制多边形(动态绘制多边形) 一样的,点击查看

这里重点说一下: CallbackProperty是一个类,其值由回调函数延迟计算。也就是说它在不断地自我调用,每当其返回的对象有改变时,就会抛出改变后的值。利用这种特性,我们就可以在定义positions时,用CallbackProperty生成动态的数组赋值给positions参数,就可以得到动态绘制线/折线的效果。

使用方法:调用 click_draw_polygon() 方法就可以

// 保存所有点的数据
var polyline_point_arr = [];
// 临时线entity
var temporary_polyline_entity = null;
var handler = null;

// 开启绘制的方法
function click_draw_polyline() {
	// 清除可能会用到的监听事件
	if (handler) {
		handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
		handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
		handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
	}
	handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

	//鼠标左键--确定选中点
	handler.setInputAction((event) => {
		// 屏幕坐标转为世界坐标
		let cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(event.position), viewer.scene);
		let ellipsoid = viewer.scene.globe.ellipsoid;
		let cartographic = ellipsoid.cartesianToCartographic(cartesian);
		let lat = Cesium.Math.toDegrees(cartographic.latitude);
		let lon = Cesium.Math.toDegrees(cartographic.longitude);
		// 判断是否定义(是否可以获取到空间坐标)
		if (Cesium.defined(cartesian)) {
			// 将点添加进保存线的坐标的数组中,鼠标停止移动的时添加的点和,点击时候添加的点,坐标一样
			// 注意顺序不能错了,先经度后纬度
			polyline_point_arr.push(lon);
			polyline_point_arr.push(lat);
			// 判断是否开始绘制动态线,没有的话则开始绘制
			if (temporary_polyline_entity == null) {
				// 绘制动态线
				draw_dynamic_polyline();
			}
		}

		//鼠标移动--实时绘制线
		handler.setInputAction((event) => {
			// 屏幕坐标转为世界坐标
			let cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(event.endPosition), viewer.scene);
			let ellipsoid = viewer.scene.globe.ellipsoid;
			let cartographic = ellipsoid.cartesianToCartographic(cartesian);
			let lon = Cesium.Math.toDegrees(cartographic.longitude);  // 经度
			let lat = Cesium.Math.toDegrees(cartographic.latitude);   // 纬度

			// 判断是否定义(是否可以获取到空间坐标)
			if (Cesium.defined(cartesian)) {
				// 判断是否已经开始绘制动态线,已经开始的话,则可以动态拾取鼠标移动的点,修改点的坐标
				if (temporary_polyline_entity) {
					// 只要元素点大于二,每次就删除二个点,因为实时动态的点是添加上去的
					if (polyline_point_arr.length > 2) {
						// 删除数组最后两个元素(鼠标移动添加进去的点)
						polyline_point_arr.pop();
						polyline_point_arr.pop();
					}
					// 将新的点添加进动态线的坐标的数组中,用于实时变化,注意:这里是先添加了一个点,然后再删除点,再添加,这样重复的
					// 注意顺序不能错了,先经度后纬度
					polyline_point_arr.push(lon);
					polyline_point_arr.push(lat);
				}
			}
		}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
	}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

	//鼠标右键--结束绘制
	handler.setInputAction((event) => {
		// 取消鼠标移动监听
		handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
		// 清除动态绘制的线
		viewer.entities.remove(temporary_polyline_entity);
		// 删除保存的临时线的entity
		temporary_polyline_entity = null;
		// 绘制结果线
		draw_polyline();
		// 清空线点数组,用于下次绘制
		polyline_point_arr = [];
		// 清除所有事件
		if (handler) {
			handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
			handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
			handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
		}
	}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
}

//绘制动态线
function draw_dynamic_polyline() {
	temporary_polyline_entity = viewer.entities.add({
		polyline: {
			// 这个方法上面有重点说明
			positions: new Cesium.CallbackProperty(() => {
				return new Cesium.Cartesian3.fromDegreesArray(polyline_point_arr);
			}, false),
			// 宽度
			width: 2,
			// 线的颜色
			material: Cesium.Color.RED,
			// 是否显示
			show: true
		}
	});
}

//绘制结果线
function draw_polyline() {
	// 不需要线条闭合的话,删除最后一个动态添加的点(经度和纬度),如果鼠标没移动,最后一个和倒数第二个是一样的,所以也要删除
	polyline_point_arr.pop();
	polyline_point_arr.pop();
	// 需要线条闭合的话,下面两句(将起始点添加到结尾)
	// polyline_point_arr[polyline_point_arr.length - 2] = polyline_point_arr[0];
	// polyline_point_arr[polyline_point_arr.length - 1] = polyline_point_arr[1];
	// 两个点以上才能绘制成线
	if (polyline_point_arr.length >= 2) {
		let polyline_point_entity = viewer.entities.add({
			polyline: {
				// Cesium.Cartesian3.fromDegreesArray([经度1, 纬度1, 经度2, 纬度2,])
        		// Cesium.Cartesian3.fromDegreesArrayHeights([经度1, 纬度1, 高度1, 经度2, 纬度2, 高度2])
        		// 如果有高度,上面的 polyline_point_arr 里面要增加高度的
				positions: new Cesium.Cartesian3.fromDegreesArray(polyline_point_arr),
				// 宽度
				width: 2,
				// 线的颜色
				material: Cesium.Color.RED,
				// 是否显示
				show: true
			}
		});
	} else {
		return
	}
}

在这里插入图片描述

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 要使用Cesium PolylineCollection绘制线,您需要执行以下步骤: 1.创建Cesium Viewer对象 ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); ``` 2.创建PolylineCollection对象 ```javascript var polylineCollection = new Cesium.PolylineCollection(); ``` 3.创建PolylineGeometry对象 ```javascript var positions = Cesium.Cartesian3.fromDegreesArray([ -75.59777, 40.03883, -75.58833, 40.03683 ]); var polylineGeometry = new Cesium.PolylineGeometry({ positions: positions, width: 10.0 }); ``` 4.创建Material对象 ```javascript var material = Cesium.Material.fromType('Color'); material.uniforms.color = new Cesium.Color(1.0, 0.0, 0.0, 1.0); ``` 5.创建PolylineInstance对象 ```javascript var polylineInstance = new Cesium.PolylineInstance({ geometry: polylineGeometry, attributes: { color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED) }, id: 'polyline', pickPrimitive: sceneMode === Cesium.SceneMode.SCENE3D ? true : false, appearance: new Cesium.PolylineMaterialAppearance({ material: material }) }); ``` 6.将PolylineInstance对象添加到PolylineCollection对象中 ```javascript polylineCollection.add(polylineInstance); ``` 7.将PolylineCollection对象添加到场景中 ```javascript viewer.scene.primitives.add(polylineCollection); ``` 这样就可以在Cesium Viewer中绘制一条红色的宽度为10的折线。 ### 回答2: Cesium PolylineCollection是用于绘制线Cesium实体之一。 在使用Cesium PolylineCollection绘制线时,我们需要先创建一个PolylineCollection对象。首先,我们可以实例化一个PolylineCollection对象,并将其添加到场景中,这样才能显示出来。 然后,我们可以使用add方法来添加线段。这个方法需要我们提供表示线段的位置数组,位置数组中的每个元素都是Cartesian3对象,表示线段中的一个点。我们可以根据需要添加多个点,来创建一条有多个线段组成的线。 在添加完线段后,我们可以根据需要设置线的样式,如线的颜色、宽度等。这些样式可以通过Polyline对象的属性进行设置。例如,我们可以通过设置Polyline的material属性来设定线的颜色和透明度。此外,我们还可以设置线的宽度、线帽样式、线段连接样式等。 当设置好线的样式后,我们需要调用PolylineCollection的update方法,来使这些设置生效。这个方法会触发重新渲染,将更新后的线段显示出来。 使用PolylineCollection绘制线的过程可以紧密结合Cesium中的其他功能来实现更加丰富的应用。例如,我们可以在PolylineCollection中添加交互功能,实现鼠标点击、拖拽等操作来对线进行动态编辑。 综上所述,Cesium PolylineCollection是一个方便实用的工具,可以用于绘制线,通过设置线的样式和属性,可以实现不同风格的线段,并且可以与Cesium中的其他功能结合使用,实现更加丰富的应用场景。 ### 回答3: Cesium的PolylineCollection是一种用于绘制线的工具。通过使用Cesium的API和一些特定的属性,我们可以很容易地绘制线条。 首先,我们需要创建一个PolylineCollection对象。可以通过以下代码实现: ``` var polylineCollection = new Cesium.PolylineCollection(); ``` 接下来,我们可以使用PolylineCollection的add方法来添加线条。每条线需要指定一些属性,比如位置、颜色、宽度等。我们可以通过以下代码添加一条线: ``` var positions = Cesium.Cartesian3.fromDegreesArray([ -75.0, 35.0, -125.0, 35.0 ]); var polyline = polylineCollection.add({ positions: positions, width: 5, material: Cesium.Color.RED }); ``` 上述代码中,我们先使用Cesium的Cartesian3.fromDegreesArray方法创建了线条的起点和终点位置,这里的位置是以经度和纬度的形式给出的。然后,我们通过调用PolylineCollection的add方法来添加了一条线,指定了位置、宽度和颜色等属性。 最后,我们可以将PolylineCollection对象添加到场景中,这样就可以在三维地球上显示出线条了。代码如下: ``` viewer.scene.primitives.add(polylineCollection); ``` 上述代码中,viewer是Cesium.Viewer对象的实例,通过调用viewer.scene.primitives.add方法将PolylineCollection对象添加到场景的可视化图层中。 通过上述步骤,我们就可以使用Cesium的PolylineCollection绘制线条了。当然,我们还可以进一步探索Cesium的API,并根据需要调整线条的属性,来满足不同的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值