Cesium 简单使用

本文详细介绍了如何使用Cesium库在HTML页面中创建地图,添加图层,以及绑定鼠标左键事件,包括点击空白区域和实体的处理。还展示了如何清除事件和实体,以及自定义地图行为和定位功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖

cesium

基础变量

    // 外部服务基础url
    var baseUrl = 'http://localhost:8093';
    // cesiumlab切片地址
    var mapUrl = baseUrl + '/Earth/{z}/{x}/{y}.jpg';
    // cesiumlab切片地址
    var mapUrl1 = baseUrl + '/cesiumKlmy/{z}/{x}/{y}.png';
    // 项目中心位置
    var mapCenter = [85.03257700820414, 45.600000206741775];
    // 4326
    var simpleScheme = new Cesium.GeographicTilingScheme();

创建地图

   // 创建地图实例
    var viewer = new Cesium.Viewer("cesiumContainer", {
        sceneMode: Cesium.SceneMode.SCENE2D, // 默认二维
        animation: false, // 动画小组件
        baseLayerPicker: false, // 底图组件,选择三维数字地球的底图(imagery and terrain)。
        fullscreenButton: false, // 全屏组件
        vrButton: false, // VR模式
        geocoder: false, // 地理编码(搜索)组件
        homeButton: true, // 首页,点击之后将视图跳转到默认视角
        infoBox: false, // 信息框
        sceneModePicker: true, // 场景模式,切换2D、3D 和 Columbus View (CV) 模式。
        selectionIndicator: false, //是否显示选取指示器组件
        timeline: false, // 时间轴
        navigationHelpButton: false, // 帮助提示,如何操作数字地球。
        // 如果最初应该看到导航说明,则为true;如果直到用户明确单击该按钮,则该提示不显示,否则为false。
        navigationInstructionsInitiallyVisible: false,
        orderIndependentTranslucency: false, //去掉大气层黑圈
        imageryProvider: new Cesium.SingleTileImageryProvider({
            url: baseUrl + '/Cesium/R-C.jpg'
        }),
        contextOptions: {
            webgl: {
                alpha: true,
            }
        },
    });

    // 获取 事件拦截
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

    // 移除底图
    viewer.imageryLayers.removeAll();
    viewer.scene.globe.baseColor = Cesium.Color.fromCssColorString("#7f7f7f");
    viewer.scene.skyBox.show = false;
    viewer._cesiumWidget._creditContainer.style.display = "none"
    // 抗锯齿
    viewer.scene.fxaa = true
    viewer.scene.postProcessStages.fxaa.enabled = true

添加图层

    viewer.imageryLayers.addImageryProvider(
        new Cesium.UrlTemplateImageryProvider({
            url: mapUrl,
            fileExtension: 'jpg',
            maximumLevel: 0,
            tilingScheme: simpleScheme //设置4326
        })
    )
    viewer.imageryLayers.addImageryProvider(
        new Cesium.UrlTemplateImageryProvider({
            url: mapUrl1,
            fileExtension: 'png',
            maximumLevel: 21,
            tilingScheme: simpleScheme //设置4326
        })
    )

事件

绑定鼠标事件

    /**
    * 鼠标左键事件监听
    * @param myFunc普通回调,myFunc2点击实体回调 回调 
    */
    function mouseLeftClick(myFunc = null, myFunc2 = null) {
        var that = this
        let viewer = that.viewer
        handler.setInputAction(function (evt) {
            // 点击处的坐标
            let x_y = [evt.position.x, evt.position.y]
            console.log("x_y:", x_y)

            //将像素位置转为经纬度
            let earthPosition = viewer.camera.pickEllipsoid(evt.position, viewer.scene.globe.ellipsoid);
            let cartographic = Cesium.Cartographic.fromCartesian(earthPosition, viewer.scene.globe.ellipsoid, new Cesium.Cartographic());
            let lng = Cesium.Math.toDegrees(cartographic.longitude);
            let lat = Cesium.Math.toDegrees(cartographic.latitude);
            let height = cartographic.height;
            let lng_lat = [lng, lat];
            console.log("lng_lat:", lng_lat)

            //设置监听方法
            let scene = viewer.scene;
            // 实体选择获取
            let pick = scene.pick(evt.position);
            // 没点击到实体
            if (pick == undefined) {
                console.log("左键点击空白处");
            } else {
                console.log("左键点击实体处:", pick);
                myFunc2({ lng_lat, x_y, pick });
            }
            // 执行回调
            if (myFunc) {
                myFunc({ lng_lat, x_y, pick });
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
        return that;
    }

标点

    /* 事件绑定方法区---------*/
    function onAddPoint() {
        removeAllEvent()
        // 鼠标左键点击事件绑定
        mouseLeftClick(addPoint);
    }

    //点的描绘信息
    point_options = {
        show: true, //是否展示
        pixelSize: 15, //点的大小
        // heightReference:HeightReference.NONE,//相对高度
        color: Cesium.Color.RED, //颜色
        outlineColor: Cesium.Color.SKYBLUE, //边框颜色
        outlineWidth: 2, //边框宽度
        // scaleByDistance:new Cesium.NearFarScalar(100, 5, 10000, 15), //缩放距离设置
        // translucencyByDistance:new Cesium.NearFarScalar(100, 0.2, 10000, 0.8),//点的半透明设置
        // distanceDisplayCondition:new Cesium.DistanceDisplayCondition(1000, 10000),//点的显隐距离
        // disableDepthTestDistance:5000000,//禁用深度测试距离
    }
    
    // 添加点回调方法
    function addPoint(evt) {
        console.log("回调方法被调用了")
        let { lng_lat } = evt;
        viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(...lng_lat),
            point: point_options
        });
    }

点击实体

	/* 事件绑定方法区---------*/
    function onClickEntity() {
        removeAllEvent() 
        // 鼠标左键点击事件绑定
        mouseLeftClick(null,clickEntity);
    }

    // 点击实体的回调方法
    function clickEntity(evt) {
        console.log("回调方法被调用了")
        let { lng_lat, x_y, pick } = evt;
        console.log("实体信息:", pick)

    }

demo

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        @import url(http://localhost:8093/Cesium/Widgets/widgets.css);
    </style>
    <style>
        html,
        body,
        #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        .option {
            position: fixed;
            left: 10px;
            top: 10px;
        }

        .btn {
            /* width: 48px; */
            /* height: 48px; */
            background-color: rgba(115, 115, 115, 0.5);
            font-size: 16px;
            z-index: 10000;
            cursor: pointer;
        }

        .btn:hover {
            background-color: rgb(200, 200, 200);
            /* border: white 1px solid; */
            box-shadow: 0 0 1px 1px rgb(255, 255, 255);
        }
    </style>
    <title>地图演示</title>
    <script src="http://localhost:8093/Cesium/Cesium.js"></script>
</head>

<body>
    <div id="cesiumContainer">
    </div>
    <div class="option">
        <div class="btn" onclick="removeAllEvent()">清除鼠标左键事件</div> 
        <div class="btn" onclick="removeAllEntity()">清除所有实体</div> 
        <div class="btn" onclick="cancelLook()">取消视角锁定</div> 
        <div class="btn" onclick="onAddPoint()">左键事件:标点</div>
        <div class="btn" onclick="onClickEntity()">左键事件:点击实体</div>
    </div>
</body>
<script>
    // 外部服务基础url
    var baseUrl = 'http://localhost:8093';
    var mapUrl = baseUrl + '/Earth/{z}/{x}/{y}.jpg';
    // cesiumlab切片地址
    var mapUrl1 = baseUrl + '/cesiumKlmy/{z}/{x}/{y}.png';
    // 项目中心位置
    var mapCenter = [85.03257700820414, 45.600000206741775];
    // 4326
    var simpleScheme = new Cesium.GeographicTilingScheme();

    // 创建地图实例
    var viewer = new Cesium.Viewer("cesiumContainer", {
        sceneMode: Cesium.SceneMode.SCENE2D, // 默认二维
        animation: false, // 动画小组件
        baseLayerPicker: false, // 底图组件,选择三维数字地球的底图(imagery and terrain)。
        fullscreenButton: false, // 全屏组件
        vrButton: false, // VR模式
        geocoder: false, // 地理编码(搜索)组件
        homeButton: true, // 首页,点击之后将视图跳转到默认视角
        infoBox: false, // 信息框
        sceneModePicker: true, // 场景模式,切换2D、3D 和 Columbus View (CV) 模式。
        selectionIndicator: false, //是否显示选取指示器组件
        timeline: false, // 时间轴
        navigationHelpButton: false, // 帮助提示,如何操作数字地球。
        // 如果最初应该看到导航说明,则为true;如果直到用户明确单击该按钮,则该提示不显示,否则为false。
        navigationInstructionsInitiallyVisible: false,
        orderIndependentTranslucency: false, //去掉大气层黑圈
        imageryProvider: new Cesium.SingleTileImageryProvider({
            url: baseUrl + '/Cesium/R-C.jpg'
        }),
        contextOptions: {
            webgl: {
                alpha: true,
            }
        },
    });
    // 获取 事件拦截
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

    // 移除底图
    viewer.imageryLayers.removeAll();
    viewer.scene.globe.baseColor = Cesium.Color.fromCssColorString("#7f7f7f");
    viewer.scene.skyBox.show = false;
    viewer._cesiumWidget._creditContainer.style.display = "none"
    // 抗锯齿
    viewer.scene.fxaa = true
    viewer.scene.postProcessStages.fxaa.enabled = true

    viewer.imageryLayers.addImageryProvider(
        new Cesium.UrlTemplateImageryProvider({
            url: mapUrl,
            fileExtension: 'jpg',
            maximumLevel: 0,
            tilingScheme: simpleScheme //设置4326
        })
    )

    viewer.imageryLayers.addImageryProvider(
        new Cesium.UrlTemplateImageryProvider({
            url: mapUrl1,
            fileExtension: 'png',
            maximumLevel: 21,
            tilingScheme: simpleScheme //设置4326
        })
    )
    /* 事件绑定方法区-------------------------------------------------------*/
    function onAddPoint() {
        removeAllEvent()
        // 鼠标左键点击事件绑定
        mouseLeftClick(addPoint);
    }
    function onClickEntity() {
        removeAllEvent()
        // 鼠标左键点击事件绑定
        mouseLeftClick(null,clickEntity);
    }



    /**
    * 鼠标左键事件监听
    * @param myFunc普通回调,myFunc2点击实体回调 回调 
    */
    function mouseLeftClick(myFunc = null, myFunc2 = null) {
        var that = this
        let viewer = that.viewer
        handler.setInputAction(function (evt) {
            // 点击处的坐标
            let x_y = [evt.position.x, evt.position.y]
            console.log("x_y:", x_y)

            //将像素位置转为经纬度
            let earthPosition = viewer.camera.pickEllipsoid(evt.position, viewer.scene.globe.ellipsoid);
            let cartographic = Cesium.Cartographic.fromCartesian(earthPosition, viewer.scene.globe.ellipsoid, new Cesium.Cartographic());
            let lng = Cesium.Math.toDegrees(cartographic.longitude);
            let lat = Cesium.Math.toDegrees(cartographic.latitude);
            let height = cartographic.height;
            let lng_lat = [lng, lat];
            console.log("lng_lat:", lng_lat)

            //设置监听方法
            let scene = viewer.scene;
            // 实体选择获取
            let pick = scene.pick(evt.position);
            // 没点击到实体
            if (pick == undefined) {
                console.log("左键点击空白处");
            } else {
                console.log("左键点击实体处:", pick);
                if(myFunc2){
                    myFunc2({ lng_lat, x_y, pick });
                }
            }
            // 执行回调
            if (myFunc) {
                myFunc({ lng_lat, x_y, pick });
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
        return that;
    }

    //点的描绘信息
    point_options = {
        show: true, //是否展示
        pixelSize: 15, //点的大小
        // heightReference:HeightReference.NONE,//相对高度
        color: Cesium.Color.RED, //颜色
        outlineColor: Cesium.Color.SKYBLUE, //边框颜色
        outlineWidth: 2, //边框宽度
        // scaleByDistance:new Cesium.NearFarScalar(100, 5, 10000, 15), //缩放距离设置
        // translucencyByDistance:new Cesium.NearFarScalar(100, 0.2, 10000, 0.8),//点的半透明设置
        // distanceDisplayCondition:new Cesium.DistanceDisplayCondition(1000, 10000),//点的显隐距离
        // disableDepthTestDistance:5000000,//禁用深度测试距离
    }
    // 添加点回调方法
    function addPoint(evt) {
        console.log("回调方法被调用了")
        let { lng_lat } = evt;
        viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(...lng_lat),
            point: point_options
        });
    }

    // 点击实体的回调方法
    function clickEntity(evt) {
        console.log("回调方法被调用了")
        let { lng_lat, x_y, pick } = evt;
        console.log("实体信息:", pick)

    }

    // 清除鼠标左键事件
    function removeAllEvent() {
        console.log("清除鼠标左键事件")
        handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
    }
    // 清除所有实体
    function removeAllEntity(){
        console.log("清除所有实体")
        viewer.entities.removeAll();
    }

    //取消视角锁定
   function cancelLook() {
        viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
        viewer.trackedEntity = undefined
    }

    // 定位
    viewer.camera.flyTo({
        destination: Cesium.Cartesian3.fromDegrees(mapCenter[0], mapCenter[1], 1000), // 设置位置
        orientation: {
            heading: Cesium.Math.toRadians(0), // 方向
            pitch: Cesium.Math.toRadians(-90.0),// 倾斜角度
            roll: 0
        },
        duration: 0, // 设置飞行持续时间,默认会根据距离来计算
        pitchAdjustHeight: -90, // 如果摄像机飞越高于该值,则调整俯仰俯仰的俯仰角度,并将地球保持在视口中。
        maximumHeight: 10000, // 相机最大飞行高度
    });
    // 修改默认home的位置
    viewer.homeButton.viewModel.command.beforeExecute.addEventListener(function (e) {
        e.cancel = true;
        //你要飞的位置	
        viewer.camera.flyTo({
            destination: Cesium.Cartesian3.fromDegrees(mapCenter[0], mapCenter[1], 1000.0)
        });
    });
</script>

</html>
<think>嗯,用户想了解Cesium的安装与使用方法。首先,我需要回忆一下Cesium的相关知识。Cesium是一个用于创建3D地球和地图的JavaScript库,常用于地理数据可视化。安装方法通常有几种,比如直接下载、使用npm安装,或者通过现代构建工具如Webpack或Vite集成。 用户提供的引用中有提到Cesium中文教程、项目目录结构、vite-plugin-cesium插件等信息。特别是引用[2]和[3]提到了项目地址和Vite插件,可能用户对使用现代前端工具比较感兴趣。引用[4]展示了如何初始化Viewer,这也是使用Cesium的关键步骤。 首先,我应该分步骤介绍安装方法。传统方式可能包括CDN引入和本地文件引入,这对于初学者来说简单。然后进阶用法,比如npm安装,适合项目集成。接着,结合引用中的vite-plugin-cesium,可以推荐使用Vite来快速搭建项目,这样用户能体验更现代的构建流程。 安装步骤需要详细说明,比如创建项目、安装依赖、配置插件等。同时,代码示例很重要,比如初始化Viewer的代码,这样用户可以直接复制粘贴测试。另外,要确保LaTeX格式正确,虽然这里可能数学公式不多,但如果有变量或代码块,需要正确应用格式。 用户可能遇到的问题包括构建工具的配置,比如Webpack或Vite中的特定设置,这时候引用提到的插件可以简化流程。此外,注意事项如静态资源处理、Cesium版本兼容性也需要提及,避免用户踩坑。 最后,生成的相关问题需要围绕安装和使用展开,比如环境配置、项目结构、初始化常见错误、与Webpack/Vite的区别、数据添加方法以及构建部署步骤。这些问题能帮助用户深入理解后续可能遇到的挑战。</think>### Cesium安装与使用指南 #### 一、环境准备 Cesium是基于WebGL的JavaScript库,建议使用现代浏览器(Chrome/Firefox/Edge)和Node.js环境。推荐Node.js版本≥14.0.0,可通过以下命令验证: ```bash node -v npm -v ``` #### 二、安装方法 1. **传统方式(CDN引入)** ```html <script src="https://cesium.com/downloads/cesiumjs/releases/1.96/Build/Cesium/Cesium.js"></script> <link rel="stylesheet" href="https://cesium.com/downloads/cesiumjs/releases/1.96/Build/Cesium/Widgets/widgets.css"> ``` 2. **本地文件引入** 从[官方仓库](https://gitcode.com/gh_mirrors/cesium)下载Release包,解压后引入: ```html <script src="/path/to/Cesium/Cesium.js"></script> ``` 3. **npm安装(推荐)** ```bash npm install cesium ``` 配合构建工具使用: ```javascript import * as Cesium from 'cesium'; import 'cesium/Build/Cesium/Widgets/widgets.css'; ``` #### 三、快速启动(Vite项目) 使用[vite-plugin-cesium](https://gitcode.com/gh_mirrors/vite-plugin-cesium)简化配置: 1. 创建项目 ```bash npm create vite@latest cesium-demo -- --template vanilla cd cesium-demo npm install ``` 2. 安装插件 ```bash npm install vite-plugin-cesium --save-dev ``` 3. 配置vite.config.js ```javascript import { defineConfig } from 'vite' import cesium from 'vite-plugin-cesium' export default defineConfig({ plugins: [cesium()] }) ``` #### 四、基础使用示例 ```html <div id="cesiumContainer" style="width: 100%; height: 100vh;"></div> <script type="module"> const viewer = new Cesium.Viewer('cesiumContainer', { terrainProvider: Cesium.createWorldTerrain(), animation: false, timeline: false }); // 添加3D模型示例 const entity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(116.39, 39.9), model: { uri: './models/CesiumAir.glb', minimumPixelSize: 128 } }); viewer.flyTo(entity); </script> ``` #### 五、注意事项 1. 静态资源需放在public目录或通过服务器加载 2. 开发环境建议使用`npm run dev`启动本地服务 3. 生产部署时执行`npm run build`生成dist目录 4. Cesium默认需要Web服务器环境,不能直接通过file://协议访问 #### 六、目录结构说明 ``` cesium-project/ ├── node_modules/ ├── public/ ├── src/ │ └── main.js ├── index.html ├── package.json └── vite.config.js ``` [^1]: Cesium中文教程建议通过构建工具管理依赖关系 [^2]: 官方仓库包含完整的示例代码和文档资源 [^3]: vite-plugin-cesium可自动处理Cesium的构建配置 [^4]: Viewer组件是Cesium的核心容器组件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值