You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
GCSGUI/src/utils/map/sceneViewer.ts

114 lines
4.7 KiB
TypeScript

/*
* @Author: cbwu 504-wuchengbo@htsdfp.com
* @Date: 2024-03-13 09:32:21
* @LastEditors: cbwu
* @LastEditTime: 2024-04-10 14:02:37
* @Description:
*/
// Viewer初始化
import {
Viewer,
TileMapServiceImageryProvider,
ScreenSpaceEventType,
ImageryLayer,
RequestScheduler,
SceneMode,
Rectangle,
buildModuleUrl,
} from 'cesium'
import CesiumNavigation from 'cesium-navigation-es6'
//离线地球底图
const earth_native = TileMapServiceImageryProvider.fromUrl(
// 'node_modules/cesium/Build/CesiumUnminified/Assets/Textures/NaturalEarthII',
buildModuleUrl('Assets/Textures/NaturalEarthII'),
)
/**
* Viewer
* @param container :idHTML
* @returns :viewer
*/
function initViewer(container: string | Element): Viewer {
//未联网状态加载默认本地底图,保证地球有底图显示
const viewer = new Viewer(container as HTMLElement, {
infoBox: false, //是否显示点击要素之后显示的信息
homeButton: false, //是否显示Home按钮
navigationHelpButton: false, //是否显示帮助信息控件
timeline: false, //是否显示时间线控件
animation: false, //是否显示动画控件
sceneModePicker: true, //是否显示投影方式控件
sceneMode: SceneMode.SCENE3D, //设置场景模式3D球体
// terrain: Cesium.Terrain.fromWorldTerrain(),
baseLayerPicker: false, //是否显示图层选择控件
requestRenderMode: true, //启用请求渲染模式
scene3DOnly: false, //每个几何实例将只能以3D渲染以节省GPU内存
fullscreenButton: false, //右下角 全屏控件
orderIndependentTranslucency: false,
contextOptions: { webgl: { alpha: true } },
maximumRenderTimeChange: Infinity, // 无操作时自动渲染帧率设为数字会消耗性能Infinity为无操作不渲染
// mapProjection: new Cesium.WebMercatorProjection(),
baseLayer: ImageryLayer.fromProviderAsync(earth_native, {}),
})
//去除cesium logo隐藏版本信息
const creditContainer = viewer.cesiumWidget.creditContainer as HTMLDivElement
creditContainer.style.display = 'none'
// 开启深度检测
viewer.scene.globe.depthTestAgainstTerrain = false
// 水雾特效
viewer.scene.globe.showGroundAtmosphere = true
// 设置更高的缩放惯性以使缩放操作更平滑
viewer.scene.screenSpaceCameraController.inertiaZoom = 0.9
// 限制相机缩放
viewer.scene.screenSpaceCameraController.minimumZoomDistance = 200 //相机的高度的最小值
viewer.scene.screenSpaceCameraController.maximumZoomDistance = 10350000 //相机高度的最大值
// 设置设备像素比,可能会影响渲染性能
// viewer.resolutionScale = window.devicePixelRatio
// 视图重绘后确保清晰度
viewer.scene.preRender.addEventListener(function () {
if (viewer.resolutionScale !== window.devicePixelRatio) {
viewer.resolutionScale = window.devicePixelRatio
}
})
// 去掉entity的点击事件双击、单击
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
ScreenSpaceEventType.LEFT_DOUBLE_CLICK,
)
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
ScreenSpaceEventType.LEFT_CLICK,
)
return viewer
}
/**
*
* @param viewer :Viewer
*/
function perfViewer(viewer: Viewer) {
// 抗锯齿
// 是否支持图像渲染像素化处理
// if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
// viewer.resolutionScale = window.devicePixelRatio
// }
viewer.scene.postProcessStages.fxaa.enabled = true
// 关闭太阳,月亮,天空盒,雾等相关特效
viewer.scene.moon.show = false
viewer.scene.fog.enabled = false
viewer.scene.sun.show = false
viewer.scene.skyBox.show = false
// 优化加载WMTS图层速度
RequestScheduler.maximumRequestsPerServer = 18 // 设置cesium请求调度器的最大并发数量
RequestScheduler.throttleRequests = false //关闭请求调度器的请求节流
}
function showNavigator(viewer: Viewer) {
const options: any = {}
// 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和 Cesium.Rectangle
options.defaultResetView = Rectangle.fromDegrees(80, 22, 130, 50)
options.enableCompass = true //罗盘组件 true启用false禁用
options.enableCompassOuterRing = true //罗盘外环组件 true启用false禁用
options.enableZoomControls = true //缩放组件 true启用false禁用
options.enableDistanceLegend = true //比例尺组件 true启用false禁用
new CesiumNavigation(viewer, options)
}
export { initViewer, perfViewer, showNavigator }