Vue离线集成Cesium

        对Vue我也不是非常的了解,但是系统又经常有这种很奇怪的需求,这次是离线状态下为Vue项目集成Cesium框架,因为不能使用npm run install这样的指令,网上试了很多方法,加上自己的摸索,下面是我实现的过程。

1,将node_modules的cesium文件夹,和babel-plugin-dynamic-import-node 复制进我们的项目(提前在有网环境下载好,注意版本),然后修改package.json

 "dependencies": {
  "babel-plugin-dynamic-import-node": "^2.3.3",
    "cesium": "^1.82.0"   //修改的就是这2条,cesium版本要写对
  },
  "devDependencies": {  //不要修改这个大括号里面的
    
  }
}

2.配置vue.config.js 有Cesium的地方(直接搜索Cesium这个关键字)

这段代码是之前解决的时候从网上找的,稍微修改了一下,但是已经找不到原来参考的博客的地址了。还有就是没有哪种解决方法能完美解决每个问题,多改改这些参数,说不定就行了呢。

'use strict'
const path = require('path')
const webpack = require("webpack");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const cesiumSource = "node_modules/cesium/Source";
const cesiumWorkers = "../Build/Cesium/Workers";


function resolve(dir) {
  return path.join(__dirname, dir)
}



const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题

const port = process.env.port || process.env.npm_config_port || 80 // 端口

// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档
module.exports = {
  // 部署生产环境和开发环境下的URL。
  // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
  // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
  // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
  outputDir: 'dist',
  // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
  assetsDir: 'static',
  // 是否开启eslint保存检测,有效值:ture | false | 'error'
  lintOnSave: process.env.NODE_ENV === 'development',
  // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
  productionSourceMap: false,
  // webpack-dev-server 相关配置
  devServer: {
    host: '0.0.0.0',
    port: port,
    open: true,
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        target: `http://localhost:8080`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
        }
      }
    },
    disableHostCheck: true
  },
  configureWebpack: {
    name: name,
    resolve: {
      alias: {
        '@': resolve('src'),
        cesium: path.resolve(__dirname, cesiumSource)
      }
    },
    amd: {
      // cesium 2
      toUrlUndefined: true
    },
    module: {
      // cesium 3 不加这个配置会报require引入警告
      unknownContextCritical: false
    },plugins: [
      // cesium 4
      new webpack.DefinePlugin({
        // Define relative base path in cesium for loading assets
        CESIUM_BASE_URL: JSON.stringify("")
      }), // 对build生效,拷贝到dist目录下。如:dist/Assets
      new CopyWebpackPlugin([
        {
          from: path.join(cesiumSource, cesiumWorkers),
          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.ProvidePlugin({
      //   Cesium: ['cesium/Cesium'] // Cesium对象实例可在每个js中使用而无须import
      // })
    ]

  },
  chainWebpack(config) {
    config.plugins.delete('preload') // TODO: need test
    config.plugins.delete('prefetch') // TODO: need test

    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/assets/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/assets/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

    config
      .when(process.env.NODE_ENV !== 'development',
        config => {
          config
            .plugin('ScriptExtHtmlWebpackPlugin')
            .after('html')
            .use('script-ext-html-webpack-plugin', [{
            // `runtime` must same as runtimeChunk name. default is `runtime`
              inline: /runtime\..*\.js$/
            }])
            .end()
          config
            .optimization.splitChunks({
              chunks: 'all',
              cacheGroups: {
                libs: {
                  name: 'chunk-libs',
                  test: /[\\/]node_modules[\\/]/,
                  priority: 10,
                  chunks: 'initial' // only package third parties that are initially dependent
                },
                elementUI: {
                  name: 'chunk-elementUI', // split elementUI into a single package
                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
                },
                commons: {
                  name: 'chunk-commons',
                  test: resolve('src/components'), // can customize your rules
                  minChunks: 3, //  minimum common number
                  priority: 5,
                  reuseExistingChunk: true
                }
              }
            })
          config.optimization.runtimeChunk('single'),
          {
             from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
             to: './' //到根目录下
          }
        }
      )
  }
}

3,修改main.js

//引入Cesium样式
import 'cesium/Widgets/widgets.css' //样式
let Cesium = require('cesium/Cesium')

4,然后在使用地球的地方引用,这里修改的earth2.vue,在views目录下,需要更改route:

/router/index.js

import earth2 from '@/views/earth2'

export default new Router({
  routes: [
    {
      path: '/earth',
      name: 'earth',
      component: earth2
    }
  ]
})

Cesium调用的vue

<template>
  <div id="container" class="container">
  </div>
</template>
<script>
// 我们主要关注的就是这个import的部分,只要引入了Cesium,其他都好说
import {Viewer,UrlTemplateImageryProvider ,Cartesian3} from '@/../node_modules/cesium/Source/Cesium.js';

export default {
    name: "earth",
    mounted() {

      const viewer = new Viewer("container", {
        imageryProvider: new Cesium.UrlTemplateImageryProvider({
          // 下面是我的瓦片地址部署在本地,可以根据自己实际修改
          url: 'http://localhost:8080' + '/tms/satellite/{z}/{x}/{y}.jpg',
          fileExtension: "jpg"
        }),
        baseLayerPicker: false,
        navigationHelpButton: false,
        animation: false,
        shouldAnimate: false,
        timeline: false,
        creditsDisplay: false,
        // 注释时相当于使用默认地形,解开注释相当于使用全球地形
        // terrainProvider: Cesium.createWorldTerrain()

      });

      viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({
        url: 'http://localhost:8080' + '/tms/overlay/{z}/{x}/{y}.png',
        fileExtension: "png"
      }));

    }
  }




</script>


<style scoped>
  .container {
    width: 100%;
    height: 100vh;
  }
</style>

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Vue中引入离线Cesium,需要按照以下步骤进行操作: 1. 下载Cesium线包,可以从官网下载或者使用其他来源获取。将下载的文件解压到项目中的静态资源目录中,例如public目录下的cesium文件夹。 2. 安装cesium库,可以使用npm或者yarn进行安装: ``` npm install cesium --save 或 yarn add cesium ``` 3. 在Vue组件中引入Cesium,并在mounted生命周期钩子中初始化Cesium: ```vue <template> <div id="cesiumContainer"></div> </template> <script> import * as Cesium from 'cesium/Cesium' import 'cesium/Widgets/widgets.css' export default { name: 'CesiumViewer', mounted() { const viewer = new Cesium.Viewer('cesiumContainer', { imageryProvider: new Cesium.UrlTemplateImageryProvider({ url: 'cesium/Assets/Textures/NaturalEarthII/{z}/{x}/{reverseY}.jpg' }), baseLayerPicker: false, geocoder: false, homeButton: false, sceneModePicker: false, timeline: false, navigationHelpButton: false, animation: false, fullscreenButton: false, vrButton: false }) } } </script> <style scoped> #cesiumContainer { height: 100%; width: 100%; } </style> ``` 4. 在Vue组件中使用Cesium,例如添加一个模型: ```vue <template> <div id="cesiumContainer"></div> </template> <script> import * as Cesium from 'cesium/Cesium' import 'cesium/Widgets/widgets.css' export default { name: 'CesiumViewer', mounted() { const viewer = new Cesium.Viewer('cesiumContainer', { imageryProvider: new Cesium.UrlTemplateImageryProvider({ url: 'cesium/Assets/Textures/NaturalEarthII/{z}/{x}/{reverseY}.jpg' }), baseLayerPicker: false, geocoder: false, homeButton: false, sceneModePicker: false, timeline: false, navigationHelpButton: false, animation: false, fullscreenButton: false, vrButton: false }) const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame( Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0) ) const model = viewer.scene.primitives.add( Cesium.Model.fromGltf({ url: 'cesium/Assets/Models/CesiumAir/Cesium_Air.glb', modelMatrix: modelMatrix, scale: 200.0 }) ) viewer.zoomTo(model) } } </script> <style scoped> #cesiumContainer { height: 100%; width: 100%; } </style> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值