vue3+vite+ceisum 使用教程
笔记
链接
基础环境配置
1. 安装
pnpm i cesium@1.99 vite-plugin-cesium
2. 修改vite.config.js⽂件, 添加cesium
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import cesium from 'vite-plugin-cesium'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue(),cesium()]
})
3. 使用 cesium , 如在app.vue中引⼊Cesium
import * as Cesium from 'cesium'
4. 基础创建代码
<script setup>
import { shallowRef, onMounted } from "vue";
import * as Cesium from 'cesium'
const viewer = shallowRef(null)
onMounted(async () => {
// 设置 Token
Cesium.Ion.defaultAccessToken = '你的Token'
// 创建 Viewer
viewer.value = new Cesium.Viewer('cesium', {})
})
</script>
<template>
<div id="cesium"></div>
</template>
5. 示例运行效果
Cesium.Viewer 参数设置
设置影像图层及控件
ArcGIS影像图层地址
https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer
创建代码
<script setup>
import { shallowRef, onMounted } from "vue";
import * as Cesium from 'cesium'
const viewer = shallowRef(null)
onMounted(async () => {
// 设置 Token
Cesium.Ion.defaultAccessToken = '你的Token'
// 创建 Viewer
viewer.value = new Cesium.Viewer('cesium', {
// 默认的⾕歌地图影像 影像图层 ImageryLayer
imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer",
enablePickFeatures: false,
}),
terrainProvider: Cesium.createWorldTerrain({
requestVertexNormals: true, // 是否请求顶点法线
requestWaterMask: true, // 是否请求水掩
}),
animation: false, // 是否显示动画控件
timeline: false, // 是否显示时间轴
infoBox: false, // 是否显示信息框
geocoder: false, // 是否显示地名查找控件
homeButton: false, // 是否显示Home按钮
fullscreenButton: false, // 是否显示全屏按钮
baseLayerPicker: false, // 是否显示图层选择控件
navigationHelpButton: false, // 是否显示帮助按钮
sceneModePicker: false, // 是否显示投影方式控件
})
})
</script>
<template>
<div id="cesium"></div>
</template>
效果预览
相机设置
1. 设置相机位置
// 设置相机位置
viewer.value.camera.setView({
// 目标点
destination: Cesium.Cartesian3.fromDegrees(120.5810725, 31.3016935, 100000),
// 初始化角度
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-30),
roll: 0
}
})
2. 相机运动
// 移动相机
viewer.value.camera.flyTo({
// 目标点
destination: Cesium.Cartesian3.fromDegrees(110.5810725, 30.3016935, 450000),
// 初始化角度
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-90),
roll: 0
},
// 动画时长
duration: 2
})
固定相机位置, 使相机固定在某个位置, 不跟随鼠标移动, 可以缩放
// 固定相机位置, 使相机固定在某个位置, 不跟随鼠标移动, 可以缩放
const position = Cesium.Cartesian3.fromDegrees(120.5810725, 31.3016935,)
viewer.value.camera.lookAt(position, new Cesium.HeadingPitchRange(
Cesium.Math.toRadians(0),
Cesium.Math.toRadians(-90),
1000000,//中⼼点距离地⾯的距离
))
数据转化
角度于弧度的计算
角度转弧度 π/180经纬度
弧度变⻆度 180/π弧度
Cesium 使用的是笛卡尔坐标系, 与现实世界的经纬度不一样需要转化
注意: 笛卡尔坐标系转经纬度时, 转换结果为弧度制, 只有高度不变
// 经纬度转笛卡尔坐标系, 经度, 纬度, 高度
const dkr = Cesium.Cartesian3.fromDegrees(120, 30, 130)
console.log(dkr, 'dkr')
// 笛卡尔坐标系转经纬度, 经纬度单位为弧度
const jwd = Cesium.Cartographic.fromCartesian(dkr)
console.log(jwd, 'jwd')
// 弧度制转化
const lo = Cesium.Math.toDegrees(jwd.longitude)
const la = Cesium.Math.toDegrees(jwd.latitude)
console.log(lo, la, jwd.height)
输出结果
Cartesian3 {x: -2764184.6112976633, y: 4787708.188267582, z: 3170438.7353836372} 'dkr'
Cartographic {longitude: 2.0943951023931957, latitude: 0.5235987755982987, height: 130.0000000000647} 'jwd'
120.00000000000001 29.999999999999993 130.0000000000647
实体
1. 画点
实体中都是笛卡尔坐标
entity是基于primitive封装的
// 写法⼆(推荐)
const point = new Cesium.Entity({
// 笛卡尔坐标
position: Cesium.Cartesian3.fromDegrees(
114.0,
30.0,
),
point: {
color: Cesium.Color.RED, // 点的颜色
pixelSize: 10.0, // 点的大小
outlineColor: Cesium.Color.WHITE, // 点的外线颜色
outlineWidth: 2.0, // 点的外线宽度
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // 点的基准高度
},
label: {
text: '点1', // 标签的文字
fillColor: Cesium.Color.YELLOWGREEN, // 标签的文字颜色
showBackground: true, // 标签的背景颜色
backgroundColor: new Cesium.Color(255, 255, 0,) // 标签的背景颜色
}
})
viewer.value.entities.add(point) // 添加实体
// 写法⼀
const point = new Cesium.Entity({
position: Cesium.Cartesian3.fromDegrees(
114.0,
30.0,
),
point: {
color: Cesium.Color.RED,
pixelSize: 10.0,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2.0,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
},
label: {
text: '点1',
fillColor: Cesium.Color.YELLOWGREEN,
showBackground: true,
backgroundColor: new Cesium.Color(255, 255, 0,)
}
})
viewer.value.entities.add(point)
viewer.value.zoomTo(point2) // 缩放移动至实体
Cesium 创建地图
<script setup>
import { shallowRef, onMounted } from "vue";
import * as Cesium from 'cesium'
const viewer = shallowRef(null)
onMounted(async () => {
const esri = new Cesium.ArcGisMapServerImageryProvider({
url: 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer',
})
//其中Rectangle是矩形范围,指定为经度和纬度坐标的二维区域
Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(
73.5,//西经
4,//南纬
135.4,//东经
53.5//北纬
)
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI1OWY4MDdmNS1kYzU3LTQ0YTMtOTFlNC1lMTRiZjJmMmQ1ODkiLCJpZCI6MjgyNTQ3LCJpYXQiOjE3NDE0OTY4NDF9.5IPfvsFL9FrVdUJVFRyLqBE_uo01sFzznqZy7nr3rKg'
viewer.value = new Cesium.Viewer('cesium', {
imageryProvider: esri,
terrainProvider: Cesium.createWorldTerrain({
requestVertexNormals: true, // 是否请求顶点法线
requestWaterMask: true, // 是否请求水掩
}),
animation: false, // 是否显示动画控件
timeline: false, // 是否显示时间轴
infoBox: false, // 是否显示信息框
geocoder: false, // 是否显示地名查找控件
// homeButton: false, // 是否显示Home按钮
fullscreenButton: false, // 是否显示全屏按钮
baseLayerPicker: false, // 是否显示图层选择控件
navigationHelpButton: false, // 是否显示帮助按钮
sceneModePicker: false, // 是否显示投影方式控件
})
// 经纬度转笛卡尔坐标系
const dkr = Cesium.Cartesian3.fromDegrees(120, 30, 130)
console.log(dkr, 'dkr')
// 笛卡尔坐标系转经纬度, 经纬度单位为弧度
const jwd = Cesium.Cartographic.fromCartesian(dkr)
console.log(jwd, 'jwd')
// 弧度制转化
const lo = Cesium.Math.toDegrees(jwd.longitude)
const la = Cesium.Math.toDegrees(jwd.latitude)
console.log(lo, la, jwd.height)
// 设置相机位置
viewer.value.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(120.5810725, 31.3016935, 100000),
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-30),
roll: 0
}
})
// 移动相机
viewer.value.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(110.5810725, 30.3016935, 450000),
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-90),
roll: 0
},
duration: 2
})
})
</script>
<template>
<div id="cesium"></div>
</template>
<style scoped>
:deep(.cesium-viewer-bottom) {
display: none;
}
</style>
WKID列表
常用的地理和投影坐标系的WKID
ArcGIS中我国常用的坐标系统WKID列表