首页 > 其他分享 >Cesium之Webpack配置指南

Cesium之Webpack配置指南

时间:2024-02-22 13:33:18浏览次数:25  
标签:指南 const URL webpack js CESIUM Webpack Cesium

源码:https://gitee.com/chenxiangzhi/cesium_webpack

1. 获取Token

注册 Cesium 账号,点击 Access Tokens Tab 并复制默认 token

2. 安装依赖包

npm init
npm install cesium
npm install --save-dev webpack webpack-cli
npm install --save-dev style-loader css-loader  # 处理css
npm install --save-dev html-webpack-plugin      # 生成html
npm install --save-dev copy-webpack-plugin      # 复制静态资源插件 (* node14之前的,请安装 copy-webpack-plugin@9)
npm install --save-dev webpack-dev-server       # 开发环境[可选] (* node14之前的,请安装 webpack-dev-server@4 )
npm install --save-dev @babel/core @babel/preset-env babel-loader  # 兼容js[可选](* node14之前的,请安装 babel-loader@8)

3. 文件结构

node_modules
package-lock.json
package.json
Public
   index.html        # 模板
src
   index.js          # 入口
webpack.config.js    # webpack配置

其中模板如下:

<!DOCTYPE html>
<html>
   <head>
      <title>Map</title>
      <style>
         #root {
            width: 1080px;
            height: 960px;
         }
      </style>
   </head>
   <body>
      <div id="root"></div>
   </body>
</html>

4. Webpack 配置

webpack.config.js

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');

// 从这里复制Cesium静态资源  (Workers、ThirdParty、Assets、Widgets)
const CESIUM_SOURCE_PATH = 'node_modules/cesium/Build/Cesium';
// 打包后Cesium静态资源放置的位置
const CESIUM_BASE_URL = 'public/Cesium/BaseSource';

module.exports = {
   mode: 'production',
   entry: './src/index.js', // 入口
   output: {
      filename: 'js/[name].[hash].js',
      path: path.resolve(__dirname, 'dist'),
      clean: true
   },

   // 开发环境(可选)
   devServer: {
      static: './dist',
   },
   // 关闭性能提示(可选)
   performance: {
      hints: false,
   },

   plugins: [
      new HtmlWebpackPlugin({
         title: 'output',
         template: './Public/index.html',
      }),

      // 复制静态资源
      new CopyWebpackPlugin({
         patterns: [
            {
               from: path.join(CESIUM_SOURCE_PATH, 'Workers'),
               to: `${CESIUM_BASE_URL}/Workers`,
            },
            {
               from: path.join(CESIUM_SOURCE_PATH, 'ThirdParty'),
               to: `${CESIUM_BASE_URL}/ThirdParty`,
            },
            {
               from: path.join(CESIUM_SOURCE_PATH, 'Assets'),
               to: `${CESIUM_BASE_URL}/Assets`,
            },
            {
               from: path.join(CESIUM_SOURCE_PATH, 'Widgets'),
               to: `${CESIUM_BASE_URL}/Widgets`,
            }
         ],
      }),

      // 定义全局变量
      new webpack.DefinePlugin({
         CESIUM_BASE_URL: JSON.stringify(CESIUM_BASE_URL), //  CesiumJS 静态资源位置
      }),
   ],

   // 处理 js 、 css 和 图片资源
   module: {
      rules: [
          // js可选
          {
            test: /\.m?js$/,
            exclude: /node_modules/,
            use: {
               loader: 'babel-loader',
               options: {
                  presets: ['@babel/preset-env'],
               },
            },
         },
         {
            test: /\.css$/i,
            use: ['style-loader', 'css-loader'],
         },
         {
            test: /\.(png|svg|jpg|jpeg|gif)$/i,
            type: 'asset/resource',
         },
      ],
   },
};

package.json 中定义脚本

"scripts": {
   "build": "webpack",              /** 生产环境 */
   /** 如果还要配置开发环境 */
   "start": "webpack serve --open" 
},

5. 初始化 Cesium

// src/index.js (官方例子)

import {
   Cartesian3,
   createOsmBuildingsAsync,
   Ion,
   Math as CesiumMath,
   Terrain,
   Viewer,
} from 'cesium';
import 'cesium/Build/Cesium/Widgets/widgets.css';

// ** 填入Token
Ion.defaultAccessToken = '你的token';

// 指定某个容器ID,初始化 Cesium Viewer
const viewer = new Viewer('root', {
   terrain: Terrain.fromWorldTerrain(),
});

// 定义摄像头的位置与角度 官方给的位置是旧金山
viewer.camera.flyTo({
   destination: Cartesian3.fromDegrees(-122.4175, 37.655, 400),
   orientation: {
      heading: CesiumMath.toRadians(0.0),
      pitch: CesiumMath.toRadians(-15.0),
   },
});

// 加入建筑图集
const buildingTileset = await createOsmBuildingsAsync(); // 创建建筑物图集
viewer.scene.primitives.add(buildingTileset); // primitives:所有物体的数组

6. 运行

  1. npm run build后,把生产文件夹dist的内容放在 Apache 或者 Nginx 服务器上,进行访问;或者右键dist文件夹下index.html,点击open with live server(VsCode 插件)。
  2. npm run start,开发环境实时查看

加载本地地图瓦片

首先需要一个地图瓦片资源。下面例子中用的是官方TMS例子的资源,已经将瓦片资源放在了Public\Cesium\TmsSource中。

修改webpack.config.js

// 定义一个变量:打包后地图瓦片放置的位置
const CESIUM_MAP_SOURCE_URL = 'public/Cesium/MapSource';

// ...

plugins:[
     new CopyWebpackPlugin({
         patterns: [
            // ...
            // 复制地图瓦片到指定位置
            {
               from: path.join('Public', 'Cesium', 'TmsSource'), 
               to: CESIUM_MAP_SOURCE_URL,
            },
         ],
      }),
     // 增加一个全局变量
    new webpack.DefinePlugin({
     // ...
     CESIUM_MAP_SOURCE_URL: JSON.stringify(CESIUM_MAP_SOURCE_URL)
    }),
]

将入口的index.js的代码换成:

import * as Cesium from 'cesium';
import 'cesium/Build/Cesium/Widgets/widgets.css';

const viewer = new Cesium.Viewer('root');
const provider = await Cesium.TileMapServiceImageryProvider.fromUrl(
   CESIUM_MAP_SOURCE_URL,  // 上面配置过的地址
   {
      fileExtension: 'png',
      maximumLevel: 4,
      rectangle: new Cesium.Rectangle(
         Cesium.Math.toRadians(-120.0),
         Cesium.Math.toRadians(20.0),
         Cesium.Math.toRadians(-60.0),
         Cesium.Math.toRadians(40.0)
      ),
   }
);
const imageryLayer = new Cesium.ImageryLayer(provider);
viewer.imageryLayers.add(imageryLayer);

重新运行

npm run start

打包的一些优化

瓦片数据有时很大,一般会放在其他服务器上。如果依旧放在本地,那么可以手动将资源复制到对应打包路径下,跳过打包的复制操作,让编译过程更快:

  1. 把地图瓦片资源复制到CESIUM_MAP_SOURCE_URL中,也就是dist/public/Cesium/MapSource中。
  2. 注释掉pluginsCopyWebpackPlugin关于地图瓦片复制的操作。
    // webpack.config.js
    
    plugins: [
       new CopyWebpackPlugin({
         patterns: [
             // ...
         ],
       }),
    ],
    
  3. 输出时保留public文件夹,并把其他的重新清理替换掉
    // webpack.config.js
    
    output: {
       // ...
       clean: {
          keep: /public/, // 保留 'public' 下的静态资源
       },
    }
    

Cesium的必要静态资源也很少变动,也可以用以上方式操作。即手动把node_modules/cesium/Build/Cesium的四个文件夹复制到打包目录的public/Cesium/BaseSource中,并注释掉CopyWebpackPlugin中关于复制的操作

标签:指南,const,URL,webpack,js,CESIUM,Webpack,Cesium
From: https://www.cnblogs.com/sanhuamao/p/18027139

相关文章

  • Win10电脑桌面便签设置指南,让你的工作更高效
    在我的工作中,随手记录各类工作事项是非常有必要的。不论是紧急会议的要点、项目的进度安排,还是临时灵感的捕捉,每一项都需要及时记录,以免遗忘。这时候,如果有一款便签软件能够一直悬浮在电脑桌面上显示,无疑会大大提高我的工作效率。为了实现这个目的,我花费了几天时间,寻找和尝试了多......
  • 洛谷题单指南-递推与递归-P1498 南蛮图腾
    原题链接:https://www.luogu.com.cn/problem/P1498题意解读:观察样例,可以发现,当n=1时,得到最基础的图案:/\/__\当n=2时,将基础图案向下复制两个,并排,然后将之前的图案移到居中的位置/\/__\/\/\/__\/__\当n=3时,再将n=2时的图案向下复制两个,并排,然后将之前的图......
  • Docker Exec 命令详解与实践指南
    简介DockerExec是Docker中一个非常有用的命令,它允许您在正在运行的容器内部执行命令。这对于调试、管理和与容器进行交互非常有帮助。在本篇文章中,我们将深入探讨DockerExec命令的使用方法,并提供一些实用的示例,旨在帮助初学者更好地理解和运用这一功能。什么是DockerE......
  • 洛谷题单指南-递推与递归-P1228 地毯填补问题
    原题链接:https://www.luogu.com.cn/problem/P1228题意解读:用4种毯子铺满2^k*2^k的区域,留出一个公主位置,输出所有毯子拐角的坐标以及哪种毯子,看起来有点无从下手,可以从k=1,k=2,k=3入手去依次考虑,找到规律,用分治法解决。解题思路:1、当k=1时,即2*2的区域,对于任意一个位置是公主,都......
  • 开发者选择与实施低代码平台的终极指南
    低代码技术的全面兴起,给开发者提供了更多样的开发方式,但挑战也随之而来。本文旨在提供一个全面的指南,帮助开发者有效选择和实施低代码或无代码开发平台。为什么选择低代码平台?不是所有的业务开发都需要低代码平台。如果你的项目满足以下几个典型特征你可以考虑:业务探索中,需求......
  • Linux 网络编程从入门到进阶 学习指南
    前言大家好,我是小康。在上一篇文章中,我们探讨了Linux系统编程的诸多基础构件,包括文件操作、进程管理和线程同步等,接下来,我们将视野扩展到网络世界。在这个新篇章里,我们要让应用跳出单机限制,学会在网络上跨机器交流信息。接下来,我们要深入套接字(sockets)和TCP/IP协议,揭示如何......
  • Linux 系统编程从入门到进阶 学习指南
    引言大家好,我是小康,今天我们来学习一下Linux系统编程相关的知识。Linux系统编程是连接高级语言和硬件的桥梁,它对深入理解计算机系统至关重要。无论你是打算构建高性能服务器还是开发嵌入式设备,掌握Linux系统编程是C和C++开发者的基本技能。本文旨在为初学者提供一个清......
  • 洛谷题单指南-递推与递归-P1010 [NOIP1998 普及组] 幂次方
    原题链接:https://www.luogu.com.cn/problem/P1010题意解读:输出一个正整数的2的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。解题思路:先看样例,给定整数137,要拆解成2的幂次方之和,先考虑i使得刚好137>=2^i时,i取7,因此2......
  • cesium加载地形,倾斜摄影,wmts切片服务
    一、wmts切片渲染样例constmap=newHGZH3D.Map('map')//可加载ArcGISMapServer服务的网址,如下为部分服务路径:// 影像图层-https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer// 物理地图-https://services.arcgisonline.com/arcgis/......
  • 性能测试指南
    01性能测试技术指南本文从技术角度制定性能测试实施过程中关键的技术规范。这些规范可以帮助用户更好地从技术上来规避系统上线后的风险、评估线上系统的真实能力、根据业务模型摸底线上能力以提前应对。适用范围适用于所有需要性能测试的项目。对性能测试实施过程中非常重要......