vue3 cesium datav 可视化大屏

news2024/9/20 14:55:34

目录

0. 预览效果

 1. 代码库包

2. 技术点

3. 一些注意事项(配置参数)

4. 相关代码详情 


0. 预览效果

        包含的功能:

        ① 地球按照一定速度自转

        ② 修改加载的geojson面样式

        ③ 添加 文字 标注!

 1. 代码库包

        

         直接采用vue-cli5 创建项目,选择vue3,router,vuex等,然后这里选择的datav不是官方的,由于官方的datav-vue3有些问题,暂时采用的为DataV Vue3+TS+Vite版 | DataV - Vue3

2. 技术点

        ① css 父相子绝,父元素position: relative; 子元素position: absolute; datav中的BorderBox11,cesium中viewer的挂接的元素下面就有这种。

        ②这里布局写的有点随意,可以参考其他的可视化大屏的布局,多采用几行几列的形式如:"flex:0 1 50%";此外,这里数据都是写死的,后面可以通过配置数据库实现。

        ③css height top width left 等等 尽量按照 n%的形式。

3. 一些注意事项(配置参数)

       项目采用的JavaScript,而非typescript!!!

        ①参考博主的另一篇关于vue3 cesium安装配置webpack的博客

        ② vue.config.js配置如下

const { defineConfig } = require('@vue/cli-service')
// el 按需自动引入
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
// cesium 配置
const CopyWebpackPlugin = require('copy-webpack-plugin')
const webpack = require('webpack')
const path = require('path')
 
let cesiumSource = './node_modules/cesium/Source/' //按理说应该是未打包的
const cesiumWorkers = '../Build/Cesium/Workers';
 
module.exports = defineConfig({
  transpileDependencies: true,
  publicPath: './',
  outputDir: "dist", // 输出文件目录
  lintOnSave: false, // eslint 是否在保存时检查 关闭语法检查
  // assetsDir: 'static', // 配置js、css静态资源二级目录的位置
  
  configureWebpack: {
    output: {
      sourcePrefix: ' '
    },
    amd: {
      toUrlUndefined: true
    },
    resolve: {
      alias: {
        '@': path.resolve('src'),
        'cesium': path.resolve(__dirname, cesiumSource)
      },
      // 参考别人说的,我不太懂webpack,所以都不知道咋解决https zlib问题  cesium github有example介绍了如何解决
      fallback: { "https": false, "zlib": false, "http": false, "url": false },
    },
    plugins: [
      // 对于webpack版本此处有不同配置,webpack低版本5.x执行下面4行注释的代码,对于webpack高版本9.x及以上,patterns是可以的。
      new CopyWebpackPlugin({
        patterns: [
          { from: path.join(cesiumSource, cesiumWorkers), to: 'Workers' },
          { from: path.join(cesiumSource, 'Assets'), to: 'Assets' },
          { from: path.join(cesiumSource, 'Widgets'), to: 'Widgets' },
          { from: path.join(cesiumSource, 'ThirdParty'), to: 'ThirdParty' },
        ],
      }),
      // new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Workers'), to: 'Workers'}]),
      // new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Assets'), to: 'Assets'}]),
      // new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Widgets'), to: 'Widgets'}]),
      // new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'ThirdParty'), to: 'ThirdParty'}]),
      new webpack.DefinePlugin({
        CESIUM_BASE_URL: JSON.stringify('./')
        // CopyWebpackPlugin from的绝对路径
      }),
      // el 自动引入
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      Components({
        resolvers: [ElementPlusResolver()],
      }),
    ],
    module: {
        unknownContextCritical: /^.\/.*$/,
        unknownContextCritical: false
    }
        
  }
})

4. 相关代码详情 

         

        ①index.html 修改

        

        ②App.vue

         

         ③HomeView.vue

<template>
    <BorderBox11 id="container" title="Vue3 Cesium DataV可视化大屏" :title-width="400" :animate="false">
        <div id="CesiumContainer"></div>
        <router-link to="project01">
            <BorderBox13 id="box01" title="第一板块" :title-width="200">
                <div id="title">第一板块</div> 
                <img src="../../public/img01.jpg" alt="">
            </BorderBox13>
        </router-link>
        <BorderBox13 id="box02" title="第二板块" :title-width="200">
            <div id="title">第二板块</div> 
            <img src="../../public/img02.jpg" alt="">
        </BorderBox13>
        <BorderBox13 id="box03" title="第三板块" :title-width="200">
            <div id="title">第三板块</div> 
            <img src="../../public/img03.jpg" alt="">
        </BorderBox13>
        <BorderBox13 id="box04" title="第四板块" :title-width="200">
            <div id="title">第四板块</div> 
            <img src="../../public/img04.jpg" alt="">
        </BorderBox13>
        <router-link to="project05">
            <BorderBox13 id="box05" title="第五板块" :title-width="200">
                <div id="title">第五板块</div> 
                <img src="../../public/img05.jpg" alt="">
            </BorderBox13>
        </router-link>
        <BorderBox13 id="box06" title="第六板块" :title-width="200">
            <div id="title">第六板块</div> 
            <img src="../../public/img06.jpg" alt="">
        </BorderBox13>
        <BorderBox13 id="box07" title="第七板块" :title-width="200">
            <div id="title">第七板块</div> 
            <img src="../../public/img07.jpg" alt="">
        </BorderBox13>
        <BorderBox13 id="box08" title="第八板块" :title-width="200">
            <div id="title">第八板块</div> 
            <img src="../../public/img08.jpg" alt="">
        </BorderBox13>
    </BorderBox11>
</template>

<script>
    import {  BorderBox11, BorderBox13  } from '@kjgl77/datav-vue3';
    import {reactive, ref, onMounted} from "vue";
    import * as Cesium from "cesium/Cesium.js";
    import "cesium/Widgets/widgets.css";
    export default {
        name: "App",
        components: {
            BorderBox11,
            BorderBox13,
        },
        setup(){
            var legend = reactive({});

            // 地球旋转
            function rotate(time, viewer) {
                viewer.clock.multiplier = 300; //速度
                viewer.clock.shouldAnimate = true;
                var previousTime = viewer.clock.currentTime.secondsOfDay;
                const onTickCallback = () => {
                    var spinRate = 1;
                    var currentTime = viewer.clock.currentTime.secondsOfDay;
                    var delta = (currentTime - previousTime) / 1000;
                    previousTime = currentTime;
                    viewer.scene.camera.rotate(Cesium.Cartesian3.UNIT_Z, -spinRate * delta);
                }
                // 开启地图自转效果
                viewer.clock.onTick.addEventListener(onTickCallback);

            };

            const firstCesium = ()=>{
                let viewer = new Cesium.Viewer("CesiumContainer", {
                    sceneModePicker: false,
                    navigationHelpButton: false,
                    baseLayerPicker: false,
                    animation: false,
                    timeline: false,
                    geocoder: false,
                    homeButton: false,
                    // infoBox: false,
                });
                // 设置自动旋转
                rotate(4000, viewer);

                // 设置背景颜色
                // viewer.scene.skyBox.show = false;
                // viewer.scene.backgroundColor = Cesium.Color.DARKBLUE;
                // viewer.scene.sun.show = false;
                // viewer.scene.moon.show = false;
            
                // 去掉logo
                viewer.cesiumWidget.creditContainer.style.display = "none"; 
                
                // 去掉背景图层
                // viewer.imageryLayers.removeAll();
        
                // 鼠标右键 倾斜操作
                viewer.scene.screenSpaceCameraController.tiltEventTypes = [
                    Cesium.CameraEventType.RIGHT_DRAG
                ];
                // 鼠标滑轮 放缩操作
                viewer.scene.screenSpaceCameraController.zoomEventTypes = [
                    Cesium.CameraEventType.WHEEL,
                    // Cesium.CameraEventType.PINCH
                ];
                // 鼠标左键 3D下聚焦局部时给人感觉是平移-本质是地球旋转(范围小-旋转类似平移)
                viewer.scene.screenSpaceCameraController.rotateEventTypes = [
                    Cesium.CameraEventType.LEFT_DRAG
                ];
                let geojsonLayer = Cesium.GeoJsonDataSource.load(
                    "http://192.168.1.127:80/HeBei_DiZhi/ZG.json",	// 这里是json文件的地址
                ).then((dataSource)=>{
                    const entities = dataSource.entities.values;
                    const colorHash = {};
                    for (let i = 0; i < entities.length; i++) {
                        //For each entity, create a random color based on the state name.
                        //Some states have multiple entities, so we store the color in a
                        //hash so that we use the same color for the entire state.
                        const entity = entities[i];
                        // console.log(i, entity);
                        const name = entity.name;
                        let color = colorHash[name];
                        if (!color) {
                        color = Cesium.Color.fromRandom({
                            alpha: 1.0,
                        });
                        legend[name] = color.toCssHexString();
                        colorHash[name] = color;
                        }

                        //Set the polygon material to our random color.
                        entity.polygon.material = color;
                        //Remove the outlines.
                        entity.polygon.outline = false;

                        // entity.polygon.extrudedHeight =
                        // entity.properties.Population / 50.0;
                    }
                    
                    viewer.dataSources.add(dataSource);

                    viewer.entities.add({
                        position: Cesium.Cartesian3.fromDegrees(115, 38, 1000000, Cesium.Ellipsoid.WGS84),
                        label: {
                            text: "中华人民共和国",
                            showBackground: true,
                            fillColor: Cesium.Color.WHITE,
                            font: '24px sans-serif',
                            // pixelOffset: new Cesium.Cartesian2(20, -15),
                            // scaleByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 8e5, 0),
                            backgroundColor: Cesium.Color.TRANSPARENT,
                        }
                    });
                })
            };
            onMounted(() => {
                firstCesium()
            });
            return {
                legend,
            }
        }
    }
</script>

<style lang="scss" scoped>
    #container {
        position: relative;
        height: 100%;
        width: 100%;
        background-color: darkblue;
    }
    #CesiumContainer {
        position: absolute;
        top: 15%;
        left: 20%;
        height: 70%;
        width: 60%;
    }
    #box01 {
        position: absolute;
        top: 8%;
        left: 2.5%;
        height: 20%;
        width: 15%;
    }
    #title {
        position: absolute;
        top: 2%;
        left: 3.5%;
        font-size: 0.4vh;
        color: white;

    }
    #box02 {
        position: absolute;
        top: 30%;
        left: 2.5%;
        height: 20%;
        width: 15%;
    }
    #box03 {
        position: absolute;
        top: 8%;
        right: 2.5%;
        height: 20%;
        width: 15%;
    }
    #box04 {
        position: absolute;
        top: 30%;
        right: 2.5%;
        height: 20%;
        width: 15%;
    }
    #box05 {
        position: absolute;
        top: 52%;
        left: 2.5%;
        height: 20%;
        width: 15%;
    }
    #box06 {
        position: absolute;
        top: 52%;
        right: 2.5%;
        height: 20%;
        width: 15%;
    }
    #box07 {
        position: absolute;
        top: 74%;
        left: 2.5%;
        height: 20%;
        width: 15%;
    }
    #box08 {
        position: absolute;
        top: 74%;
        right: 2.5%;
        height: 20%;
        width: 15%;
    }
    img {
        position: absolute;
        top: 20%;
        left: 15%;
        height: 70%;
        width: 70%;
    }
    #legend {
        position: absolute;
        bottom: 100px;
        right: 20px;
    }
    
</style>

        ④ router index.js

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySql从入门到精通

MySql介绍 MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 什么是数据库 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储…

oracle 闪回恢复

oracle 闪回恢复 闪回恢复区主要通过3个初始化参数来设置和管理&#xff1a; db_recovery_file_dest&#xff1a;指定闪回恢复区的位置 db_recovery_file_dest_size&#xff1a;指定闪回恢复区的可用空间大小 db_flashback_retention_target&#xff1a;指定数据库可以回退的时…

年近30 ,无情被辞,想给划水的兄弟提个醒

前几天&#xff0c;一个认识了好几年在大厂工作的程序员朋友&#xff0c;年近30了&#xff0c;却被大厂以“人员优化”的名义无情被辞&#xff0c;据他说&#xff0c;有一个月散伙饭都吃了好几顿…… 在很多企业&#xff0c;都有KPI考核&#xff0c;然后在此基础上还会弄个“末…

讲的太好了!!!————————Idea中的VM Options、Program Arguments、Environment Variable全解析

参数使用方式示例代码获取方式VM Options必须以 -D 、 -X 、 -XX 开头&#xff0c;每个参数用空格隔开 &#xff0c;使用最多的就是 -Dkeyvalue-Dvm.keyVmKey -Dvm.key2VmKey2String key System.getProperty(“vm.key”); Program Arguments为我们传入main方法的字符串数组arg…

10-03 单元化架构设计

设计原则 透明 对开发者透明 在做实现时&#xff0c;不依赖于单元划分和部署对组件透明 在组件运行时&#xff0c;不感知其承载单元对数据透明 数据库并不知道为哪个单元提供服务 业务可分片 系统业务复杂度足够高系统可以按照某一维度进行切分系统数据必须可以被区分 业务…

【网络】交换机基本原理与配置

目录 &#x1f341;交换机工作原理 &#x1f341;交换机接口的双工模式 &#x1f341;交换机命令行模式 &#x1f341;交换机常见命令 &#x1f9e7;帮助命令 &#x1f9e7;常用命令介绍 &#x1f341;交换机的基本配置 &#x1f9e7;配置接口的双工模式及速率 &#x1f990;博…

knife4j生产环境资源屏蔽

问题描述 knife4j是目前比较主流的自动API文档生成工具&#xff0c;在生产环境使用的过程中&#xff0c;我们一般会屏蔽或者去除Swagger的文档口径&#xff0c;防止接口信息泄露&#xff0c;保证系统安全。 但是最近在开发过程中使用knife4j-spring-boot-starter 3.0.2过程中&…

dolphinscheduler使用impala shell执行sql

目录 一、背景 二、方法 1.impala shell -f 文件名 2.impala shell -q sql 一、背景 因为dolphinscheduler工具sql组件不支持impala数据源&#xff0c;只能折衷方法通过shell来执行impala sql。 二、方法 1.impala shell -f 文件名 操作步骤&#xff1a; 1).【资源中心】…

受邀参加【第七届】中国客户服务节

在AI浪潮的推动下&#xff0c;客户服务“智能化”是企业高质量发展的重要途径之一&#xff0c;目前人工智能、大数据、云计算等技术已广泛应用于全行业的客户服务场景中&#xff0c;一个全面、完善、稳定的智能通讯服务平台可助力实现企业智能化应用转型和升级。 讯鸿网络作为国…

嘉立创EDA原理图封装画错了怎么办

摘要&#xff1a;本文以贴片电阻封装由1206修改为0805为例&#xff0c;介绍一下封装修改的一种方法。 1.问题描述 设计原理图的时候&#xff0c;误将封装设计成为1206了&#xff0c;现在想把它改为0805封装。 2.修改封装的步骤 首先在原理图中&#xff0c;修改对应的电阻器件…

Flutter 3.10 适配之单例 Window 弃用,一起来了解 View.of 和 PlatformDispatcher

Flutter 3.10 发布之后&#xff0c;大家可能注意到&#xff0c;在它的 release note 里提了一句&#xff1a; Window singleton 相关将被弃用&#xff0c;并且这个改动是为了支持未来多窗口的相关实现。 所以这是一个为了支持多窗口的相关改进&#xff0c;多窗口更多是在 PC 场…

统计学习方法:序贯概率比检验SPRT

Sequential Probability Ratio Test 应用&#xff1a;制造过程中的质量控制和医学试验中的异常检测 1.theory/principal 区别(vs固定样本检验)&#xff1a;在固定样本检验中&#xff0c;一定数量的观察结果被用来从两个或多个备选方案中选择一个假设。而SPRT则是一次检查一个…

AI“应用商店”来了!OpenAI首批70个ChatGPT Plugin最全梳理

OpenAI放出大招&#xff0c;本周将向所有ChatGPT Plus用户开放联网功能和众多插件本周将向所有ChatGPT Plus用户开放联网功能和众多插件&#xff0c;允许ChatGPT访问互联网并使用70个第三方插件。 本批第三方插件能够全方位覆盖衣食住行、社交、工作以及学习等日常所需&#x…

Electron自定义窗口

Electron标题栏隐藏和自定义 Electron应用自定义标题栏样式 标题栏样式允许隐藏浏览器窗口的大部分色彩&#xff0c;同时保持系统原生窗口控件完整无损&#xff0c;并可以在 BrowserWindow 的构造器中使用 titleBarStyle 选项来配置。 应用 hidden 标题栏样式的结果是隐藏标…

无线充+台灯专用PD诱骗芯片LDR6328S

近几年&#xff0c;日常生活中到处可以看到消费者使用支持Type-c接口的电子产品&#xff0c;如手机&#xff0c;笔记本&#xff0c;筋膜枪&#xff0c;蓝牙音箱等等。例如&#xff0c;像筋膜枪&#xff0c;蓝牙音箱&#xff0c;无人机&#xff0c;小风扇。 无线充台灯方案&…

librosa语音信号处理

librosa是一个非常强大的python语音信号处理的第三方库&#xff0c;本文参考的是librosa的官方文档&#xff0c;本文主要总结了一些重要&#xff0c;对我来说非常常用的功能。学会librosa后再也不用python去实现那些复杂的算法了&#xff0c;只需要一句语句就能轻松实现。 先总…

数字化时代,初创公司如何建设业财一体化

业财一体的关键是构建“业务活动跟财务活动之间的线上化链接”&#xff0c;财务可以通过线上支撑业务&#xff0c;业务活动数据可以通过线上高时效触达财务&#xff1b;从业务数据到财务数据&#xff0c;除了需要运营系统的支撑还需要会计引擎的实现&#xff0c;会计引擎将业务…

优秀的开发者,如何借助免费低代码平台实现数据采集?

采集和管理数据&#xff0c; 从未如此简单自然 一款免费的零代码产品‘敲敲云’&#xff0c;可以帮助每个人轻松创建表单&#xff0c;自由收集问卷样本、活动参与者名单、客户数据&#xff0c;原本几天的工作在 1 个小时内轻松搞定。 表单编辑器&#xff0c;让你和数据专家一样…

分享5款高效率软件,免费无广告

人类与99%的动物之间最大差别在于是否会运用工具&#xff0c;借助好的工具&#xff0c;能提升几倍的工作效率。 1.多设备键鼠共享——Synergy Synergy让你可以轻松地在办公桌上多台计算机之间共享你的鼠标和键盘。你只要将鼠标&#xff08;指针&#xff09;从一台计算机的屏幕…

用小程序技术服务数字城市

“十四五”规划大纲明确指出&#xff0c;要迎接数字时代&#xff0c;激活数据要素潜力&#xff0c;加快建设网络强国&#xff0c;加快建设数字经济、数码社会和数码政府&#xff0c;以数字化转型为变革的方式改变生产方式、生活方式和治理。 数字城市的技术内涵 数字城市的发…