可视化大屏-03

使用Cesium加载3dtiles文件并添加动画及交互操作
在这里插入图片描述

扬中粉尘看板录制

先安装cesium:

npm install cesium --save

使用参考:【vue2 + Cesium】使用Cesium、添加第三方地图、去掉商标、Cesium基础配置、地图放大缩小事件、获取可视区域、层级、高度
需要使用申请的token:

Cesium.Ion.defaultAccessToken = 'xxxxxxxxxx'

然后初始化:


            // 初始化CesiumJS
            this.viewer = new Cesium.Viewer('container', {
              animation: false, //是否显示动画控件
              baseLayerPicker: false, // 隐藏图层选择控件
              // baseLayerPicker: true, // 隐藏图层选择控件
              geocoder: false, // 隐藏地名查找控件
              timeline: false, // 隐藏时间线控件
              sceneModePicker: false, // 是否显示投影方式控件
              // creditContainer:false,
              navigationHelpButton: false, // 是否显示帮助信息控件
              fullscreenButton: false, // 是否显示全屏按钮
              infoBox: false, // 是否显示点击要素之后显示的信息
              homeButton: false, // 隐藏Home按钮
              // imageryProviderViewModels: [], // 不显示图层选择
              imageryProviderViewModels: [], // 禁用底图
              terrainProviderViewModels: [], // 禁用地形
              terrainProvider: new Cesium.createWorldTerrain({
                requestWaterMask: true, // 启用水面特效
              }),
              sceneMode: Cesium.SceneMode.SCENE3D, // 选择 3D 模式
              selectionIndicator: false,
            });
            // 创建Cesium3D Tiles加载器
            const tileset = this.viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
              url: 'http://192.168.9.29:5500/tileset.json' // 你的 3D Tiles 数据路径
            }));

            this.viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.3, -0.5, 1400));

使用如下绘制图片和文字框:

dangerIconMark(stationItem,startPosition,showImgUrl,markImg2){
      let that = this;
      var x = 1;
      var flog = true;
      that.billboard.push(that.viewer.entities.add({
        stationItem: stationItem,
        position: startPosition,
        billboard: {
          image: new Cesium.CallbackProperty(function () {
            if (flog) {
              x = x - 0.05;
              if (x <= 0) {
                flog = false;
              }
            } else {
              x = x + 0.05;
              if (x >= 1) {
                flog = true;
              }
            }
            return x >= 0.5 ? showImgUrl : markImg2;
          },false),
          scale: 0.5,
          verticalOrigin: Cesium.VerticalOrigin.CENTER,
          // eyeOffset: Cesium.Cartesian3(0, 0, 0),
          //文本的偏移方向
          pixelOffset : new Cesium.Cartesian2(0, -20)
        },
        // 添加图片标记点1
        label:that.displayName?{
          //文字内容
          text :  stationItem.name,
          //文字填充颜色
          fillColor : Cesium.Color.WHITE,
          //文本大小与字体
          font:'normal 15px Microsoft YaHei UI',
          //是否显示背景
          showBackground : true,
          //背景墙的颜色
          backgroundColor:Cesium.Color.fromCssColorString("rgb(0,0,0,0.3)"),
          //背景宽度
          backgroundPadding : new Cesium.Cartesian2(10, 5),
          //文字与背景墙的总大小
          scale : 1,
          //文本轮廓
          // style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          //外边界颜色
          outlineColor : Cesium.Color.BLACK,
          //外边界宽度
          outlineWidth : 2,
          //文本出现的位置
          verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
          //文本的偏移方向
          pixelOffset : new Cesium.Cartesian2(0, -40)
        }:{}
      }))
    },

监听点击事件:

handler = new Cesium.ScreenSpaceEventHandler(that.viewer.scene.canvas);
        that.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
that.viewer.screenSpaceEventHandler.setInputAction(function (e) {
   var pick = that.viewer.scene.pick(e.position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

监听鼠标悬浮事件

 // 监听鼠标移动事件
        that.viewer.screenSpaceEventHandler.setInputAction(function (movement) {
          // 使用 pick方法判断鼠标是否悬浮在实体上
          var pickedObject = that.viewer.scene.pick(movement.endPosition);

          // 删除 labelBox 实体
          that.viewer.entities.remove(that.labelBox);
          that.viewer.entities.values.forEach(entity => {
            if(entity.delLabel){
              that.viewer.entities.remove(entity);
            }
          });
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

仅供参考

### 使用 Tableau 创建数据可视化的最佳实践 #### 准备阶段 在准备创建数据可视化之前,确保拥有高质量的数据源至关重要。这不仅限于获取原始数据,还包括对数据进行必要的清洗和预处理工作,以便更好地支持后续的可视化操作[^3]。 #### 导入数据 启动 Tableau 后,通过连接到本地文件(如 Excel 或 CSV)、数据库或其他在线资源来加载所需的数据集。对于复杂或多样的数据源,可以利用 Tableau 的联合功能将多个表关联起来,从而构建更全面的数据视图[^4]。 #### 设计布局 规划好仪表板的整体架构是成功的关键之一。合理安排各个图表的位置与小,使整个页面既美观又易于理解;同时考虑加入筛选器、参数等功能组件让用户能互动探索更多细节信息[^5]。 #### 构建图表 依据具体业务场景选取合适的图形表达方式,比如柱状图适合比较类别间的差异,折线图则可用于展现时间序列上的变化趋势等。此外,在制作过程中要注重色彩搭配以及标签标注等方面的设计原则,提高可读性和吸引力[^2]。 #### 添加交互元素 为了让观众更加深入地参与到数据分析之中,可以在上设置一些交互式的控件,例如下拉菜单选择不同的维度查看相应结果,或是点击某个区域放显示特定部分的内容详情。这种动态效果有助于增强用户的参与感并促进有效沟通交流。 #### 发布分享 完成所有编辑之后,可以通过多种途径发布成品:既可以保存为静态图像供报告使用,也能打包成 .twb(x) 文件形式便于他人下载安装体验完整版本;更重要的是还可以上传至 Tableau Server 或 Public 平台实现广泛传播共享。 ```python import pandas as pd from tableauhyperapi import HyperProcess, Connection, CreateMode, Telemetry # 假设有一个名为 'data.csv' 的CSV文件作为输入数据源 df = pd.read_csv('data.csv') with HyperProcess(telemetry=Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper: with Connection(endpoint=hyper.endpoint, database='output.hyper', create_mode=CreateMode.CREATE_AND_REPLACE) as connection: # 将Pandas DataFrame写入Hyper文件中 table_name = "MyTable" df.to_sql(table_name, con=connection, index=False) print("Data has been successfully written into Hyper file.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值