在vite創(chuàng)建的vue3項(xiàng)目中使用Cesium加載czml路徑信息和無(wú)人機(jī)模型
- 用到的區(qū)域文件、地圖標(biāo)記文件、路徑信息文件、模型文件 提取碼:99jq
-
使用vite創(chuàng)建vue3項(xiàng)目
npm create vite@latest
cd到創(chuàng)建的項(xiàng)目文件夾中
npm install
安裝Cesium
npm i cesium vite-plugin-cesium vite -D
-
配置
-
vite.config.js文件:添加Cesium并設(shè)置反向代理實(shí)現(xiàn)跨域。
import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import cesium from 'vite-plugin-cesium'; export default defineConfig({ plugins: [vue(), cesium()], //設(shè)置反向代理,跨域 server: { proxy: { '/ArcGIS': { target: 'https://services.arcgisonline.com',//代理的地址 changeOrigin: true, } } } });
-
style.css(可選):修改#app樣式
#app { max-width: 100%; margin: 0 auto; padding: 2rem; text-align: center; }
-
-
代碼
-
App.vue
<template> <div id="cesiumContainer"></div> </template> <script setup> import * as Cesium from 'cesium'; import { onMounted } from 'vue'; onMounted(async () => { // 相當(dāng)于密鑰,申請(qǐng)使用下邊鏈接中的數(shù)據(jù)時(shí)需要用到 Cesium.Ion.defaultAccessToken = '你的token'; Cesium.ArcGisMapService.defaultAccessToken = '你的token'; let viewer = new Cesium.Viewer('cesiumContainer', { // 防止報(bào)錯(cuò) 但是加上之后點(diǎn)物體就不會(huì)彈窗顯示信息了 infoBox: false, // 去掉右上角的一個(gè)小選項(xiàng)卡 baseLayerPicker: false, // 加載世界街道地圖的底圖 baseLayer: Cesium.ImageryLayer.fromProviderAsync( Cesium.ArcGisMapServerImageryProvider.fromUrl("/ArcGIS/rest/services/World_Street_Map/MapServer") ), // 三維立體效果、水波紋 terrainProvider: await Cesium.createWorldTerrainAsync({ requestVertexNormals: true, requestWaterMask: true }) }); viewer.camera.setView({ // 初始的相機(jī)的定位 定在紐約 destination: new Cesium.Cartesian3(1332761, -4662399, 4137888), // 方向 俯仰 orientation: { heading: 0.6, pitch: -0.66 } }); // 添加紐約建筑模型 let city = viewer.scene.primitives.add( await Cesium.Cesium3DTileset.fromIonAssetId(75343) ); // 定義建筑的3D樣式 層次分明 city.style = new Cesium.Cesium3DTileStyle({ color: { // 條件判斷建筑具體的顏色 conditions: [ ['${Height} >= 300', 'rgba(45,0,75,0.5)'], ['${Height} >= 200', 'rgb(102,71,151)'], ['${Height} >= 100', 'rgba(170,162,204,0.5)'], ['${Height} >= 50', 'rgba(224,226,238,0.5)'], ['${Height} >= 25', 'rgba(252,230,200,0.5)'], ['${Height} >= 10', 'rgba(248,176,87,0.5)'], ["true", 'rgb(127,59,8)'] ] } }) // 鄰域邊界的加載 let neighborhoodsPromise = Cesium.GeoJsonDataSource.load('./assets/SampleData/sampleNeighborhoods.geojson'); // 貼在地圖表面 neighborhoodsPromise.then((dataSource) => { // 將數(shù)據(jù)添加到查看器 viewer.dataSources.add(dataSource); // 把數(shù)據(jù)進(jìn)行著色的調(diào)整以及放到地圖的表面 // 拿到區(qū)域的實(shí)例 Get the array of entities let neighborhoodsEntities = dataSource.entities.values; for (let i = 0; i < neighborhoodsEntities.length; i++) { let entity = neighborhoodsEntities[i]; // 判斷存不存在相應(yīng)的圖形 if (Cesium.defined(entity.polygon)) { entity.name = entity.properties.neighborhood; // 設(shè)置多邊形顏色 entity.polygon.material = Cesium.Color.fromRandom({ red: 0.1, maximumGreen: 0.5, minimumBlue: 0.5, alpha: 0.6 }); // 設(shè)置地形著色 entity.polygon.classificationType = Cesium.ClassificationType.TERRAIN; // 設(shè)置位置 貼到多邊形最底下 // 生成多邊形中心 let polyPositions = entity.polygon.hierarchy.getValue(Cesium.JulianDate.now()).positions; // 橢球體 entity.position = Cesium.Ellipsoid.WGS84.scaleToGeocentricSurface( // 邊界球 Cesium.BoundingSphere.fromPoints(polyPositions).center ); // 生成標(biāo)簽 entity.label = { text: entity.name, showBackground: true, scale: 0.6, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 設(shè)置顯示的距離范圍 distanceDisplayCondition: new Cesium.DistanceDisplayCondition(10, 8000), // 禁用的距離 disableDepthTestDistance: 100 } } } }); // 地圖標(biāo)記顯示 let kmloptions = { camera: viewer.scene.camera, canvas: viewer.scene.canvas, // 如果我們想要將幾何特征(多邊形、線串和線性環(huán))固定在地面上,則為true clampToGround: true }; // KML文件時(shí)谷歌公司創(chuàng)建的一個(gè)地標(biāo)性文件,用于記錄某一地點(diǎn)、或者連續(xù)地點(diǎn)的時(shí)間、經(jīng)緯度、海拔等地理信息數(shù)據(jù) let geoCachePromise = Cesium.KmlDataSource.load('./assets/SampleData/sampleGeocacheLocations.kml', kmloptions); // 將geocache廣告牌實(shí)體添加到場(chǎng)景中并為其設(shè)置樣式 geoCachePromise.then((dataSource) => { // console.log(dataSource) // 將新數(shù)據(jù)作為實(shí)體添加到查看器 viewer.dataSources.add(dataSource); // 獲取實(shí)體數(shù)組 let geoCacheEntities = dataSource.entities.values; for (let i = 0; i < geoCacheEntities.length; i++) { let entity = geoCacheEntities[i]; if (Cesium.defined(entity.billboard)) { // 調(diào)整垂直原點(diǎn),使圖釘位于地形上 entity.billboard.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; entity.billboard.image = '/assets/tagpark.png'; // 禁用標(biāo)簽以減少混亂 entity.label = undefined; // 添加距離現(xiàn)實(shí)條件 entity.billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(10, 20000); // 以度為單位計(jì)算經(jīng)度和緯度 let cartographicPosition = Cesium.Cartographic.fromCartesian(entity.position.getValue(Cesium.JulianDate.now())); let latitude = Cesium.Math.toDegrees(cartographicPosition.latitude); let longtitude = Cesium.Math.toDegrees(cartographicPosition.longitude); // 修改描述 let description = '<table class="cesium-infoBox-defaultTable cesium-infoBox-defaultTable-lighter"><tbody>' + '<tr><th>' + "longtitude" + '</th><td>' + longtitude.toFixed(5) + '</td></tr>' + '<tr><th>' + "latitude" + '</th><td>' + latitude.toFixed(5) + '</td></tr>' + '<tr><th>' + "實(shí)時(shí)人流" + '</th><td>' + Math.floor(Math.random() * 20000) + '</td></tr>' + '<tr><th>' + "安全等級(jí)" + '</th><td>' + Math.floor(Math.random() * 5) + '</td></tr>' + '</tbody></table>'; entity.description = description; } } }) // 從czml文件中加載飛行路徑 let dronePromise = Cesium.CzmlDataSource.load('./assets/SampleData/sampleFlight.czml'); // 無(wú)人機(jī)實(shí)體 dronePromise.then((dataSource) => { // 添加獲取到的實(shí)體數(shù)據(jù) viewer.dataSources.add(dataSource); // 通過(guò)ID獲取軌跡的實(shí)體 let drone = dataSource.entities.getById('Aircraft/Aircraft1'); // 設(shè)置無(wú)人機(jī)實(shí)體的模型 drone.model = { // CesiumDrone.gltf會(huì)報(bào)錯(cuò) // uri:'./assets/SampleData/Models/CesiumDrone.gltf', uri: './assets/SampleData/Models/Cesium_Air.glb', // uri:'./assets/SampleData/Models/ferrari2.gltf', // 設(shè)置模型最小的時(shí)候的像素大小 縮小地球的時(shí)候也能看到 minimumPixelSize: 128, // 設(shè)置最大規(guī)格 maximumScale: 500, // 輪廓的顏色屬性 silhouetteColor: Cesium.Color.WHITE, // 指定輪廓的大小 silhouetteSize: 0 } // 設(shè)置無(wú)人機(jī)的方向 角度 drone.orientation = new Cesium.VelocityOrientationProperty(drone.position); // 設(shè)置當(dāng)前所在的具體的位置 drone.viewFrom = new Cesium.Cartesian3(0, -30, 30); // 設(shè)置動(dòng)起來(lái) viewer.clock.shouldAnimate = true; }) }) </script> <style> html, body, #app, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } </style>
-
解讀
-
加載token
// 相當(dāng)于密鑰,申請(qǐng)使用下邊鏈接中的數(shù)據(jù)時(shí)需要用到 Cesium.Ion.defaultAccessToken = '你的token'; Cesium.ArcGisMapService.defaultAccessToken = '你的token';
-
創(chuàng)建查看器viewer,加載世界街道地圖,注意vite.config.js中配合的跨域。
let viewer = new Cesium.Viewer('cesiumContainer', { // 防止報(bào)錯(cuò) infoBox: false, // 去掉右上角的一個(gè)小選項(xiàng)卡 baseLayerPicker: false, // 加載世界街道地圖的底圖 baseLayer: Cesium.ImageryLayer.fromProviderAsync( Cesium.ArcGisMapServerImageryProvider.fromUrl("/ArcGIS/rest/services/World_Street_Map/MapServer") ), // 三維立體效果、水波紋 terrainProvider: await Cesium.createWorldTerrainAsync({ requestVertexNormals: true, requestWaterMask: true }) });
-
初始化相機(jī)位置
viewer.camera.setView({ // 初始的相機(jī)的定位 定在紐約 destination: new Cesium.Cartesian3(1332761, -4662399, 4137888), // 方向 俯仰 orientation: { heading: 0.6, pitch: -0.66 } });
-
添加紐約建筑模型并設(shè)置建筑顏色樣式
// 添加紐約建筑模型 let city = viewer.scene.primitives.add( await Cesium.Cesium3DTileset.fromIonAssetId(75343) ); // 定義建筑的3D樣式 層次分明 city.style = new Cesium.Cesium3DTileStyle({ color: { // 條件判斷建筑具體的顏色 conditions: [ ['${Height} >= 300', 'rgba(45,0,75,0.5)'], ['${Height} >= 200', 'rgb(102,71,151)'], ['${Height} >= 100', 'rgba(170,162,204,0.5)'], ['${Height} >= 50', 'rgba(224,226,238,0.5)'], ['${Height} >= 25', 'rgba(252,230,200,0.5)'], ['${Height} >= 10', 'rgba(248,176,87,0.5)'], ["true", 'rgb(127,59,8)'] ] } })
-
劃分城市區(qū)域并著色
// 鄰域邊界的加載 let neighborhoodsPromise = Cesium.GeoJsonDataSource.load('./assets/SampleData/sampleNeighborhoods.geojson'); // 貼在地圖表面 neighborhoodsPromise.then((dataSource) => { // 將數(shù)據(jù)添加到查看器 viewer.dataSources.add(dataSource); // 把數(shù)據(jù)進(jìn)行著色的調(diào)整以及放到地圖的表面 // 拿到區(qū)域的實(shí)例 Get the array of entities let neighborhoodsEntities = dataSource.entities.values; for (let i = 0; i < neighborhoodsEntities.length; i++) { let entity = neighborhoodsEntities[i]; // 判斷存不存在相應(yīng)的圖形 if (Cesium.defined(entity.polygon)) { entity.name = entity.properties.neighborhood; // 設(shè)置多邊形顏色 entity.polygon.material = Cesium.Color.fromRandom({ red: 0.1, maximumGreen: 0.5, minimumBlue: 0.5, alpha: 0.6 }); // 設(shè)置地形著色 entity.polygon.classificationType = Cesium.ClassificationType.TERRAIN; // 設(shè)置位置 貼到多邊形最底下 let polyPositions = entity.polygon.hierarchy.getValue(Cesium.JulianDate.now()).positions; entity.position = Cesium.Ellipsoid.WGS84.scaleToGeocentricSurface( Cesium.BoundingSphere.fromPoints(polyPositions).center ); // 生成標(biāo)簽 entity.label = { text: entity.name, showBackground: true, scale: 0.6, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 設(shè)置顯示的距離范圍 distanceDisplayCondition: new Cesium.DistanceDisplayCondition(10, 8000), // 禁用的距離 disableDepthTestDistance: 100 } } } })
-
利用KML文件實(shí)現(xiàn)在地圖上標(biāo)記地點(diǎn)
// 地圖標(biāo)記顯示 let kmloptions = { camera: viewer.scene.camera, canvas: viewer.scene.canvas, // 如果我們想要將幾何特征(多邊形、線串和線性環(huán))固定在地面上,則為true clampToGround: true }; // KML文件時(shí)谷歌公司創(chuàng)建的一個(gè)地標(biāo)性文件,用于記錄某一地點(diǎn)、或者連續(xù)地點(diǎn)的時(shí)間、經(jīng)緯度、海拔等地理信息數(shù)據(jù) let geoCachePromise = Cesium.KmlDataSource.load('./assets/SampleData/sampleGeocacheLocations.kml', kmloptions); // 將geocache廣告牌實(shí)體添加到場(chǎng)景中并為其設(shè)置樣式 geoCachePromise.then((dataSource) => { // console.log(dataSource) // 將新數(shù)據(jù)作為實(shí)體添加到查看器 viewer.dataSources.add(dataSource); // 獲取實(shí)體數(shù)組 let geoCacheEntities = dataSource.entities.values; for (let i = 0; i < geoCacheEntities.length; i++) { let entity = geoCacheEntities[i]; if (Cesium.defined(entity.billboard)) { // 調(diào)整垂直原點(diǎn),使圖釘位于地形上 entity.billboard.verticalOrigin = Cesium.VerticalOrigin.BOTTOM; entity.billboard.image = '/assets/tagpark.png'; // 禁用標(biāo)簽以減少混亂 entity.label = undefined; // 添加距離現(xiàn)實(shí)條件 entity.billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(10, 20000); // 以度為單位計(jì)算經(jīng)度和緯度 let cartographicPosition = Cesium.Cartographic.fromCartesian(entity.position.getValue(Cesium.JulianDate.now())); let latitude = Cesium.Math.toDegrees(cartographicPosition.latitude); let longtitude = Cesium.Math.toDegrees(cartographicPosition.longitude); // 修改描述 let description = '<table class="Cesium-infoBox-defaultTable cesium-infoBox-defaultTable-lighter"><tbody>' + '<tr><th>' + "longtitude" + '</th><td>' + longtitude.toFixed(5) + '</td><tr>' + '<tr><th>' + "latitude" + '</th><td>' + latitude.toFixed(5) + '</td><tr>' + '<tr><th>' + "實(shí)時(shí)人流" + '</th><td>' + Math.floor(Math.random() * 20000) + '</td><tr>' + '<tr><th>' + "安全等級(jí)" + '</th><td>' + Math.floor(Math.random() * 5) + '</td><tr>' + '</tbody><table>'; entity.description = description; } } })
-
加載飛行路徑和飛機(jī)模型
// 從czml文件中加載飛行路徑 let dronePromise = Cesium.CzmlDataSource.load('./assets/SampleData/sampleFlight.czml'); // 無(wú)人機(jī)實(shí)體 dronePromise.then((dataSource) => { // 添加獲取到的實(shí)體數(shù)據(jù) viewer.dataSources.add(dataSource); // 通過(guò)ID獲取軌跡的實(shí)體 let drone = dataSource.entities.getById('Aircraft/Aircraft1'); // 設(shè)置無(wú)人機(jī)實(shí)體的模型 drone.model = { // CesiumDrone.gltf會(huì)報(bào)錯(cuò) // uri:'./assets/SampleData/Models/CesiumDrone.gltf', uri: './assets/SampleData/Models/Cesium_Air.glb', // uri:'./assets/SampleData/Models/ferrari2.gltf', // 設(shè)置模型最小的時(shí)候的像素大小 縮小地球的時(shí)候也能看到 minimumPixelSize: 128, // 設(shè)置最大規(guī)格 maximumScale: 500, // 輪廓的顏色屬性 silhouetteColor: Cesium.Color.WHITE, // 指定輪廓的大小 silhouetteSize: 0 } // 設(shè)置無(wú)人機(jī)的方向 角度 drone.orientation = new Cesium.VelocityOrientationProperty(drone.position); // 設(shè)置當(dāng)前所在的具體的位置 drone.viewFrom = new Cesium.Cartesian3(0, -30, 30); // 設(shè)置動(dòng)起來(lái) viewer.clock.shouldAnimate = true; })
-
-
-
效果:npm run dev 運(yùn)行文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-561864.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-561864.html
到了這里,關(guān)于在vite創(chuàng)建的vue3項(xiàng)目中使用Cesium加載czml路徑信息和無(wú)人機(jī)模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!