meface/docs/.vuepress/components/Info.vue

209 lines
7.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="info-container">
<h3>{{name}}</h3>
<div id="info-viewer">
</div>
</div>
</template>
<script>
export default {
data(){
return {
name:"Info测试"
}
},
methods:{
initCesium(){
let box = document.getElementsByClassName("content__default")[0];
box.style.maxWidth = "100%";
box.style.paddingTop = 0;
let Cesium = this.$cesium;
window.CESIUM_BASE_URL = '/cesium'
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
var viewer = new Cesium.Viewer("info-viewer", {
geocoder:false,//位置查找
homeButton:false,//视图返回初始位置
sceneModePicker:false,//视角选择器
baseLayerPicker:false,//底图选择器
navigationHelpButton:false,//导航帮助按钮
animation:false,//动画控制器
creditContainer:document.createElement("div"),//版权显示
timeline:false,//时间线
fullscreenButton:true,//全屏控件
vrButton:false,
skyBox:false,
infoBox:false,
imageryProvider:new Cesium.UrlTemplateImageryProvider({
url: "https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
minimumLevel: 3,
maximumLevel: 18
})
});
var imageryLayers = viewer.scene.imageryLayers;
// //清除影像图层集合中的图层
// imageryLayers.removeAll();
// // 添加 ArcGIS 影像地图服务
// const esriImagery = new Cesium.ArcGisMapServerImageryProvider({
// url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer",
// // url: "http://server.arcgisonline.com/arcgis/rest/services/Specialty/DeLorme_World_Base_Map/MapServer",
// });
// imageryLayers.addImageryProvider(esriImagery);
//添加OSM的建筑
const tileset = viewer.scene.primitives.add(
new Cesium.Cesium3DTileset({
url: Cesium.IonResource.fromAssetId(96188),
})
);
// Add OSM Building tileset
let osmBuildingsTileset = Cesium.createOsmBuildings();
//设置条件渲染
osmBuildingsTileset.style = new Cesium.Cesium3DTileStyle({
defines: {
mh: "${feature['cesium#estimatedHeight']}",
},
color: {
conditions: [
// ["(${mh} >= 100.0)", "color('blue')"],
// ["(${mh} >= 1.0)", "color('red')"],
["${mh} >= 300", "rgba(45, 0, 75, 0.5)"],
["${mh} >= 200", "rgb(102, 71, 151)"],
["${mh} >= 100", "rgb(170, 162, 204)"],
["${mh} >= 50", "rgb(224, 226, 238)"],
["${mh} >= 25", "rgb(252, 230, 200)"],
["${mh} >= 10", "rgb(248, 176, 87)"],
["${mh} >= 5", "rgb(198, 106, 11)"],
["true", "rgb(127, 59, 8)"],
// ["${name} === '周大福金融中心(广州东塔)'","color('red')"],
// ["${name} === '周大福金融中心(广州东塔)'", "color('red')"],
],
},
// "show" : "${Height} > 50.0"
});
viewer.scene.primitives.add(osmBuildingsTileset);
// 创建一个用于存储标注的数据源
const dataSource = new Cesium.CustomDataSource("poiIconLabel");
viewer.dataSources.add(dataSource);
viewer.camera.flyTo({
destination: new Cesium.Cartesian3(
-2325771.0288233184,
5392181.511762224,
2484480.395134067
),
orientation: {
heading: 6.0399326,
pitch: -0.30503,
roll: 6.2825747,
},
});
this._viewer = viewer;
// this.dataSource = dataSource;
this.initEvent();
},
initEvent(){
let Cesium = this.$cesium;
let viewer = this._viewer;
//添加点击事件
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction( (movement) =>{
viewer.selectedEntity = undefined;
const pickedBuilding = viewer.scene.pick(movement.position);
if (pickedBuilding) {
const lat = pickedBuilding.getProperty("cesium#latitude");
const lon = pickedBuilding.getProperty("cesium#longitude");
const height = pickedBuilding.getProperty("cesium#estimatedHeight");
const name = pickedBuilding.getProperty("name");
const color = Cesium.Color.SNOW;
const url = "/images/local.png";
this.poiIconLabelAdd(lon, lat, height, name, color, url);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
},
/**
* 用于添加poi的icon和label的函数
* @param {*} lon :经度
* @param {*} lat :纬度
* @param {*} name :标签内容
* @param {*} color :底部圆和横线的颜色
* @param {*} url icon地址
*/
poiIconLabelAdd(lon, lat, height, name, color, url) {
let Cesium = this.$cesium;
// 获取标注数据源
const labelDataSource = this._viewer.dataSources.getByName("poiIconLabel")[0];
labelDataSource.entities.removeAll();
//添加图标和标注
labelDataSource.entities.add({
name: name,
position: Cesium.Cartesian3.fromDegrees(lon, lat, height + 300),
// 图标
billboard: {
// image: new Cesium.Resource.fetchImage(url),
// image:require(url),
image:url,
width: 50,
height: 50,
},
label: {
//文字标签
text: name,
font: "20px sans-serif",
style: Cesium.LabelStyle.FILL,
// 对齐方式(水平和竖直)
horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
verticalOrigin: Cesium.VerticalOrigin.CENTER,
pixelOffset: new Cesium.Cartesian2(20, -2),
showBackground: true,
backgroundColor: new Cesium.Color.fromBytes(0, 70, 24),
},
});
// 先画线后画点,防止线压盖点
let linePositions = [];
linePositions.push(new Cesium.Cartesian3.fromDegrees(lon, lat, height));
linePositions.push(
new Cesium.Cartesian3.fromDegrees(lon, lat, height + 300)
);
labelDataSource.entities.add({
polyline: {
positions: linePositions,
width: 1.5,
material: color,
},
});
// 画点
labelDataSource.entities.add({
// 给初始点位设置一定的离地高度,否者会被压盖
position: Cesium.Cartesian3.fromDegrees(lon, lat, height),
point: {
color: color,
pixelSize: 15,
},
});
},
},
mounted(){
this.initCesium()
}
}
</script>
<style lang='stylus' scoped>
#info-viewer{
height: 80vh;
width: 100%
}
</style>