cesium 地图效果

// cesium 地图效果整合
/**
 * 在Cesium中更换地图
 * @param {Viewer} viewer - Cesium的Viewer实例
 * @param {String} type - 地图类型,可选值为 'baidu'、'guge'、'tengxun'、'tianditu'、'gaode'
 * @param {Object} options - 针对不同地图类型的配置选项
 */
function replacementMap(viewer, type, options) {
    if (type == 'baidu') {
        viewer.imageryLayers.removeAll();
        viewer.imageryLayers.add(
            new Cesium.ImageryLayer(new AmapImageryProvider(options))
        );
    } else if (type == 'guge') {
        viewer.imageryLayers.removeAll();
        viewer.imageryLayers.add(
            new Cesium.ImageryLayer(new GoogleImageryProvider(options))
        );
    } else if (type == 'tengxun') {
        viewer.imageryLayers.removeAll();
        viewer.imageryLayers.add(
            new Cesium.ImageryLayer(new TencentImageryProvider(options))
        );
    } else if (type == 'tianditu') {
        viewer.imageryLayers.removeAll();
        viewer.imageryLayers.add(
            new Cesium.ImageryLayer(new TdtImageryProvider(options))
        );
    } else if (type == 'gaode') {
        viewer.imageryLayers.removeAll();
        viewer.imageryLayers.add(
            new Cesium.ImageryLayer(new AmapImageryProvider(options))
        );
    }
}

/**
 * 在Cesium中加载离线地图
 * @param {Viewer} viewer - Cesium的Viewer实例
 * @param {String} url - 离线地图的URL,可以是本地文件路径或远程URL
 */
function offlineMap(viewer, url) {
    viewer.imageryLayers.removeAll();
    viewer.imageryLayers.addImageryProvider(
        new Cesium.UrlTemplateImageryProvider({
            url: url,
        })
    );
}

/**
 * 创建简单的 Cesium 地图
 * @param {Object} that - 上下文对象,通常是指调用该函数的对象
 * @param {String} mapName - 地图容器的名称或ID
 */
function simpleMap(that, mapName) {
    Cesium.Ion.defaultAccessToken =
        "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlYTQ2ZjdjNS1jM2E0LTQ1M2EtOWM0My1mODMzNzY3YjYzY2YiLCJpZCI6MjkzMjcsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1OTE5NDIzNjB9.RzKlVTVDTQ9r7cqCo-PDydgUh8Frgw0Erul_BVxiS9c";
    that.viewer = new Cesium.Viewer(mapName, {
        shouldAnimate: true,
        animation: false, // 是否显示动画控件
        baseLayerPicker: false, // 是否显示图层选择控件
        vrButton: false, // 是否显示VR控件
        geocoder: false, // 是否显示地名查找控件
        timeline: false, // 是否显示时间线控件
        sceneModePicker: false, // 是否显示投影方式控件
        navigationHelpButton: false, // 是否显示帮助信息控件
        navigationInstructionsInitiallyVisible: false, // 帮助按钮,初始化的时候是否展开
        infoBox: false, // 是否显示点击要素之后显示的信息
        fullscreenButton: false, // 是否显示全屏按钮
        selectionIndicator: true, // 是否显示选中指示框
        homeButton: false, // 是否显示返回主视角控件
        scene3DOnly: false, // 如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源})
    });
    that.viewer._cesiumWidget._creditContainer.style.display = "none";
}

// cesium 3D/2D切换
/**
 * @description: cesium 3D/2D切换
 * @param {Viewer} viewer - Cesium的Viewer实例
 */
function TwoD(viewer) {
    viewer.scene.morphTo2D(0);
}
function ThereD(viewer) {
    var scene = viewer.scene;
    scene.morphTo3D(0);
}

// cesium 地球自转方法
/**
 * @description: cesium 地球自转方法
 * @param {any} viewer - Cesium的Viewer实例
 */
function earthRotation(viewer) {
    viewer.clock.multiplier = 100;//背景转速值越大越快
    viewer.clock.shouldAnimate = true;
    let previousTime = viewer.clock.currentTime.secondsOfDay;

    function onTickCallback() {
        var spinRate = 1;
        var currentTime = viewer.clock.currentTime.secondsOfDay;
        var delta = (currentTime - previousTime) / 5000;// 5000是地球转速,值越小转越快
        previousTime = currentTime;
        viewer.scene.camera.rotate(Cesium.Cartesian3.UNIT_Z, -spinRate * delta);
    }

    //监听点击事件(不然点击到Titus上他不停止旋转)
    var handlerEarthRotation = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    handlerEarthRotation.setInputAction(function (click) {
        viewer.clock.shouldAnimate = false;
        viewer.clock.onTick.removeEventListener(onTickCallback);
        handlerEarthRotation.destroy();
    }, Cesium.ScreenSpaceEventType.LEFT_DOWN);

    if (obj.rotation == true) {
        viewer.clock.onTick.addEventListener(onTickCallback);
    } else {
        viewer.clock.shouldAnimate = false;
        viewer.clock.onTick.removeEventListener(onTickCallback);
    }
}

/**
 * @description: cesium 背景修改成其它颜色
 * @param {any} viewer - Cesium的Viewer实例
 */
function Skybox(viewer) {
    viewer.scene.skyBox.show = false;
    // cesium 背景颜色修改完成
    viewer.scene.backgroundColor = Cesium.Color.GREEN;
}

/**
 * @description: 背景修改成天空盒(根据时间不同天空盒背景不同)
 * @param {any} viewer - Cesium的Viewer实例
 */
function sky(viewer) {
    //大气
    viewer.scene.skyAtmosphere.show = false;
    viewer.scene.globe.enableLighting = false; // 关闭灯光

    // 获取当前时间并判断是属于哪个时间段
    const now = new Date();
    const hour = now.getHours();
    if (hour >= 4 && hour < 8) {
        // 亮度设置
        var stages = viewer.scene.postProcessStages;
        viewer.scene.brightness = viewer.scene.brightness || stages.add(Cesium.PostProcessStageLibrary.createBrightnessStage());
        viewer.scene.brightness.enabled = true;
        viewer.scene.brightness.uniforms.brightness = Number(0.8);

        viewer.scene.skyBox = new Cesium.SkyBox({
            sources: {
                positiveX: '/images/qingchen/px.png',
                negativeX: '/images/qingchen/nx.png',
                positiveY: '/images/qingchen/ny.png',
                negativeY: '/images/qingchen/py.png',
                positiveZ: '/images/qingchen/pz.png',
                negativeZ: '/images/qingchen/nz.png',
            }
        })
    } else if (hour >= 8 && hour < 17) {
        // 亮度设置
        var stages = viewer.scene.postProcessStages;
        viewer.scene.brightness = viewer.scene.brightness || stages.add(Cesium.PostProcessStageLibrary.createBrightnessStage());
        viewer.scene.brightness.enabled = true;
        viewer.scene.brightness.uniforms.brightness = Number(1.2);

        viewer.scene.skyBox = new Cesium.SkyBox({
            sources: {
                positiveX: '/images/zhengwu/px.png',
                negativeX: '/images/zhengwu/nx.png',
                positiveY: '/images/zhengwu/ny.png',
                negativeY: '/images/zhengwu/py.png',
                negativeZ: '/images/zhengwu/nz.png',
                positiveZ: '/images/zhengwu/pz.png',
            }
        })
    } else if (hour >= 17 && hour < 19) {
        // 亮度设置
        var stages = viewer.scene.postProcessStages;
        viewer.scene.brightness = viewer.scene.brightness || stages.add(Cesium.PostProcessStageLibrary.createBrightnessStage());
        viewer.scene.brightness.enabled = true;
        viewer.scene.brightness.uniforms.brightness = Number(1);

        viewer.scene.skyBox = new Cesium.SkyBox({
            sources: {
                positiveX: '/images/huanghun/px.png',
                negativeX: '/images/huanghun/nx.png',
                positiveY: '/images/huanghun/ny.png',
                negativeY: '/images/huanghun/py.png',
                negativeZ: '/images/huanghun/nz.png',
                positiveZ: '/images/huanghun/pz.png',
            }
        })
    } else if (hour >= 19 && hour < 25) {
        // cesium 隐藏太阳
        viewer.scene.globe.enableLighting = false;
        viewer.shadows = false;
        viewer.scene.sun.show = false;
        // 亮度设置
        var stages = viewer.scene.postProcessStages;
        viewer.scene.brightness = viewer.scene.brightness || stages.add(Cesium.PostProcessStageLibrary.createBrightnessStage());
        viewer.scene.brightness.enabled = true;
        viewer.scene.brightness.uniforms.brightness = Number(0.4);

        viewer.scene.skyBox = new Cesium.SkyBox({
            sources: {
                positiveX: '/images/heiye/px.png',
                negativeX: '/images/heiye/nx.png',
                positiveY: '/images/heiye/ny.png',
                negativeY: '/images/heiye/py.png',
                negativeZ: '/images/heiye/nz.png',
                positiveZ: '/images/heiye/pz.png',
            }
        })
    } else if (hour >= 1 && hour < 4) {
        // cesium 隐藏太阳
        viewer.scene.globe.enableLighting = false;
        viewer.shadows = false;
        viewer.scene.sun.show = false;
        // 亮度设置
        var stages = viewer.scene.postProcessStages;
        viewer.scene.brightness = viewer.scene.brightness || stages.add(Cesium.PostProcessStageLibrary.createBrightnessStage());
        viewer.scene.brightness.enabled = true;
        viewer.scene.brightness.uniforms.brightness = Number(0.4);

        viewer.scene.skyBox = new Cesium.SkyBox({
            sources: {
                positiveX: '/images/heiye/px.png',
                negativeX: '/images/heiye/nx.png',
                positiveY: '/images/heiye/ny.png',
                negativeY: '/images/heiye/py.png',
                negativeZ: '/images/heiye/nz.png',
                positiveZ: '/images/heiye/pz.png',
            }
        })
    }
}

/**
 * @description: 使用3D地形
 * @param {any} viewer - Cesium的Viewer实例
 */
function thereDmap(viewer) {
    // 调用在线地形图使用恒歌科技在线地形图
    const terrainProvider = new Cesium.CesiumTerrainProvider({
        url: "http://www.freexgis.com/web-data/terrain",
    });
    viewer.terrainProvider = terrainProvider;
    let inter = setInterval(() => {
        // 改变时间设置光照效果
        let date = new Date().getTime()
        let utc = Cesium.JulianDate.fromDate(new Date(date))
        //北京时间
        viewer.clockViewModel.currentTime = Cesium.JulianDate.addHours(utc, 0, new Cesium.JulianDate())
    }, 100)
}

/**
 * @description: 3D地形使用方法
 * @param {any} viewer - Cesium的Viewer实例
 */
function thereMap(viewer) {
    var terrainProvider = new Cesium.ArcGISTiledElevationTerrainProvider({
        url:
            "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer",
        token:
            "KED1aF_I4UzXOHy3BnhwyBHU4l5oY6rO6walkmHoYqGp4XyIWUd5YZUC1ZrLAzvV40pR6gBXQayh0eFA8m6vPg..",
    });
    viewer.terrainProvider = terrainProvider;
    viewer.scene.terrainExaggeration = 3;
}

/**
 * @description: 添加大气层(静止的大气层)
 * @param {any} viewer - Cesium的Viewer实例
 */
function atmosphere(viewer) {
    const entities = viewer.entities;
    const image = 'https://openlayers.vip/examples/resources/earth_cloud.png';
    const imageMaterial = new Cesium.ImageMaterialProperty({
        image: image
    });
    const entity = entities.add({
        rectangle: {
            coordinates: Cesium.Rectangle.fromDegrees(-180.0, -90.0, 180.0, 90.0),
            material: imageMaterial,
        },
    });

    kaiqi()
    function kaiqi() {
        entity.rectangle.height = undefined;
        entity.rectangle.extrudedHeight = undefined;
        entity.rectangle.material = imageMaterial;
    }

}

// cesium 创建太阳
/**
 * @description: 创建太阳
 * @param {any} viewer - Cesium的Viewer实例
 */
function makeSun(viewer) {
    viewer.scene.sun.show = true;
    viewer.scene.sun.glowFactor = 10; //太阳变大
}

/**
 * @description: 暗影系高德地图(适合运用于黑夜形的智慧城市地图)
 * @param {any} viewer - Cesium的Viewer实例
 */
function anyingMap(viewer) {
    viewer.imageryLayers.removeAll(); // 移除所有现有的图像图层
    // cesium 底图更换成暗系高德底图
    var imageryProvider = new Cesium.ArcGisMapServerImageryProvider({
        url: 'http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer'
    });
    var imageryLayer = viewer.imageryLayers.addImageryProvider(imageryProvider);
}

export {
    replacementMap,
    offlineMap,
    simpleMap,
    TwoD,
    ThereD,
    earthRotation,
    Skybox,
    sky,
    thereDmap,
    thereMap,
    atmosphere,
    makeSun,
    anyingMap
};

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值