-
npm install cesium
-
在终端安装cesium
-
在vite.config.ts中引入
-
1.import cesium from 'vite-plugin-cesium'
-
2.在组件中:plugins: [
cesium(),
vue(),
-
cesium搜索框改为中文输入地址经纬度
-
切换地图图层控件自定义图层天地图或其他图层也可以
// 切换地图
function map () {
// 影像标注
const customImageryProviderbz = new Cesium.WebMapTileServiceImageryProvider({
url: 'http://t{s}.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&tk=' + token,
subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域
layer: 'tdtBasicLayer',
style: 'default',
format: 'image/jpeg',
tileMatrixSetID: 'GoogleMapsCompatible',
})
// const tdtImageryProvider = new Cesium.ProviderViewModel({
// name: '卫星路网图层',
// iconUrl: 'https://fh.dji.com/assets/img/satellite@3x.0026b4db.png',
// tooltip: '卫星路网图层',
// creationFunction: function () {
// return new Cesium.WebMapTileServiceImageryProvider({
// url: 'http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
// subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域
// layer: 'tdtBasicLayer',
// style: 'default',
// format: 'image/jpeg',
// tileMatrixSetID: 'GoogleMapsCompatible',
// })
// }
// })
// providerViewModels.push(tdtImageryProvider)
const customImageryProviderwx = new Cesium.ProviderViewModel({
name: '卫星图层',
iconUrl: 'https://fh.dji.com/assets/img/satellite@3x.0026b4db.png',
tooltip: '卫星图层',
creationFunction: function () {
return new Cesium.WebMapTileServiceImageryProvider({
url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域
layer: 'tdtBasicLayer',
style: 'default',
format: 'image/jpeg',
tileMatrixSetID: 'GoogleMapsCompatible',
})
}
})
providerViewModels.push(customImageryProviderwx)
const tdtModel = new Cesium.ProviderViewModel({
name: '标准图层',
iconUrl: 'https://fh.dji.com/assets/img/streets@3x.d07c7065.png',
tooltip: '标准图层',
creationFunction: function () {
return new Cesium.WebMapTileServiceImageryProvider({
url: 'http://t0.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域
layer: 'tdtBasicLayer',
style: 'default',
format: 'image/jpeg',
tileMatrixSetID: 'GoogleMapsCompatible',
})
}
})
providerViewModels.push(tdtModel)
}
-
-
引入地图与鹰眼视图与地形图
-
-
<script lang="ts" setup> import * as Cesium from 'cesium' import type { NavigationOptions } from 'cesium-navigation-es6' import CesiumNavigation from 'cesium-navigation-es6' import 'cesium/Build/Cesium/Widgets/widgets.css' import type { NavigationOptions } from 'cesium-navigation-es6' (window as any).Cesium = Cesium let viewer: any let viewer1: any onMounted(() => { map() // 初始化地图 creatviewer() }) // 初始化地图 async function creatviewer () { // cesium 初始化 viewer = new Cesium.Viewer('cesiumContainer', { geocoder: new OpenStreetMapNominatimGeocoder(), // geocoder: true, // 搜索框 homeButton: true, // home键返回初始位置 baseLayerPicker: true, // 地图选择器 sceneModePicker: true, // 选择视角的模式(球体、平铺、斜视平铺) animation: false, // 时间 fullscreenButton: false, // 全屏按钮 timeline: false, // 底部时间线 navigationHelpButton: false, // 导航提示 imageryProviderViewModels: providerViewModels, terrainProviderViewModels: providerTerrainViewModels, }) // 创建鹰眼地图 viewer1 = new Cesium.Viewer('eye', { geocoder: false, homeButton: false, sceneModePicker: false, baseLayerPicker: false, navigationHelpButton: false, animation: false, timeline: false, fullscreenButton: false, vrButton: false, }) viewer1.cesiumWidget.creditContainer.style.display = 'none' const control = viewer1.scene.screenSpaceCameraController control.enableRotate = false control.enableTranslate = false control.enableZoom = false control.enableTilt = false control.enableLook = false const syncViewer = function () { viewer1.camera.flyTo({ destination: viewer.camera.position, orientation: { heading: viewer.camera.heading, pitch: viewer.camera.pitch, roll: viewer.camera.roll }, duration: 0.0 }) } viewer.scene.preRender.addEventListener(syncViewer) const imageryProvider = new Cesium.WebMapTileServiceImageryProvider({ url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token, subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域 layer: 'tdtBasicLayer', style: 'default', format: 'image/jpeg', tileMatrixSetID: 'GoogleMapsCompatible', }) viewer1.imageryLayers.addImageryProvider(imageryProvider) viewer.geocoder.viewModel.searchText = '' viewer.geocoder.viewModel.search() // 深度检测 viewer.scene.globe.depthTestAgainstTerrain = true // 去除版权信息 viewer.cesiumWidget.creditContainer.style.display = 'none' // 2.5D 哥伦布模式 viewer.scene.morphToColumbusView(0) viewer.sceneModePicker.viewModel.duration = 0.0// 去掉二三维切换动画效果 // viewer.imageryLayers.removeAll() // viewer.imageryLayers.get(0).show = false// 删除底图 // 3D图层 const terrainProvider = await Cesium.CesiumTerrainProvider.fromUrl( Cesium.IonResource.fromAssetId(1), { requestWaterMask: true, requestVertexNormals: true, } ) viewer.terrainProvider = terrainProvider viewer1.terrainProvider = terrainProvider // 添加影像标注 const tdtImageryProvider = new Cesium.WebMapTileServiceImageryProvider({ url: 'http://t{s}.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&tk=' + token, subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域 layer: 'tdtImgBasicLayer', style: 'default', format: 'image/jpeg', tileMatrixSetID: 'GoogleMapsCompatible', }) viewer.imageryLayers.addImageryProvider(tdtImageryProvider, 1) viewer1.imageryLayers.addImageryProvider(tdtImageryProvider, 1) //本地导入 // viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({ // url: '/public/cia_w/{z}/{x}/{y}.png', // minimumLevel: 0, // maximumLevel: 18, // })) // selectmaps(viewer)// 切换地图图层 navigationHelp(viewer)// 插件 loading(viewer)// 加载进度 initaddress(viewer)// 初始位置 handleMouse(viewer)// 实时经纬度 handleMouses(viewer) inithome(viewer)// home键位置 restrictZoomRange(viewer)// 限制缩放范围 getpointpage(viewer)// 获取项目下标注点 // removeposition(viewer)// 键盘移动视图 tilesetload() } </script>
指北针插件与其他方法
-
// home初始位置 function inithome (viewer: any) { const homeButton = viewer.homeButton.viewModel // 设置HomeButton的初始位置和朝向 homeButton.command.beforeExecute.addEventListener(function (commandInfo: any) { // 设置地图的初始位置(济南市的经纬度和高度) viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(117.1201, 36.6512, 140000), // 高度设置为100000米(可根据需要调整) orientation: { heading: Cesium.Math.toRadians(0), // 设置初始朝向的角度(0度表示正北) pitch: Cesium.Math.toRadians(-90), // 设置初始俯仰角度(-90度表示正下方) roll: 0 // 设置初始横滚角度 } }) // 停止默认的HomeButton行为 commandInfo.cancel = true }) } // 监听鼠标移动事件点击经纬度高度 function handleMouses (viewer: any) { const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas) handler.setInputAction(function (movement: any) { const pick = movement.position const cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(pick), viewer.scene) const ellipsoid = viewer.scene.globe.ellipsoid const cartographic = ellipsoid.cartesianToCartographic(cartesian) const latitude = Cesium.Math.toDegrees(cartographic.latitude)// 纬度 const longitude = Cesium.Math.toDegrees(cartographic.longitude)// 经度 const HAE = cartographic.height const positions = [Cesium.Cartographic.fromDegrees(longitude, latitude)] Cesium.sampleTerrain(viewer.terrainProvider, 11, positions).then(function (updatedPositions) { const height = updatedPositions[0].height console.log('经度:' + longitude + '\n纬度:' + latitude + '\n椭圆体高度:' + HAE + '\n海拔高度:' + height) renderInformationOnPages(longitude, latitude, height, HAE) }) }, Cesium.ScreenSpaceEventType.LEFT_CLICK) // LEFT_CLICK // MOUSE_MOVE } // 实时经纬度 function handleMouse (viewer: any) { const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas) handler.setInputAction(function (movement) { const pick = movement.endPosition const cartesian = viewer.scene.pickPosition(pick) if (cartesian) { const cartographic = Cesium.Cartographic.fromCartesian(cartesian) const latitude = Cesium.Math.toDegrees(cartographic.latitude) const longitude = Cesium.Math.toDegrees(cartographic.longitude) renderInformationOnPage(longitude, latitude) } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE) } // 进入地图定位初始位置 function initaddress (viewer: any) { viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(117.1201, 36.6512, 140000), // 经度、纬度、高度 orientation: { heading: Cesium.Math.toRadians(0), // 方向角度(0度表示正北) pitch: Cesium.Math.toRadians(-90), // 俯仰角度(-90度表示正下方) roll: 0 // 横滚角度 } }) } // 加载进度 function loading (viewer: any) { let loadedTiles = 0 const increasingTiles = 0 // 用于递增加载瓦片数 let maxLoadedTiles = 0 // 监听Cesium加载事件 viewer.scene.globe.tileLoadProgressEvent.addEventListener(function (tilesLoaded: any) { // 更新已加载和总瓦片数量 loadedTiles = tilesLoaded maxLoadedTiles = Math.max(maxLoadedTiles, tilesLoaded) // console.log(loadedTiles, maxLoadedTiles, '111111111111111111111') // 计算加载百分比 const percentage = 100 - ((loadedTiles / maxLoadedTiles) * 100) // 在页面上显示加载百分比 updateLoadingPercentage(percentage) if (loadedTiles === 0) { loadedTiles = 0 maxLoadedTiles = 0 } }) } // 指北针比例尺等控件 function navigationHelp (viewer: any) { options.enableCompass = true // 指北针 options.enableZoomControls = true // 放大缩放控件 options.enableDistanceLegend = true// 比例尺 options.enableCompassOuterRing = true// 指北针外环 // options.resetTooltip = '重置视图' options.zoomInTooltip = '放大' options.zoomOutTooltip = '缩小' function createCesiumNavigation (viewer: any, options: any) { return new CesiumNavigation(viewer, options) } createCesiumNavigation(viewer, options) } // 渲染页面经纬度 function renderInformationOnPage (longitude: any, latitude: any) { const infoElement = document.getElementById('address') if (infoElement) { // infoElement.innerHTML = `lon: ${longitude}\nlat:${latitude}\nASL:${height}\nHAE${HAE} ` infoElement.innerHTML = `lon: ${longitude}\nlat:${latitude} ` } } // 点击出现经纬度海拔高度椭圆体高度 function renderInformationOnPages (longitude: any, latitude: any, height: any, HAE: any) { const infoElement = document.getElementById('address') if (infoElement) { infoElement.innerHTML = `lon: ${longitude}\nlat:${latitude}\nASL:${height}\nHAE${HAE} ` // infoElement.innerHTML = `lon: ${longitude}\nlat:${latitude} ` } } // 更新页面上的加载百分比 function updateLoadingPercentage (percentage: any) { const loadingPercentageElement = document.getElementById('loadingPercentage') if (loadingPercentageElement) { loadingPercentageElement.textContent = `加载进度: ${percentage.toFixed(2)}%` } }
鼠标控制键盘移动
-
// 键盘移动视图 function removeposition (viewer: any) { const scene = viewer.scene const canvas = viewer.canvas canvas.setAttribute('tabindex', '0') // needed to put focus on the canvas canvas.onclick = function () { canvas.focus() } const ellipsoid = scene.globe.ellipsoid // disable the default event handlers scene.screenSpaceCameraController.enableRotate = false scene.screenSpaceCameraController.enableTranslate = false scene.screenSpaceCameraController.enableZoom = false scene.screenSpaceCameraController.enableTilt = false scene.screenSpaceCameraController.enableLook = false let startMousePosition let mousePosition const flags = { looking: false, moveForward: false, moveBackward: false, moveUp: false, moveDown: false, moveLeft: false, moveRight: false, } const handler = new Cesium.ScreenSpaceEventHandler(canvas) handler.setInputAction(function (movement) { flags.looking = true mousePosition = startMousePosition = Cesium.Cartesian3.clone( movement.position ) }, Cesium.ScreenSpaceEventType.LEFT_DOWN) handler.setInputAction(function (movement) { mousePosition = movement.endPosition }, Cesium.ScreenSpaceEventType.MOUSE_MOVE) handler.setInputAction(function (position) { flags.looking = false }, Cesium.ScreenSpaceEventType.LEFT_UP) function getFlagForKeyCode (keyCode) { switch (keyCode) { case 'W'.charCodeAt(0): return 'moveForward' case 'S'.charCodeAt(0): return 'moveBackward' case 'Q'.charCodeAt(0): return 'moveUp' case 'E'.charCodeAt(0): return 'moveDown' case 'D'.charCodeAt(0): return 'moveRight' case 'A'.charCodeAt(0): return 'moveLeft' default: return undefined } } document.addEventListener( 'keydown', function (e) { const flagName = getFlagForKeyCode(e.keyCode) if (typeof flagName !== 'undefined') { flags[flagName] = true } }, false ) document.addEventListener( 'keyup', function (e) { const flagName = getFlagForKeyCode(e.keyCode) if (typeof flagName !== 'undefined') { flags[flagName] = false } }, false ) viewer.clock.onTick.addEventListener(function (clock) { const camera = viewer.camera if (flags.looking) { const width = canvas.clientWidth const height = canvas.clientHeight // Coordinate (0.0, 0.0) will be where the mouse was clicked. const x = (mousePosition.x - startMousePosition.x) / width const y = -(mousePosition.y - startMousePosition.y) / height const lookFactor = 0.05 camera.lookRight(x * lookFactor) camera.lookUp(y * lookFactor) } // Change movement speed based on the distance of the camera to the surface of the ellipsoid. const cameraHeight = ellipsoid.cartesianToCartographic( camera.position ).height const moveRate = cameraHeight / 100.0 if (flags.moveForward) { camera.moveForward(moveRate) } if (flags.moveBackward) { camera.moveBackward(moveRate) } if (flags.moveUp) { camera.moveUp(moveRate) } if (flags.moveDown) { camera.moveDown(moveRate) } if (flags.moveLeft) { camera.moveLeft(moveRate) } if (flags.moveRight) { camera.moveRight(moveRate) } }) }
中文搜索框
-
// 中文搜索 function OpenStreetMapNominatimGeocoder () { } OpenStreetMapNominatimGeocoder.prototype.geocode = function (input: any) { const endpoint = 'https://nominatim.openstreetmap.org/search' const resource = new Cesium.Resource({ url: endpoint, queryParameters: { format: 'json', q: input, }, }) return resource.fetchJson().then(function (results: any) { let bboxDegrees return results.map(function (resultObject: any) { bboxDegrees = resultObject.boundingbox return { displayName: resultObject.display_name, destination: Cesium.Rectangle.fromDegrees( bboxDegrees[2], bboxDegrees[0], bboxDegrees[3], bboxDegrees[1] ), } }) }) }
切换地图图层叠加天地图
-
// 切换地图 function map () { // 影像标注 const customImageryProviderbz = new Cesium.WebMapTileServiceImageryProvider({ url: 'http://t{s}.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&tk=' + token, subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域 layer: 'tdtBasicLayer', style: 'default', format: 'image/jpeg', tileMatrixSetID: 'GoogleMapsCompatible', }) // const tdtImageryProvider = new Cesium.ProviderViewModel({ // name: '卫星路网图层', // iconUrl: 'https://fh.dji.com/assets/img/satellite@3x.0026b4db.png', // tooltip: '卫星路网图层', // creationFunction: function () { // return new Cesium.WebMapTileServiceImageryProvider({ // url: 'http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token, // subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域 // layer: 'tdtBasicLayer', // style: 'default', // format: 'image/jpeg', // tileMatrixSetID: 'GoogleMapsCompatible', // }) // } // }) // providerViewModels.push(tdtImageryProvider) const customImageryProviderwx = new Cesium.ProviderViewModel({ name: '卫星图层', iconUrl: 'https://fh.dji.com/assets/img/satellite@3x.0026b4db.png', tooltip: '卫星图层', creationFunction: function () { return new Cesium.WebMapTileServiceImageryProvider({ url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token, subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域 layer: 'tdtBasicLayer', style: 'default', format: 'image/jpeg', tileMatrixSetID: 'GoogleMapsCompatible', }) } }) providerViewModels.push(customImageryProviderwx) const tdtModel = new Cesium.ProviderViewModel({ name: '标准图层', iconUrl: 'https://fh.dji.com/assets/img/streets@3x.d07c7065.png', tooltip: '标准图层', creationFunction: function () { return new Cesium.WebMapTileServiceImageryProvider({ url: 'http://t0.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token, subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'], // 天地图服务器子域 layer: 'tdtBasicLayer', style: 'default', format: 'image/jpeg', tileMatrixSetID: 'GoogleMapsCompatible', }) } }) providerViewModels.push(tdtModel) }
-
用到的文档:cesium中文网: Index - Cesium Documentation
-
cesium教程:鼠标键盘事件 | Cesium 入门教程