Skip to content

通视分析


ts
import { Viewer, SightLine } from "joDVF";
import { Pane } from "tweakpane";
import {
  ScreenSpaceEventHandler,
  PointPrimitiveCollection,
  Cesium3DTileset,
  HeadingPitchRange,
  ScreenSpaceEventType,
  Color,
  Cartographic
} from "joCesium";

const { mapContainer, uiContainer } = createContainer();
const viewer = new Viewer(mapContainer);
const scene = viewer.scene;
const sightLines: any[] = [];
// 定义开始和结束点
let startPoint, endPoint;
const drawhander = new ScreenSpaceEventHandler(scene.canvas);
const points = scene.primitives.add(new PointPrimitiveCollection());

const dataBaseURL = "./assets/3dtilesets/dayanta/tileset.json";
try {
  const tileset = await Cesium3DTileset.fromUrl(dataBaseURL);
  scene.primitives.add(tileset);
  const boundingSphere = tileset.boundingSphere;
  const radius = boundingSphere.radius;
  viewer.zoomTo(tileset, new HeadingPitchRange(-1.2, -0.6, radius * 2.0));
} catch (e) {
  console.log(e);
}
addUI();
function addUI() {
  const pane = new Pane({
    container: uiContainer,
    title: "操作"
  });

  const chooseViewBtn = pane.addButton({
    title: "选取观察点"
  });

  chooseViewBtn.on("click", () => {
    drawhander.removeInputAction(ScreenSpaceEventType.LEFT_CLICK);
    // console.log(points);
    points.removeAll();
    sightLines.forEach((sightLine) => sightLine.clear());
    draw(function (point) {
      points.add({
        position: point,
        color: Color.WHITE
      });

      startPoint = point;
      drawhander.removeInputAction(ScreenSpaceEventType.LEFT_CLICK);
    });
  });

  const addPointBtn = pane.addButton({
    title: "添加目标点"
  });

  addPointBtn.on("click", () => {
    draw(function (point) {
      points.add({
        position: point,
        color: Color.DEEPSKYBLUE
      });

      drawhander.removeInputAction(ScreenSpaceEventType.LEFT_CLICK);
      endPoint = point;
      const sightLine = new SightLine(scene, startPoint, endPoint);
      // 设置可见线颜色
      // sightLine.visibleColor = Cesium.Color.AQUA;
      sightLine.build();
      sightLines.push(sightLine);
      // console.log('交点:', sightLine.getIntersection())
      points.add({
        position: sightLine.getIntersection(),
        color: Color.RED
      });
    });
  });

  const clearBtn = pane.addButton({
    title: "清除"
  });

  clearBtn.on("click", () => {
    drawhander.removeInputAction(ScreenSpaceEventType.LEFT_CLICK);
    points.removeAll();
    sightLines.forEach((sightLine) => sightLine.clear());
  });
}

// 画点
function draw(cb) {
  drawhander.setInputAction(function (movement) {
    var cartesian = scene.pickPosition(movement.position);
    if (cartesian) {
      var cartographic = Cartographic.fromCartesian(cartesian);
      if (cartographic.height < 0) {
        var ray = viewer.camera.getPickRay(movement.position);
        cartesian = scene.globe.pick(ray, scene);
      }
    } else {
      cartesian = viewer.camera.pickEllipsoid(
        movement.position,
        scene.globe.ellipsoid
      );
    }
    if (typeof cb === "function") cb(cartesian);
  }, ScreenSpaceEventType.LEFT_CLICK);
}

function createContainer() {
  const container = document.createElement("div");
  container.style.width = "100%";
  container.style.height = "100%";

  const uiContainer = document.createElement("div");
  uiContainer.style.position = "fixed";
  uiContainer.style.top = "5px";
  uiContainer.style.left = "5px";
  document.body.appendChild(container);
  document.body.appendChild(uiContainer);

  return {
    mapContainer: container,
    uiContainer
  };
}