引自免费微信小程序:皆我百晓生
看起来你在尝试在React项目中引入Cesium,并且遇到了一些问题。根据你的描述和提供的错误信息,我看到你已经安装了Cesium并进行了基本的导入。但是,你仍然收到了"Cesium is not defined"的错误,这通常是因为模块加载出现了问题或者路径引用不正确。
为了确保Cesium能被正确地加载,你需要遵循以下步骤:
-
确保你已经正确安装了Cesium。在命令行中输入
npm install cesium,然后检查node_modules目录中是否有Cesium文件夹。 -
在React组件中导入Cesium时,注意大小写。Cesium模块名的首字母应该是大写的。这是正确的导入方式:
import * as Cesium from 'cesium';
或者如果你只想导入特定的部分,可以这样写:
import { Viewer, Cartesian3, Math, Terrain, createOsmBuildingsAsync } from 'cesium';
- 在你的React组件中添加一个包含Cesium Viewer元素的div,例如:
"cesiumContainer">div>
在你的HTML结构中,需要有一个id为cesiumContainer的元素,以便Cesium Viewer可以挂载在这个容器上。
- 使用
useEffect钩子来初始化Cesium Viewer。确保在渲染之前完成Cesium的初始化,以免在没有定义Cesium的情况下调用它。这里是修改后的initMap函数和useEffect示例:
import React, { useEffect } from 'react';
function App() {
useEffect(() => {
const initMap = async () => {
// 将viewer对象放在window环境下
Cesium.Ion.defaultAccessToken = 'YOUR_CESIUM_ION_ACCESS_TOKEN_HERE';
// 初始化 Cesium 场景
const viewer = new Cesium.Viewer('cesiumContainer', {
terrain: Cesium.Terrain.fromWorldTerrain(),
});
// Add Cesium OSM Buildings, a global 3D buildings layer.
const osmBuildingsTileset = await Cesium.createOsmBuildingsAsync();
viewer.scene.primitives.add(osmBuildingsTileset);
// 飞行相机至指定位置(可选)
// const position = new Cesium.Cartesian3.fromDegrees(-122.4194, 37.7749, 1000); // San Francisco coordinates
// viewer.camera.flyTo({ destination: position });
};
initMap();
}, []);
return (
<div className="App">
{/* ...其他React组件 */}
<div id="cesiumContainer">div>
div>
);
}
export default App;
确保替换YOUR_CESIUM_ION_ACCESS_TOKEN_HERE为你从Cesium官网获取的真实访问令牌。如果没有离子访问令牌,你可以暂时去掉这行代码,但可能无法加载地形和其他依赖Ion服务的功能。
- 如果你还是遇到问题,检查你的开发服务器是否正常运行。有时候,构建工具可能会导致源映射解析错误,但这不会影响Cesium的正常使用。你可以忽略这些警告,除非它们与你的实际问题有关。
按照上述步骤操作,你应该能在React应用中成功使用Cesium。如果还有问题,请随时告诉我。

