地球初始化
let viewer = new Cesium.Viewer( 'cesiumContainer', {
animation : false,//是否创建动画小器件,左下角仪表
baseLayerPicker : false,//是否显示图层选择器
fullscreenButton : false,//是否显示全屏按钮
geocoder : false,//是否显示geocoder小器件,右上角查询按钮
homeButton : false,//是否显示Home按钮
infoBox : false,//是否显示信息框
sceneModePicker : false,//是否显示3D/2D选择器
selectionIndicator : false,//是否显示选取指示器组件
timeline : false,//是否显示时间轴
navigationHelpButton : false,//是否显示右上角的帮助按钮
scene3DOnly : true,//如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
clock : new Cesium.Clock(),//用于控制当前时间的时钟对象
selectedImageryProviderViewModel : undefined,//当前图像图层的显示模型,仅baseLayerPicker设为true有意义
imageryProviderViewModels : Cesium.createDefaultImageryProviderViewModels(),//可供BaseLayerPicker选择的图像图层ProviderViewModel数组
selectedTerrainProviderViewModel : undefined,//当前地形图层的显示模型,仅baseLayerPicker设为true有意义
terrainProviderViewModels : Cesium.createDefaultTerrainProviderViewModels(),//可供BaseLayerPicker选择的地形图层ProviderViewModel数组
imageryProvider : new Cesium.OpenStreetMapImageryProvider( {
credit :'',
url : '//192.168.0.89:5539/planet-satellite/'
} ),//图像图层提供者,仅baseLayerPicker设为false有意义
terrainProvider : new Cesium.EllipsoidTerrainProvider(),//地形图层提供者,仅baseLayerPicker设为false有意义
skyBox : new Cesium.SkyBox({
sources : {
positiveX : 'Cesium-1.7.1/Skybox/px.jpg',
negativeX : 'Cesium-1.7.1/Skybox/mx.jpg',
positiveY : 'Cesium-1.7.1/Skybox/py.jpg',
negativeY : 'Cesium-1.7.1/Skybox/my.jpg',
positiveZ : 'Cesium-1.7.1/Skybox/pz.jpg',
negativeZ : 'Cesium-1.7.1/Skybox/mz.jpg'
}
}),//用于渲染星空的SkyBox对象
fullscreenElement : document.body,//全屏时渲染的HTML元素,
useDefaultRenderLoop : true,//如果需要控制渲染循环,则设为true
targetFrameRate : undefined,//使用默认render loop时的帧率
showRenderLoopErrors : false,//如果设为true,将在一个HTML面板中显示错误信息
automaticallyTrackDataSourceClocks : true,//自动追踪最近添加的数据源的时钟设置
contextOptions : undefined,//传递给Scene对象的上下文参数(scene.options)
sceneMode : Cesium.SceneMode.SCENE3D,//初始场景模式
mapProjection : new Cesium.WebMercatorProjection(),//地图投影体系
dataSources : new Cesium.DataSourceCollection()
//需要进行可视化的数据源的集合
} );
隐藏底部文字信息
.cesium-viewer-bottom {
display: none;
}
去掉地球光圈
const viewer = new Cesium.Viewer('cesiumContainer', {
// ...
skyAtmosphere: false,
});
聚焦框和信息框的隐藏
默认情况下,如果左键双击 cesium
地图上的实体内容,camera
视角会自动聚焦过去,并显示自带的聚焦框以及实体的信息框,如下
默认不显示聚焦框和信息框
const viewer = new Cesium.Viewer('cesiumContainer', {
// ...
selectionIndicator: false, // 隐藏聚焦框
infoBox: false, // 隐藏信息框
});
取消默认的左键双击实体效果,便于自定义其他交互
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
视角转换
viewer.scene.camera.flyTo({
destination: new Cesium.Cartesian3.fromDegrees(106.49673, 29.61736, 1500), // 经纬度,高度
orientation: {
heading: 0,
pitch: -0.52458664812464143,
roll: 2.0174972803488345e-11
},
duration: 2,
complete: () => {
// 飞行结束后执行逻辑
}
});
geojson的加载使用
const jsonUrl = '...'; // 你的 geojson 文件路径,可以是本地相对路径
const mapJSON = Cesium.GeoJsonDataSource.load(jsonUrl, {
// 对 geojson 文件的初始配置,可在 https://cesium.com/docs/cesiumjs-ref-doc/GeoJsonDataSource.html 查看详情
});
viewer.dataSources.add(mapJSON); // 将其加载到地图上去
mapJSON.then(entities => {
// entities 是该 geojson 内部所有实体的数组,可对实体进行属性变更的操作
entities.forEach(entity => {
entity.show = false; // 隐藏该实体
});
});
针对高精度倾斜摄影加载及显示效果优化
倾斜摄影数据以 3dtile 的形式加载出来,通常情况下,只需要有 url 就足够了。以下参数是由于倾斜摄影数据总数据太大,清晰度过高,从而调节参数进行性能优化。这不是一个通用的解决方案,但可以以此为参考。
const tileSetPromise = new Cesium.Cesium3DTileset({
url: '...', // 你的倾斜摄影服务发布地址
skipLevelOfDetail: true,
baseScreenSpaceError: 1024,
maximumScreenSpaceError: 256, // 数值加大,能让最终成像变模糊
skipScreenSpaceErrorFactor: 16,
skipLevels: 1,
immediatelyLoadDesiredLevelOfDetail: false,
loadSiblings: true, // 如果为true则不会在已加载完概况房屋后,自动从中心开始超清化房屋
cullWithChildrenBounds: true,
cullRequestsWhileMoving: true,
cullRequestsWhileMovingMultiplier: 10, // 值越小能够更快的剔除
preloadWhenHidden: true,
preferLeaves: true,
maximumMemoryUsage: 128, // 内存分配变小有利于倾斜摄影数据回收,提升性能体验
progressiveResolutionHeightFraction: 0.5, // 数值偏于0能够让初始加载变得模糊
dynamicScreenSpaceErrorDensity: 0.1, // 数值加大,能让周边加载变快
dynamicScreenSpaceErrorFactor: 1, // 不知道起了什么作用没,反正放着吧先
dynamicScreenSpaceError: true // 根据测试,有了这个后,会在真正的全屏加载完之后才清晰化房屋
});
tileSetPromise.readyPromise.then(tileSet => {
this.scene.primitives.add(tileSet); // 将倾斜摄影实体加载到地图上
this.changeHeight(tileSet, 310); // 将此 tileSet 提高 310 米
});
// 可通过此函数,来修改 tileSet 的高度
function changeHeight(tileSet, height) {
height = Number(height);
if (isNaN(height)) { return; }
const cartographic = Cesium.Cartographic.fromCartesian(tileSet.boundingSphere.center);
const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, height);
const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
tileSet.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
}
限制camera高度的上下限
viewer.scene.screenSpaceCameraController.maximumZoomDistance = 65000; // 相机高度的最大值设定为 65000 米
viewer.scene.screenSpaceCameraController.minimumZoomDistance = 1000; // 相机高度的最小值设定为 1000 米
事件绑定
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(movement => {
// movement.position 是一个 Cartesian2 对象,可以通过它拿到所点击的屏幕坐标
}, Cesium.ScreenSpaceEventType.LEFT_CLICK); // 监听左键点击
通过Cartesian2获得经纬度的方式
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(movement => {
const cartesian = this.scene.globe.pick(this.camera.getPickRay(movement.position), this.scene); // 获取空间坐标
const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
const lon = Cesium.Math.toDegrees(cartographic.longitude); // 经度
const lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
}, Cesium.ScreenSpaceEventType.LEFT_CLICK); // 监听左键点击
地图二三维转化
// 地图转化为三维立体状态
viewer.scene.morphTo3D(0);
// 地图转化为二维平面状态
viewer.scene.morphTo2D(0);