cesium如何实现鼠标来回滑动再某一条线上,监听时间的变化,并且显示
时间: 2024-03-19 14:45:40 浏览: 135
要实现鼠标来回滑动再某一条线上,监听时间的变化,并且显示,可以采用Cesium的Entity API中的Polyline实体来实现。
首先,需要创建一个Polyline实体,并将其添加到场景中。然后,使用Cesium的鼠标事件监听器来监听鼠标的移动和单击事件。在移动事件中,可以根据鼠标的位置计算出鼠标在Polyline上的最近点,然后在该点处添加一个Point实体表示当前时间点。在单击事件中,可以将该Point实体从场景中移除。
以下是实现该功能的代码示例:
```javascript
var viewer = new Cesium.Viewer("cesiumContainer");
// 创建Polyline实体
var polyline = viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
-75, 35,
-125, 35
]),
width: 3,
material: Cesium.Color.RED
}
});
var point;
// 监听鼠标移动事件
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(movement) {
var position = viewer.scene.pickPosition(movement.endPosition);
if (position) {
var closestPoint = Cesium.GeometryPipeline.closestPointOnLineSegment(
position,
polyline.polyline.positions.getValue(0),
polyline.polyline.positions.getValue(1)
);
// 添加Point实体
if (!point) {
point = viewer.entities.add({
position: closestPoint,
point: {
color: Cesium.Color.YELLOW,
pixelSize: 10
}
});
} else {
point.position.setValue(closestPoint);
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
// 监听鼠标单击事件
handler.setInputAction(function() {
if (point) {
viewer.entities.remove(point);
point = undefined;
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
```
在上面的代码中,我们使用了Cesium的GeometryPipeline.closestPointOnLineSegment函数来计算鼠标在Polyline上的最近点。然后,根据该点位置创建一个Point实体,并将其添加到场景中。在鼠标单击事件中,我们将该Point实体从场景中移除。
同时,我们可以使用Cesium的Clock组件来实现时间的变化和显示。具体来说,我们可以在每个移动事件中获取当前的系统时间,并将其设置为Clock的currentTime属性。然后,我们可以在该Point实体的label组件中显示当前时间。
以下是修改后的代码示例:
```javascript
var viewer = new Cesium.Viewer("cesiumContainer");
// 创建Clock组件
var clock = new Cesium.Clock();
// 创建Polyline实体
var polyline = viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
-75, 35,
-125, 35
]),
width: 3,
material: Cesium.Color.RED
}
});
var point;
// 监听鼠标移动事件
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(movement) {
var position = viewer.scene.pickPosition(movement.endPosition);
if (position) {
var closestPoint = Cesium.GeometryPipeline.closestPointOnLineSegment(
position,
polyline.polyline.positions.getValue(0),
polyline.polyline.positions.getValue(1)
);
// 添加Point实体
if (!point) {
point = viewer.entities.add({
position: closestPoint,
point: {
color: Cesium.Color.YELLOW,
pixelSize: 10
},
label: {
text: "",
show: true,
pixelOffset: new Cesium.Cartesian2(0, -30)
}
});
} else {
point.position.setValue(closestPoint);
}
// 设置当前时间
clock.currentTime = Cesium.JulianDate.now();
point.label.text = clock.currentTime.toString();
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
// 监听鼠标单击事件
handler.setInputAction(function() {
if (point) {
viewer.entities.remove(point);
point = undefined;
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
// 启动Clock组件
viewer.clock = clock;
viewer.clock.shouldAnimate = true;
```
在上面的代码中,我们首先创建了一个Clock组件,并将其赋值给Viewer的clock属性。然后,在每个移动事件中,我们获取当前的系统时间,并将其设置为Clock的currentTime属性。同时,在该Point实体的label组件中显示当前时间。最后,我们启动Clock组件并将shouldAnimate属性设置为true,以启用时间动画。
阅读全文