Cesium 基础-- Entity

511 阅读2分钟

Entity实体

在Cesium中,实体Entity用于表示三维场景中的各种对象。Cesium提供多个属性用来表示墙、平面、点、模型、线、管道等

矩形 box

企业微信截图_17363922306277.png

  let entity1 = viewer.entities.add(
    new Cesium.Entity({
      name: "Red box with black outline",
      position: Cesium.Cartesian3.fromDegrees(-107.0, 40.0, 30000.0), 
      box: {
        dimensions: new Cesium.Cartesian3(20000.0, 15000.0, 15000.0),  // 长宽高
        material: Cesium.Color.RED.withAlpha(0.5),
        outline: true,
        outlineColor: Cesium.Color.BLACK,
      },
    })
  );

广告牌

企业微信截图_17363923081657.png

 var flog = true;
  let x = 0;
  let entity2 = viewer.entities.add(
    new Cesium.Entity({
      name: "Red box with black outline",
      position: Cesium.Cartesian3.fromDegrees(-107.0, 42.0, 300000.0),
      billboard: {
        image: imageUrl,
        width: 60,
        height: 60,
        show: new Cesium.CallbackProperty(() => {  //达到闪烁效果
          x = x + 0.05;
          if (x >= 1) {
            flog = !flog;
            x = 0;
          }
          return flog;
        }, false),
      },
    })
  );

走廊

企业微信截图_1736392623322.png

let entity3 = viewer.entities.add(
    new Cesium.Entity({
      name: "Red box with black outline",
      position: Cesium.Cartesian3.fromDegrees(-107.0, 42.0, 300000.0),
      corridor: {
        positions: Cesium.Cartesian3.fromDegreesArray([
          -108.0, 41.0, -108.0, 42.0, -109.0, 43.0,
        ]),
        extrudedHeight: 400,
        width: 30000,
        material: Cesium.Color.BLUE.withAlpha(0.5),
        height: 30000,
        heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND,
        cornerType: Cesium.CornerType.MITERED,
        outline:true,
        outlineColor:Cesium.Color.RED.withAlpha(0.5)
      },
    })
  );

圆柱体

企业微信截图_1736392706651.png

 let entity4 = viewer.entities.add(
    new Cesium.Entity({
      name: "cylinder",
      position: Cesium.Cartesian3.fromDegrees(-107.0, 42.0, 3000.0),
      cylinder: {
        length: 40000,
        topRadius: 10000,
        bottomRadius: 50,
        material: Cesium.Color.RED,
        outline: true,
        outlineColor: Cesium.Color.BLUE,
      },
    })
  );

椭球

企业微信截图_17363927868257.png

 let entity5 = viewer.entities.add(
    new Cesium.Entity({
      name: "ellipsoid",
      position: Cesium.Cartesian3.fromDegrees(-107.0, 41.0, 3000.0),
      ellipsoid: {
        radii: new Cesium.Cartesian3(10000, 10000, 10000),
        innerRadii: new Cesium.Cartesian3(5000, 5000, 6000),
        material: Cesium.Color.RED.withAlpha(0.6),
        outline: true,
        outlineColor: Cesium.Color.BLUE.withAlpha(0.6),
      },
    })
  );

标签

企业微信截图_1736392887398.png

 let entity6 = viewer.entities.add(
    new Cesium.Entity({
      name: "ellipsoid",
      position: Cesium.Cartesian3.fromDegrees(-107.0, 41.0, 3000.0),
      label: {
        text: "礼部尚书",
        scale: 1,
        font: "20px sans-serif",
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        fillColor: Cesium.Color.AQUA,
        outlineColor: Cesium.Color.BLACK,
        outlineWidth: 2,
        heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
        horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
        verticalOrigin: Cesium.VerticalOrigin.CENTER,
      },
    })
  );

模型

企业微信截图_17363929464342.png

 let entity7 = viewer.entities.add(
    new Cesium.Entity({
      name: "model",
      position: Cesium.Cartesian3.fromDegrees(-107.0, 43.0, 3000.0),
      model: {
        uri: "/monkey.gltf",
        color: Cesium.Color.RED.withAlpha(0.9),
        scale: 40000,
      },
    })
  );

路径

Cesium.CatmullRomSpline Cesium中的功能,用于生成平滑曲线,通过一组控制点生成平滑曲线的插值方法

CatmullRomSpline:{ time:[] 每个控制点处的时间参数, points:[]每个控制点的位置 }

const p1 = spline.evaluate(time[i] ) 在特定时间点获取曲线上的点。

video.gif

const points = [
    Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 620.01),
    Cesium.Cartesian3.fromDegrees(-112.87351, 36.27992, 617.9),
    Cesium.Cartesian3.fromDegrees(-112.87081, 36.2816, 617.6),
    Cesium.Cartesian3.fromDegrees(-112.86539, 36.28239, 625.36),
    Cesium.Cartesian3.fromDegrees(-112.86108, 36.28137, 627.82),
    Cesium.Cartesian3.fromDegrees(-112.85551, 36.27967, 625.54),
    Cesium.Cartesian3.fromDegrees(-112.848, 36.27732, 628.9),
    Cesium.Cartesian3.fromDegrees(-112.84086, 36.27739, 638.81),
    Cesium.Cartesian3.fromDegrees(-112.83682, 36.27995, 643.31),
  ];
  let startTime = Cesium.JulianDate.now();
  let endTime = Cesium.JulianDate.addSeconds(
    startTime,
    8,
    new Cesium.JulianDate()
  );

  viewer.clock.startTime = startTime.clone();
  viewer.clock.endTime = endTime.clone();
  viewer.clock.currentTime = startTime.clone();
  viewer.clock.multiplier = 1.0;
  viewer.clock.shouldAnimate = true;
  viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
  viewer.timeline.zoomTo(startTime, endTime);
  let times = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
  let spline = new Cesium.CatmullRomSpline({
    times: times,
    points: points,
  });

  let group = new Cesium.EntityCollection();
  for (let index = 0; index < points.length; index++) {
    let entityItem = new Cesium.Entity({
      position: points[index],
      point: {
        pixelSize: 10,
        color: Cesium.Color.TRANSPARENT,
        outlineColor: Cesium.Color.YELLOW,
        outlineWidth: 3,
      },
    });
    viewer.entities.add(entityItem);

    group.add(entityItem);
  }
  let entity8 = viewer.entities.add(
    new Cesium.Entity({
      availability: new Cesium.TimeIntervalCollection([
        //在特定时间短内是否显示
        new Cesium.TimeInterval({
          start: startTime,
          stop: endTime,
        }),
      ]),

      position: new Cesium.CallbackPositionProperty(function (time, result) {
        let splitTime = Cesium.JulianDate.secondsDifference(time, startTime);
        let pos = spline.evaluate(splitTime, result);
        return pos;
      }, false),
      path: {
        material: Cesium.Color.YELLOW.withAlpha(0.5),
        width: 10,
        resolution: 0.01,
        leadTime: 1,
        trailTime: 0.2,
      },
      trackingReferenceFrame: Cesium.TrackingReferenceFrame.INERTIAL,
      model: {
        uri: "/monkey.gltf",
        color: Cesium.Color.AQUA.withAlpha(0.7),
        scale: 160,
      },
    })
  );

平面

企业微信截图_17364015815616.png

  let entity9 = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 610.01),
    plane: {
      plane: new Cesium.Plane(Cesium.Cartesian3.UNIT_Z, 0.0),
      dimensions: new Cesium.Cartesian2(300, 400),
      material: new Cesium.Color.BISQUE.withAlpha(0.5),
      outline: true,
      outlineColor: Cesium.Color.BLACK,
    },
  });

企业微信截图_17364016423468.png

let entity10 = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 640.01),
    point: {
      pixelSize: 40,
      color: Cesium.Color.BISQUE.withAlpha(0.5),
      outlineColor: Cesium.Color.AQUAMARINE,
      outlineWidth: 2,
    },
  });

折线

企业微信截图_17364017473211.png

  const points = [
    Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 620.01),
    Cesium.Cartesian3.fromDegrees(-112.87351, 36.27992, 617.9),
    Cesium.Cartesian3.fromDegrees(-112.87081, 36.2816, 617.6),
    Cesium.Cartesian3.fromDegrees(-112.86539, 36.28239, 625.36),
    Cesium.Cartesian3.fromDegrees(-112.86108, 36.28137, 627.82),
    Cesium.Cartesian3.fromDegrees(-112.85551, 36.27967, 625.54),
    Cesium.Cartesian3.fromDegrees(-112.848, 36.27732, 628.9),
    Cesium.Cartesian3.fromDegrees(-112.84086, 36.27739, 638.81),
    Cesium.Cartesian3.fromDegrees(-112.83682, 36.27995, 643.31),
  ];
 let entity11 = viewer.entities.add({
    positions: Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 640.01),
    polyline: {
      positions: points,
      width: 10,
      material: Cesium.Color.WHITE.withAlpha(0.6),
      zIndex: 99,
      clampToGround: true,
    },
  });

多边形

企业微信截图_17364019121045.png

const points = [
    Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 620.01),
    Cesium.Cartesian3.fromDegrees(-112.87351, 36.27992, 617.9),
    Cesium.Cartesian3.fromDegrees(-112.87081, 36.2816, 617.6),
    Cesium.Cartesian3.fromDegrees(-112.86539, 36.28239, 625.36),
    Cesium.Cartesian3.fromDegrees(-112.86108, 36.28137, 627.82),
    Cesium.Cartesian3.fromDegrees(-112.85551, 36.27967, 625.54),
    Cesium.Cartesian3.fromDegrees(-112.848, 36.27732, 628.9),
    Cesium.Cartesian3.fromDegrees(-112.84086, 36.27739, 638.81),
    Cesium.Cartesian3.fromDegrees(-112.83682, 36.27995, 643.31),
  ];
let entity12 = viewer.entities.add({
    name: "polygon",
    positions: Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 640.01),
    polygon: {
      hierarchy: new Cesium.PolygonHierarchy(points),
    },
  });

矩形

企业微信截图_17364021647395.png

  let entity13 = viewer.entities.add({
    name: "rectangle",
    positions: Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 640.01),
    rectangle: {
      coordinates: new Cesium.Rectangle.fromDegrees(-112.0, 35.0, -111.0, 36.0),
      material: Cesium.Color.fromAlpha(Cesium.Color.RED, 1),
    },
  });

企业微信截图_17364022321882.png

 let entity14 = viewer.entities.add({
    name: "wall",
    positions: Cesium.Cartesian3.fromDegrees(-112.87709, 36.27782, 640.01),
    wall: {
      positions: points,
      material: Cesium.Color.fromAlpha(Cesium.Color.RED, 1),
      minimumHeights: points.map((item) => {
        return 30;
      }),
      maximumHeights: points.map((item) => {
        return 1000;
      }),
      material: new Cesium.ImageMaterialProperty({
        image: wall,
        transparent: true,
        repeat:new Cesium.Cartesian2(8.0,1.0)
      }),
      
    },
  });