Cesium 多边形渐变色纹理(Canvas)类似 热力图,开启抗锯齿,cesium监听相机高度变化,Cesium 绘制线条/图形被地形高程遮挡的问题

869 阅读2分钟

Cesium 多边形渐变色纹理(Canvas)类似 热力图

image.png cesiumAPI查询地址cesium.xin/cesium/cn/D…

可以直接使用 ImageMaterialProperty(options)方法给Material赋值。

声明一个canvas标签,然后利用它在cesium绘制渐变色,类似于热力图

   //html=>
 <div id="cesiumContainer">
    <canvas id="myCanvas"></canvas>
  </div>
//js=>
// 绘制canvas渐变(这里用的是 径向/圆 渐变)
      var canvas = document.getElementById("myCanvas");
      if (canvas && canvas.getContext) {
        let ctx = canvas.getContext("2d");
        var grad = ctx.createRadialGradient(200, 200, 50, 260, 260, 200) // 创建一个渐变色径向/圆对象
        grad.addColorStop(0, "rgba(240,250,40,1)"); // 设置渐变颜色
        grad.addColorStop(0.25, "rgba(327,201,64,1)");
        grad.addColorStop(0.5, "rgba(22,184,200,1)");
        grad.addColorStop(1, "rgba(82,67,192,1)");
        ctx.fillStyle = grad; // 设置fillStyle为当前的渐变对象
        ctx.fillRect(0, 0, 500, 500); // 绘制渐变图形
      }
​
      // 绘制多边形
      viewer.entities.add({
        polygon: {
          // 获取指定属性(positions,holes(图形内需要挖空的区域))
          hierarchy: {
            positions: Cesium.Cartesian3.fromDegreesArray([
              120.9677706, 30.7985748,
              110.20, 34.55,
              120.20, 50.55
            ]),
          },
          extrudedHeight: 0.0,
          // 这里可以直接使用canvas元素
          material: new Cesium.ImageMaterialProperty({
            image: document.getElementById('myCanvas'),
            transparent: true
          }),
          closeTop: false,
          closeBottom: false
        }
      });
​
      // 用完可以删除之前绘制的canvas
      document.getElementById('myCanvas').remove();

开启抗锯齿

// 是否支持图像渲染像素化处理
      if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
        viewer.resolutionScale = window.devicePixelRatio
      }
​
      // 开启抗锯齿
      viewer.scene.postProcessStages.fxaa.enabled = true;

cesium监听相机高度变化

  viewer.camera.changed.addEventListener(() => {
        // 当前高度
        let height = viewer.camera.positionCartographic.height;
        // 下面可以写其他的代码了
        console.log(99, height);
      });

Cesium 绘制线条/图形被地形高程遮挡的问题

图一: 图片中点1点2之间是一条线,但是现在这条线有部分被遮挡了(图形的话也是一样的)

image.png

图二: 图片中的线是图一的完整正情况。

image.png

原因分析: depthTestAgainstTerrain 属性的设置问题。属性为true之后,相对于地形表面绘制,所以有地形的时候,会被地形的高程遮挡;如果设为false(默认值),那么将始终在顶部绘制。

// 相对于地形表面绘制
viewer.scene.globe.depthTestAgainstTerrain = true;
// 始终在顶部绘制(默认)
viewer.scene.globe.depthTestAgainstTerrain = false;