两行代码就能动态预览绘图cesium draw

draw-cesium 动态绘制 点、线、多边形、圆形、矩形,并支持距离和面积测量


前言

Cesium原生不支持绘图,所以我封装了一个draw函数,可动态绘制 点、线、多边形、圆形、矩形,并支持距离和面积测量。
已开源 点击查看github开源地址其中包含cesium常用函数封装,以及cesium three组合使用。
只要两行代码就能实现动态画线

 const draw = new Draw(viewer);
 draw.addEntity("line"); //线

动态预览功能。以绘制线条为例,首次点击地图后,将立即在点击位置生成线条的起始点(顶点1)。随后,鼠标在地图上的移动将实时反映为线条终点的变化(顶点2的候选位置),线段效果动态跟随鼠标轨迹,直到用户再次点击以确认终点位置,从而完成线段的两点确定。

测量功能包括两点间距离和多边形面积,但面积计算精度待优化。总体而言,该工具集扩展了Cesium功能,提供了绘图与测量解决方案,但仍需改进面积计算精度。

在这里插入图片描述

一、实现思路

1.点击事件

监听鼠标指针LEFT_CLICK,获取经纬度,创建实体。使用CallbackProperty 动态修改entity的经纬度值,实现动态绘图的效果

this.viewer.entities.add({
  name: "Draw_Line",
    polyline: {
      positions: new CallbackProperty(function () {
        return Cartesian3.fromDegreesArray(coordinates);
      }, false),
      width: 2,
      material: Color.BLUE.withAlpha(0.9),
    },
});

2.监听鼠标移入移出事件 动态修改

监听鼠标指针MOUSE_MOVE,获取经纬度。全局对象 coordinates:[经度,纬度,经度,纬度] 。在此动态修改coordinates的值,实现动态绘图的效果

var handler_MOUSE_MOVE = new ScreenSpaceEventHandler(viewer.scene.canvas);
// 监听鼠标移动事件,增加预览效果
  handler_MOUSE_MOVE.setInputAction((e) => {
    this.onMouseMove(e);//获取经纬度
  }, ScreenSpaceEventType.MOUSE_MOVE);

二、使用步骤

1.引入库

https://github.com/mantoudebaba/cesium-three
npm install 
npm run dev

2.使用示例

注:鼠标左击开始,鼠标滚轮点击结束。

1.实例draw

viewer:地图示例

 const draw = new Draw(viewer);

2.绘图 点 线 多边形 圆 矩形 测距 测面积

draw.addEntity("point"); //点
draw.addEntity("line"); //线
draw.addEntity("polygon"); //多边形
draw.addEntity("circle"); //圆
draw.addEntity("rectangle"); //矩形
draw.addEntity("range"); //测距
draw.addEntity("area"); //测面积

3.清除绘图

draw.removeAll();

4.导出(经纬度)

 draw.exportEntities();
 
//控制台输出
 entitiesData = {
      point: [],
      line: [],
      polygon: [],
      circle: [],
      rectangle: [],
      range: [],
      area: [],
   }; //储存所有实例的 entity对象的经纬度

总结

欢迎大佬指点

### 回答1: Cesium是一款强大的地球浏览器框架,支持用JavaScript编写动态水面。 下面是一个简单的例子,该代码将创建一个圆形水面: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); var entity = viewer.entities.add({ name : 'Water surface', position : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), ellipse : { semiMinorAxis : 1000.0, semiMajorAxis : 1000.0, material : new Cesium.ImageMaterialProperty({ image : 'path/to/water.png', repeat : new Cesium.Cartesian2(5.0, 5.0) }) } }); ``` 该代码使用了Cesium的`Viewer`类和`entities.add()`方法创建了一个新的实体。 通过设置实体的`ellipse`属性,我们可以在场景中添加一个圆形水面。 可以通过更改代码中的图像路径、水面大小和位置来调整水面的外观和行为。 ### 回答2: 要用JavaScript代码编写Cesium动态水面,首先需要使用Cesium库和相关插件。下面是一个简单的实现例子: ```javascript // 创建Cesium Viewer const viewer = new Cesium.Viewer("cesiumContainer"); // 创建水面 function createWater() { const waterSurface = new Cesium.Water(new Cesium.Cartesian3(-90000.0, -90000.0, 0.0)); waterSurface.shininess = 0.1; waterSurface.specularIntensity = 0.3; waterSurface.normalMap = "path/to/normalMap.png"; // 水面法线贴图路径 waterSurface.colorBlendMode = Cesium.BlendMode.HIGHLIGHT; waterSurface.colorBlendAmount = 0.5; viewer.scene.primitives.add(waterSurface); // 动态更新水面效果 viewer.clock.onTick.addEventListener(function (clock) { const time = clock.currentTime.secondsOfDay; waterSurface.smallWavesFrequency = time * 0.02; // 水波的频率 waterSurface.smallWavesSpeed = time * 0.01; // 水波的速度 }); } createWater(); ``` 上述代码中,我们使用了Cesium的Water对象创建水面,并设置了一些参数,如光泽度、反射强度、水波法线贴图等。然后,我们使用Cesium的Clock对象监听时钟每Tick的事件,在每个Tick时更新水面的效果,产生动态的水波效果。 需要注意的是,除了以上示例中的代码,还需要加载Cesium的库和相关资源(可以是本地文件或CDN链接),以及创建一个用于显示Cesium的HTML容器(如id为“cesiumContainer”的div),才能使水面正常显示。可以根据实际需求进行更多的参数设置和功能扩展。 ### 回答3: 要用Javascript代码编写Cesium动态水面,首先需要使用Cesium的Water模块。以下是一个简单的示例代码: ```javascript // 创建cesium场景 var viewer = new Cesium.Viewer("cesiumContainer"); // 添加水面 var water = viewer.scene.primitives.add(new Cesium.Water({ // 设置水面的位置和大小 normalMap: "path/to/normal_map.jpg", // 水面法线贴图 frequency: 1000, // 波频 animationSpeed: 0.02, // 波动速度 amplitude: 10.0, // 波动幅度 specularIntensity: 0.8, // 镜面反射强度 baseWaterColor: Cesium.Color.WHITE, // 水面基础颜色 blendColor: Cesium.Color.BLUE, // 混合颜色 properties: { // 设置水面的属性 waves: new Cesium.Cartesian3(10, 10, 0.0) // 波动向量 } })); // 设置相机位置 viewer.scene.camera.setView({ destination : Cesium.Cartesian3.fromDegrees(-122.4194, 37.7749, 1000.0) // 设置经纬度和高度 }); ``` 上述代码中,首先创建了一个Cesium的Viewer对象,并实例化了一个水面对象water并添加到场景中。然后通过设置水面的各种参数,如法线贴图、波频、波动速度等,来控制水面的效果。最后设置相机初始位置,以使水面可见。 请注意,在实际应用中,你可能需要根据具体需求对水面进行进一步的自定义和优化,例如调整水面的形状、添加材质等等。以上代码仅作为示例,供参考使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值