vue cesium 加载倾斜摄影数据并在上面添加自定义标注

vue

在main.js引入

import Cesium from 'cesium/Cesium'
import '../node_modules/cesium/Build/Cesium/Widgets/widgets.css'

Vue.prototype.Cesium = Cesium;


// 以下是组件内容



<template>

<div class="cesium-wrap">

<div ></div>

<el-form ref="form" :model="form" label-width="80px" class="cesiumForm" v-if="showForm" size="mini">

<el-form-item label="id">

<el-select v-model="form.id" placeholder="请选择" @change="changeLing">

<el-option v-for="item in lingList" :key="'ling' + item.id" :label="item.name" :value="item.id"></el-option>

</el-select>

</el-form-item>

<el-form-item label="名称"><el-input v-model="form.name"></el-input></el-form-item>

<el-form-item>

<el-button type="primary" @click="onSubmit()">提交</el-button>

<el-button @click="handleClose">取消</el-button>

<el-button @click="deleHandle">删除</el-button>

</el-form-item>

</el-form>

</div>

</template>

<script>

export default {

data() {

return {

terrainUrl: 'http://172.0.0.1:8888/terrain2/',

imageryUrl: 'http://172.0.0.1:8888/image/{z}/{x}/{y}.jpg',

orgPos: { lon: 99.79602474, lat: 26.45798084, height: 300000 }, //7286.13}

viewer: null, //

terrainProvider: '', // 添加地形图数据

imageryProvider: '', // 图形数据

form: {

id: '',

name: '',

jd: '',

wd: '',

height: ''

},

showForm: false,

img: '/static/images/mark.png',

lingList: []

};

},

created() {

this.queryMingTombsHandler();

},

mounted() {

this.initViewer();

},

watch: {},

methods: {

// 获取数据

queryMingTombsHandler() {

this.lingList = [];

this.$commonHttp(请求地址).then(res => {

if (res.code == this.$codeState.OKCODE) {

let data = res.data;

this.lingList = data;

this.lingList.forEach(item => {

if (item.height) {

this.addEntities(item);

}

});

console.log('lingList', this.lingList);

}

});

},

// 选择

changeLing(val) {

this.lingList.forEach(item => {

if (item.id == val) {

this.form.name = item.name;

console.log('this.form', this.form);

}

});

},

onSubmit() {

this.$commonHttp(请求地址, {

id: this.form.id,

jd: this.form.jd,

wd: this.form.wd,

height: this.form.height

}).then(res => {

if (res.code == this.$codeState.OKCODE) {

this.addEntities(this.form);

this.showForm = false;

this.clearFromHandler();

}

});

},

handleClose() {

this.showForm = false;

},

deleHandle() {

this.$commonHttp(请求地址, {

id: this.form.id

}).then(res => {

if (res.code == this.$codeState.OKCODE) {

this.showForm = false;

this.clearFromHandler();

}

});

},

// 将屏幕坐标转为经纬度

lonLan(position) {

let viewer = this.viewer;

let Cesium = this.Cesium;

var position1, cartographic1, lon, lat, height;

let lonLanHei = {

lon: '',

lat: '',

height: ''

};

let ray = viewer.scene.camera.getPickRay(position);

position1 = viewer.scene.globe.pick(ray, viewer.scene);

cartographic1 = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position1);

let feature = viewer.scene.pick(position);

if (feature == undefined) {

lon = Cesium.Math.toDegrees(cartographic1.longitude);

lat = Cesium.Math.toDegrees(cartographic1.latitude);

height = cartographic1.height;

} else {

let cartesian = viewer.scene.pickPosition(position);

if (Cesium.defined(cartesian)) {

let cartographic = Cesium.Cartographic.fromCartesian(cartesian);

lon = Cesium.Math.toDegrees(cartographic.longitude);

lat = Cesium.Math.toDegrees(cartographic.latitude);

height = cartographic.height; //模型高度 } };//

}

}

lonLanHei.lat = lat;

lonLanHei.lon = lon;

lonLanHei.height = height;

return lonLanHei;

},

clearFromHandler() {

this.form.id = '';

this.form.jd = '';

this.form.wd = '';

this.form.name = '';

this.form.height = '';

},

initViewer() {

//添加地形图数据

// this.terrainProvider = new this.Cesium.CesiumTerrainProvider({

// url: this.terrainUrl

// });

// 添加图片数据

// this.imageryProvider = new this.Cesium.UrlTemplateImageryProvider({

// url: this.imageryUrl,

// tilingScheme: new this.Cesium.WebMercatorTilingScheme(),

// maximumLevel: 19

// });

let terrainModels = this.Cesium.createDefaultTerrainProviderViewModels();

// 初始化

this.viewer = new this.Cesium.Viewer('cesiumContainer', {

// terrainProvider: this.terrainProvider,

// imageryProvider: this.imageryProvider,

infoBox: false, //是否显示信息框--点击mark时,true有会

geocoder: false, // 查找位置,查到后会将镜头对准找到的地址

homeButton: false, // 视角返回初始位置

sceneModePicker: false, // 旋转视角的模式,有三种3D,2D,哥伦布视图

//baseLayerPicker: false, // 图层选择器,选择要显示的地图服务和地形服务。

navigationHelpButton: false, // 导航帮助按钮,显示默认的地图控制帮助。

fullscreenButton: true, // 全屏按钮

animation: false, // 动画,控制试图动画的播放速度

timeline: false, // 时间线,指示当前时间,并允许用户跳到特定的时间。

selectionIndicator: false, // 禁止entity选中

vrButton: true,

scene3DOnly: false,

sceneMode: 3

//terrainProviderViewModels: terrainModels,

//selectedTerrainProviderViewModel: terrainModels[1] // Select STK high-res terrain

});

this.viewer.scene.globe.depthTestAgainstTerrain = false;

// cesium的label的清晰度

this.viewer.scene.postProcessStages.fxaa.enabled = false;

// 加载倾斜摄影数据

this.loadTilesetHandler();

// this.initCamera();

//去掉地图标志

this.viewer._cesiumWidget._creditContainer.style.display = 'none';

this.initMark();

},

// 加载倾斜摄影数据

loadTilesetHandler() {

let tileset = this.viewer.scene.primitives.add(

new this.Cesium.Cesium3DTileset({

url: 'http://172.18.49.225:65432/qxsy/tileset.json' //

})

);

tileset.readyPromise

.then(() => {

this.viewer.scene.primitives.lowerToBottom(tileset);

let boundingSphere = tileset.boundingSphere;

this.viewer.camera.viewBoundingSphere(boundingSphere, new this.Cesium.HeadingPitchRange(0.0, -0.5, boundingSphere.radius));

this.viewer.camera.lookAtTransform(this.Cesium.Matrix4.IDENTITY);

})

.otherwise(function(Aerror) {

throw error;

});

},

initCamera() {

let self = this;

this.viewer.scene.camera.flyTo({

destination: this.Cesium.Cartesian3.fromDegrees(this.orgPos.lon, this.orgPos.lat, this.orgPos.height), // 设置位置

orientation: {

heading: this.Cesium.Math.toRadians(0.0), // 方向

pitch: this.Cesium.Math.toRadians(-90), // 倾斜角度

roll: this.Cesium.Math.toRadians(0)

},

complete: () => {

// 到达位置后执行的回调函数

this.viewer.scene.camera.flyTo({

destination: self.Cesium.Cartesian3.fromDegrees(self.orgPos.lon, self.orgPos.lat, self.orgPos.height),

orientation: {

heading: self.Cesium.Math.toRadians(0.0),

pitch: self.Cesium.Math.toRadians(-30),

roll: self.Cesium.Math.toRadians(0)

},

complete: () => {},

duration: 3

});

},

duration: 5 // 设置飞行持续时间,默认会根据距离来计算

});

},

initMark() {

const viewer = this.viewer;

const Cesium = this.Cesium;

// 左击进入360全景

viewer.screenSpaceEventHandler.setInputAction(e => {

viewer.selectedEntity = this.pickEntity(viewer, e.position);

if (!viewer.selectedEntity) {

let obj = this.lonLan(e.position);

this.form.jd = obj.lon;

this.form.wd = obj.lat;

this.form.height = obj.height;

this.showForm = true;

} else {

this.$parent.detailInfo(viewer.selectedEntity._id);

console.log('进入360全景', viewer.selectedEntity._id);

}

}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

// 双击entity,会放大视图,entity居中显示,且鼠标左键失去移动功能,鼠标滚轮失去作用

this.viewer.screenSpaceEventHandler.setInputAction(() => {}, this.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);

},

//双击操作

pickAndTrackObject(e) {},

// 设置广告牌label

addEntities(item) {

const viewer = this.viewer;

const Cesium = this.Cesium;

// label显示清晰度

viewer.scene.postProcessStages.fxaa.enabled = false;

let wyoming = viewer.entities.add({

id: item.id,

name: item.name,

position: Cesium.Cartesian3.fromDegrees(Number(item.jd), Number(item.wd), Number(item.height) + 10),

//立广告牌

billboard: {

image: this.img,

verticalOrigin: Cesium.VerticalOrigin.BOTTOM,

show: true, // default

width: 50, // default: undefined

height: 55

},

//字体标签样式

label: {

text: item.name,

font:'normal 32px MicroSoft YaHei',

scale:0.5,

color: Cesium.Color.WHITE,

style: Cesium.LabelStyle.FILL_AND_OUTLINE,

showBackground: true,

horizontalOrigin: Cesium.HorizontalOrigin.CENTER,

verticalOrigin: Cesium.VerticalOrigin.BOTTOM,

// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(10.0, 8000.0),

// disableDepthTestDistance: 100.0,

pixelOffset: new Cesium.Cartesian2(40, -20) // 调整偏移位置

}

});

},

// 拾取实体

pickEntity(viewer, position) {

const Cesium = this.Cesium;

let picked = viewer.scene.pick(position);

if (picked) {

let id = Cesium.defaultValue(picked.id, picked.primitive.id);

if (id instanceof Cesium.Entity) {

return id;

}

}

return undefined;

}

}

};

</script>

<style scoped lang="less">

.cesium-wrap {

width: 100%;

height: 100%;

display: inline-block;

}

#cesiumContainer {

width: 100%;

height: 100%;

position: absolute;

margin: 0;

padding: 0;

overflow: hidden;

}

.cesiumForm {

width: 300px;

position: absolute;

left: 50%;

top: 50%;

z-index: 10;

background-color: #ccc;

padding: 10px;

transform: translate(-50%, -50%);

}

</style>

以上是 vue cesium 加载倾斜摄影数据并在上面添加自定义标注 的全部内容, 来源链接: utcz.com/z/379347.html

回到顶部