Cesium鼠标画点

项目地址

https://github.com/zhengjie9510/webgis-demo

实现效果

请添加图片描述

实现方法

1、构建 DrawPoints 类

class DrawPoints {
  constructor(options) {
    this.layer = new Cesium.CustomDataSource('MyPoints')
    this.handler = undefined
  }
  /**
   * 添加鼠标点击事件
   * @param {Cesium.Viewer} viewer 目标地图
   */
  bindAction(viewer) {
    if (!this.handler) {
      this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    }
    this.handler.setInputAction((click) => {
      let earthPosition = undefined
      // 球面
      if (viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider) {
        earthPosition = viewer.scene.camera.pickEllipsoid(click.position);
      }
      // 地形
      else {
        const ray = viewer.camera.getPickRay(click.position);
        earthPosition = viewer.scene.globe.pick(ray, viewer.scene);
      }
      if (Cesium.defined(earthPosition)) {
        const entity = this.createPoint(earthPosition)
        this.layer.entities.add(entity)
      }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
  }
  /**
   * 创建点
   * @param {Cesium.Cartesian3} worldPosition A 3D Cartesian point.
   * @return {Cesium.Entity} 点实体
   */
  createPoint(worldPosition) {
    const point = new Cesium.Entity({
      position: worldPosition,
      point: {
        color: Cesium.Color.RED,
        pixelSize: 5,
        heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
      },
    })
    return point;
  }
  /**
   * 添加图层
   * @param {Cesium.Viewer} viewer 目标地图
   */
  addToMap(viewer) {
    viewer.dataSources.add(this.layer);
  }
}

2、使用 DrawPoints 类

const drawPoints = new DrawPoints()
drawPoints.bindAction(viewer)
drawPoints.addToMap(viewer)
使用Cesium画点并添加弹框的步骤如下: 1. 首先,您需要在Vue项目中安装Cesium和vite-plugin-cesium插件。在vite.config.ts文件中,配置插件和别名,以便正确加载Cesium库。 2. 在Vue组件中,引入Cesium并创建一个Viewer实例。您可以使用Cesium.CesiumWidget构造函数来创建一个具有默认属性的Viewer。 3. 创建一个Entity实例,并设置其位置以及其他属性。您可以使用Cesium.Cartesian3来定义点的位置。 4. 为Entity添加描述信息,可以使用Entity.description属性。您可以在描述中使用HTML标签和CSS样式来自定义弹框的内容。 5. 监听鼠标单击事件,获取点击屏幕位置,使用Cesium.SceneTransforms.wgs84ToWindowCoordinates将Cartesian坐标转换为屏幕坐标。 6. 动态设置弹出框的位置,通过计算弹出框的宽高和实时位置来确定其在屏幕上的位置。 下面是一个示例代码片段,展示了使用Cesium画点并添加弹框的过程: ```javascript // 在Vue组件中 import * as Cesium from 'cesium'; export default { mounted() { // 创建Cesium Viewer实例 const viewer = new Cesium.Viewer(this.$refs.cesiumContainer, { // 设置其他属性 }); // 创建Entity实例 const entity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(经度, 纬度), // 设置点的位置 point: { pixelSize: 10, color: Cesium.Color.YELLOW, }, description: '<div>弹框的内容</div>', // 设置弹框的内容 }); // 监听鼠标单击事件 viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(event) { const position = event.position; const cartesian = viewer.camera.pickEllipsoid(position, viewer.scene.globe.ellipsoid); const windowPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian); // 根据windowPosition设置弹出框的位置 }, Cesium.ScreenSpaceEventType.LEFT_CLICK); }, }; ``` 请根据您的具体需求和项目设置,进行适当的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值