代码页
<template>
<div>
<div id="cesiumDemo"></div>
<transition name="el-fade-in-linear">
<div class="buildMessageBox messageBox" v-show="buildMessageBoxShow">
<div class="topLine"></div>
<div class="slantLine"></div>
<div class="title">
<span class="messageBoxTit">{
{
name}}</span>
</div>
<div class="contList">
<span class="messageBoxTit">电耗:</span><span class="messageVal">25410kw-h</span>
</div>
<div class="contList">
<span class="messageBoxTit">水耗:</span><span class="messageVal">1149m³</span>
</div>
<div class="contList">
<span class="messageBoxTit">已入住人口:</span><span class="messageVal">56人</span>
</div>
</div>
</transition>
</div>
</template>
<script>
import {
set3Dtitle2,
lablelist,
cylinderModel
} from '../../assets/js/cusium.js'
let viewer
let tilesFloodTest
let options
export default {
data() {
return {
name: "",
buildMessageBoxShow: false,
mapMouseDown: false,
layered: {
first: {
center: {
x: "-2793123.2216803157",
y: "4684923.801403305",
z: "3295058.384405283"
},
priipt1: 0,
priipt2: 0,
priipt3: 0,
priipt4: -12,
priipt5: -20,
priipt6: 0,
priipt7: 70,
priipt8: 52,
priipt9: 65,
},
second: {
center: {
x: '-2793214.4280046094',
y: '4684885.426110703',
z: '3295035.7843646174',
},
priipt1: 0,
priipt2: 0,
priipt3: 0,
priipt4: -25,
priipt5: -8,
priipt6: 0,
priipt7: 65,
priipt8: 35,
priipt9: 65,
}
},
lablelists: [{
x: "120.80302807741732",
y: '31.30709242677048',
z: 40,
Text: '1'
},
{
x: '120.80408198509431',
y: '31.30709242677048',
Text: '2',
z: 40
},
],
building: {
first: {
cylinder1: 18.7,
id: 'first',
x: "120.80302807741732",
y: '31.30709242677048'
},
second: {
cylinder1: 23,
id: 'second',
x: '120.80408198509431',
y: '31.30709242677048'
},
}
}
},
mounted() {
this.getCesiumDem()
},
methods: {
layeredTilesModel(data) {
let scene = viewer.scene
if (tilesFloodTest) {
tilesFloodTest.destroy()
}
var center = new Cesium.Cartesian3(
this.layered[data].center.x, this.layered[data].center.y, this.layered[data].center.z,
)
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center)
var hprRotation = Cesium.Matrix3.fromHeadingPitchRoll(
new Cesium.HeadingPitchRoll(Number(this.layered[data].priipt1), Number(this.layered[data].priipt2), Number(
this.layered[data].priipt3))
)
var hpr = Cesium.Matrix4.fromRotationTranslation(
hprRotation,
new Cesium.Cartesian3(Number(this.layered[data].priipt4), Number(this.layered[data].priipt5), Number(this
.layered[data].priipt6))
)
Cesium.Matrix4.multiply(modelMatrix, hpr, modelMatrix)
tilesFloodTest = scene.primitives.add(
new Cesium.ClassificationPrimitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: Cesium.BoxGeometry.fromDimensions({
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
dimensions: new Cesium.Cartesian3(Number(this.layered[data].priipt7), Number(this.layered[
data].priipt8), Number(this.layered[data].priipt9))
}),
modelMatrix: modelMatrix,
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
Cesium.Color.fromCssColorString('#D22809').withAlpha(0.5)
),
show: new Cesium.ShowGeometryInstanceAttribute(true)
},
}),
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE
})
)
},
getCesiumDem() {
let self = this
Cesium.Ion.defaultAccessToken ='你的token'
viewer = new Cesium.Viewer('cesiumDemo', {
animation: false,
baseLayerPicker: false,
geocoder: false,
timeline: false,
sceneModePicker: true,
navigationHelpButton: false,
infoBox: true,
fullscreenButton: false,
selectionIndicator: false,
scene3DOnly: true,
homeButton: false,
terrainProvider: new Cesium.EllipsoidTerrainProvider({
}),
})
set3Dtitle2(viewer)
for (var i = 0; i < self.lablelists.length; i++) {
let a = i
let data = self.lablelists
lablelist(viewer, data, a)
}
let building = self.building
cylinderModel(viewer, building, 'first')
cylinderModel(viewer, building, 'second')
let scene = viewer.scene
var terrainProvider = Cesium.createWorldTerrain({
requestVertexNormals: true
});
viewer.terrainProvider = terrainProvider;
viewer.scene.globe.enableLighting = true;
let ellipsoid = scene.globe.ellipsoid
let entity = viewer.entities.add({
label: {
show: false
}
})
let longitudeString = null
let latitudeString = null
let height = null
let handler = new Cesium.ScreenSpaceEventHandler(scene.canvas)
handler.setInputAction(function(event) {
if (self.mapMouseDown === true) {
self.buildMessageBoxShow = false
if (tilesFloodTest) {
tilesFloodTest.destroy()
}
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
handler.setInputAction(function(movement) {
self.mapMouseDown = true
}, Cesium.ScreenSpaceEventType.LEFT_DOWN)
handler.setInputAction(function(movement) {
self.mapMouseDown = false
}, Cesium.ScreenSpaceEventType.LEFT_UP)
handler.setInputAction(function(event) {
let cartesian = viewer.camera.pickEllipsoid(event.position, ellipsoid)
if (cartesian) {
console.log(cartesian, 111)
let cartographic = ellipsoid.cartesianToCartographic(cartesian)
longitudeString = Cesium.Math.toDegrees(cartographic.longitude)
latitudeString = Cesium.Math.toDegrees(cartographic.latitude)
height = Math.ceil(viewer.camera.positionCartographic.height)
entity.position = cartesian
console.log(longitudeString)
console.log(latitudeString)
let pick = viewer.scene.pick(event.position)
if (Cesium.defined(pick) && pick) {
if (pick.id && pick.id.name) {
let modelDataObj = JSON.parse(pick.id.name)
if (modelDataObj.cesiumType === 'cylinderBuilding') {
self.buildMessageBoxShow = true
let winpos = viewer.scene.cartesianToCanvasCoordinates(
pick.id.position._value
)
let name = pick.id.id
self.name = name
self.layeredTilesModel(pick.id.id)
setTimeout(() => {
let mainMessageBoxDom = document.querySelector('.buildMessageBox')
let winposWihth = mainMessageBoxDom.offsetWidth
let winposHeight = mainMessageBoxDom.offsetHeight
mainMessageBoxDom.style.left = (Math.floor(winpos.x) - (winposWihth / 2) + 230) + 'px'
mainMessageBoxDom.style.top = (Math.floor(winpos.y) - winposHeight - 70) + 'px'
}, 10)
}
} else {
self.buildMessageBoxShow = false
if (tilesFloodTest) {
tilesFloodTest.destroy()
}
}
} else {
self.buildMessageBoxShow = false
if (tilesFloodTest) {
tilesFloodTest.destroy()
}
}
} else {
entity.label.show = false
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
}
}
}
</script>
<style>
</style>
公用代码部分
export function set3Dtitle2(viewer) {
let translation = Cesium.Cartesian3.fromArray([0, 0, -170])
let m = Cesium.Matrix4.fromTranslation(translation)
let palaceTileset = new Cesium.Cesium3DTileset({
url: './static/demo/tileset.json',
modelMatrix: m,
maximumScreenSpaceError: 64
})
viewer.scene.primitives.add(palaceTileset);
palaceTileset.readyPromise.then(function(palaceTileset) {
viewer.scene.primitives.add(palaceTileset);
var heightOffset = 0;
var boundingSphere = palaceTileset.boundingSphere;
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
palaceTileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
viewer.zoomTo(palaceTileset, new Cesium.HeadingPitchRange(0.5, -0.2, palaceTileset.boundingSphere.radius *
1.0));
});
viewer.zoomTo(palaceTileset)
}
export function lablelist(viewer, data, a) {
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(data[a].x, data[a].y, data[
a].z),
label: {
text: data[a].Text,
font: '14pt Source Han Sans CN',
fillColor: Cesium.Color.WHITE,
backgroundColor: Cesium.Color.BLUE,
showBackground: true,
outline: true,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
scale: 1.0,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
verticalOrigin: Cesium.VerticalOrigin.CENTER,
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
pixelOffset: new Cesium.Cartesian2(10, 0),
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 1000),
show: true
}
});
}
export function cylinderModel(viewer, building, data) {
viewer.entities.add({
id: building[data].id,
name: '{
"cesiumType": "cylinderBuilding"}',
position: Cesium.Cartesian3.fromDegrees(building[data].x, building[data].y, 10),
orientation: Cesium.Transforms.headingPitchRollQuaternion(
new Cesium.Cartesian3.fromDegrees(building[data].x, building[data].y, 10),
new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(140), Cesium.Math.toRadians(0), Cesium.Math
.toRadians(0))
),
cylinder: {
length: 50,
topRadius: 35,
bottomRadius: 35,
material: Cesium.Color.fromCssColorString('rgba(255,255,255,0.01 )'),
slices: 100,
numberOfVerticalLines: 100
}
}, )
}
效果展示
模型部分只用于学习,想要的同学们留言