The WebGL Globe

WebGL地球仪是一个用于地理数据可视化的开放平台。它支持经纬度数据展示、颜色渐变等功能,并可通过鼠标滚轮缩放。用户可以复制代码、添加自己的数据来创建个性化地球仪。


http://www.chromeexperiments.com/globe


The WebGL Globe

The WebGL Globe is an open platform for geographic data visualization. We encourage you to copy the code, add your own data, and create your own.

If you do create your own globe, please share it with us. We will post our favorite links below.

Features:

The WebGL Globe

<think>这个错误通常发生在使用ES6模块导入时,被导入的模块没有提供默认导出(export default),而导入方却试图以默认方式导入。 在Cesium中,有些模块可能不是以默认导出方式导出的,而是命名导出。因此,我们需要调整导入方式。 具体到错误信息:`mersenne-twister`模块没有提供默认导出。查看该模块的源码,它可能是以命名导出的方式导出。 解决方案有两种: 1. 修改导入方式:从默认导入改为命名导入(如果该模块有命名导出) 2. 如果该模块确实只支持CommonJS方式,我们可以通过动态导入或者修改打包配置来解决。 但是,由于我们使用的是Vite,它同时支持ES模块和CommonJS模块。对于没有默认导出的CommonJS模块,我们可以这样导入: import * as MersenneTwister from 'mersenne-twister' 或者,如果我们知道具体的导出名称,也可以解构导入: import { MersenneTwister } from 'mersenne-twister' 然而,错误发生在Cesium内部依赖的`mersenne-twister`模块。我们可能需要调整Cesium的构建方式,或者配置Vite来正确处理这个模块。 实际上,Cesium官方文档中提到了在Vite中使用时需要注意的问题。我们可以通过配置Vite的`optimizeDeps`选项来排除Cesium,同时使用Cesium的官方Vite插件。 但是,我们目前没有使用官方插件,而是手动复制资源。因此,我们需要确保Cesium的模块被正确加载。 另一种解决方案是使用Cesium官方的Vite插件:`vite-plugin-cesium`,它可以解决大部分集成问题。 步骤: 1. 安装`vite-plugin-cesium`: npm install vite-plugin-cesium -D 2. 修改`vite.config.js`,使用该插件: ```javascript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import cesium from 'vite-plugin-cesium' // 导入插件 export default defineConfig({ plugins: [ vue(), cesium() // 使用cesium插件 ], // ...其他配置 }) ``` 3. 移除之前手动复制资源的`vite-plugin-static-copy`插件和配置。 这个插件会自动处理Cesium的依赖,包括静态资源复制和模块加载问题。 如果不想使用插件,我们也可以尝试手动修复: 在`vite.config.js`中添加如下配置: ```javascript export default defineConfig({ // ...其他配置 optimizeDeps: { exclude: ['cesium'], include: [ // 强制将mersenne-twister作为CommonJS模块处理 'mersenne-twister' ] } }) ``` 同时,在代码中修改导入方式(如果知道具体导出): ```javascript // 在需要使用的地方 import MersenneTwister from 'mersenne-twister' // 改为 import * as MersenneTwister from 'mersenne-twister' ``` 但是,由于错误发生在Cesium内部,我们无法直接修改它的导入代码。因此,使用官方插件是更推荐的方式。 让我们采用官方插件的方式来解决这个问题。 修改后的`vite.config.js`:</think>### 解决 `Uncaught SyntaxError` 错误 这个错误通常发生在模块导入时,当尝试导入一个没有默认导出(`export default`)的模块时出现。以下是完整的解决方案: #### 1. 修复 `mersenne-twister` 导入问题 **修改 `vite.config.js` 配置**: ```javascript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { viteStaticCopy } from 'vite-plugin-static-copy' export default defineConfig({ plugins: [ vue(), viteStaticCopy({ targets: [ { src: 'node_modules/cesium/Build/Cesium/Workers', dest: '' }, { src: 'node_modules/cesium/Build/Cesium/ThirdParty', dest: '' }, { src: 'node_modules/cesium/Build/Cesium/Assets', dest: '' }, { src: 'node_modules/cesium/Build/Cesium/Widgets', dest: '' } ] }) ], server: { proxy: { '/local-3dtiles': { target: 'http://localhost:5173', changeOrigin: true, rewrite: path => path.replace(/^\/local-3dtiles/, '/3dtiles') } } }, optimizeDeps: { exclude: ['cesium'], // 添加以下配置解决 mersenne-twister 问题 include: [ 'mersenne-twister' ] }, build: { commonjsOptions: { // 确保正确处理 CommonJS 模块 transformMixedEsModules: true, include: [/node_modules/] } } }) ``` #### 2. 修改 `src/utils/cesiumHelper.js` 中的导入方式 ```javascript // 修改前 import * as Cesium from 'cesium' // 修改后 - 使用命名导入替代默认导入 import { Viewer, createWorldTerrain, ArcGisMapServerImageryProvider, Cesium3DTileset, defined, Math as CesiumMath, Cartesian3, Cartographic, ScreenSpaceEventType } from 'cesium'; ``` #### 3. 更新 `src/utils/cesiumHelper.js` 中的实现 ```javascript // 初始化Cesium Viewer export const initViewer = (containerId) => { return new Promise((resolve) => { const viewer = new Viewer(containerId, { animation: false, baseLayerPicker: false, fullscreenButton: true, geocoder: true, homeButton: true, infoBox: true, sceneModePicker: true, selectionIndicator: true, timeline: false, navigationHelpButton: false, scene3DOnly: true, terrainProvider: createWorldTerrain(), skyBox: false, skyAtmosphere: false, imageryProvider: new ArcGisMapServerImageryProvider({ url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer' }) }); // 解决部分显卡兼容性问题 viewer.scene.context.webgl2 = false; // 添加地形照明 viewer.scene.globe.enableLighting = true; // 添加后期处理效果 viewer.scene.postProcessStages.fxaa.enabled = true; // 设置相机位置 viewer.camera.setView({ destination: Cartesian3.fromDegrees(116.39, 39.9, 1500), orientation: { heading: CesiumMath.toRadians(0), pitch: CesiumMath.toRadians(-30), roll: 0.0 } }); // 添加完成回调 viewer.scene.initialized.addEventListener(() => { console.log('Cesium场景初始化完成'); resolve(viewer); }); }); }; // 加载3DTileset export const load3DTileset = (viewer, url, options = {}) => { return new Promise((resolve, reject) => { const tileset = new Cesium3DTileset({ url, maximumScreenSpaceError: 8, skipLevelOfDetail: true, preferLeaves: true, ...options }); tileset.readyPromise .then(() => { viewer.scene.primitives.add(tileset); // 添加点击事件 viewer.screenSpaceEventHandler.setInputAction((click) => { const pickedFeature = viewer.scene.pick(click.position); if (defined(pickedFeature) && pickedFeature.primitive === tileset) { const properties = pickedFeature.getPropertyNames().reduce((obj, name) => { obj[name] = pickedFeature.getProperty(name); return obj; }, {}); viewer.selectedFeature = pickedFeature; viewer.infoBox.viewModel.bodyText = JSON.stringify(properties, null, 2); viewer.infoBox.viewModel.show = true; } }, ScreenSpaceEventType.LEFT_CLICK); // 添加性能监控 tileset.tileLoad.addEventListener(tile => { const stats = { tilesLoaded: tileset.tilesLoaded, totalTiles: tileset.tilesLoaded + tileset.tilesProcessing, memoryUsage: tileset.memoryUsage }; // 更新图层状态(需要外部实现) console.log('瓦片加载统计:', stats); }); resolve(tileset); }) .catch(error => { console.error(`加载3DTiles失败: ${url}`, error); reject(error); }); }); }; ``` ### 错误原因分析 1. **模块导出问题**: - `mersenne-twister` 是一个 CommonJS 模块,没有 ES6 默认导出(`export default`) - Vite 默认期望 ES6 模块,导致导入失败 2. **Cesium 导入方式**: - 使用 `import * as Cesium` 可能导致部分模块解析问题 - 改为命名导入可以更精确控制导入内容 3. **构建配置**: - Vite 默认配置对 CommonJS 模块支持有限 - 需要显式配置 `optimizeDeps` 和 `build.commonjsOptions` ### 完整解决方案步骤 1. **更新 `vite.config.js`**: ```bash npm install @rollup/plugin-commonjs --save-dev ``` 2. **修改 `vite.config.js`**: ```javascript import commonjs from '@rollup/plugin-commonjs'; export default defineConfig({ // ...其他配置 plugins: [ vue(), commonjs(), // 添加 CommonJS 插件 // ...其他插件 ], optimizeDeps: { include: ['mersenne-twister', 'cesium'] } }); ``` 3. **更新 `package.json` 依赖**: ```json { "devDependencies": { "@rollup/plugin-commonjs": "^25.0.4", // ...其他依赖 } } ``` 4. **清理缓存并重新安装**: ```bash rm -rf node_modules/.vite npm install npm run dev ``` ### 替代解决方案:使用 Cesium 官方 Vite 插件 如果上述方案仍存在问题,可以使用官方插件简化配置: 1. **安装插件**: ```bash npm install vite-plugin-cesium --save-dev ``` 2. **修改 `vite.config.js`**: ```javascript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import cesium from 'vite-plugin-cesium' export default defineConfig({ plugins: [ vue(), cesium() // 添加 Cesium 插件 ], server: { proxy: { '/local-3dtiles': { target: 'http://localhost:5173', changeOrigin: true, rewrite: path => path.replace(/^\/local-3dtiles/, '/3dtiles') } } } }) ``` ### 验证解决方案 1. **检查控制台错误**: - 确保 `mersenne-twister` 错误消失 - 确认 Cesium 组件正确加载 2. **测试功能**: ```javascript // 在 src/main.js 中添加测试代码 console.log('Cesium 版本:', Cesium.VERSION); ``` 3. **性能监控**: - 查看网络面板中 Cesium 资源加载情况 - 确保 `Workers` 和 `ThirdParty` 资源正确加载 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值