278 lines
12 KiB
HTML
278 lines
12 KiB
HTML
|
|
<!DOCTYPE html>
|
|||
|
|
<html lang="en">
|
|||
|
|
<head>
|
|||
|
|
<!-- Use correct character set. -->
|
|||
|
|
<meta charset="utf-8" />
|
|||
|
|
<!-- Tell IE to use the latest, best version. -->
|
|||
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|||
|
|
<!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
|
|||
|
|
<meta
|
|||
|
|
name="viewport"
|
|||
|
|
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
|
|||
|
|
/>
|
|||
|
|
<title>Learning Cesium!</title>
|
|||
|
|
<!-- 引入样式 -->
|
|||
|
|
<link rel="stylesheet" href="./js/elementui/index.css" />
|
|||
|
|
<!-- import Vue before Element -->
|
|||
|
|
<script src="./js/vue2710.js"></script>
|
|||
|
|
<!-- import JavaScript -->
|
|||
|
|
<script src="./js/elementui/index.js"></script>
|
|||
|
|
|
|||
|
|
<script src="./Build/CesiumUnminified/Cesium.js"></script>
|
|||
|
|
<script src="./js/utils/EllipsoidFadeMaterialProperty.js"></script>
|
|||
|
|
<script src="./js/PolylineTrailMaterial.js"></script>
|
|||
|
|
<style>
|
|||
|
|
@import url(./Build/Cesium/Widgets/widgets.css);
|
|||
|
|
html,
|
|||
|
|
body,
|
|||
|
|
#app,#cesiumContainer {
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
margin: 0;
|
|||
|
|
padding: 0;
|
|||
|
|
overflow: hidden;
|
|||
|
|
background-image: url("/images/53bg.png");
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
</head>
|
|||
|
|
<body>
|
|||
|
|
<div id="app">
|
|||
|
|
<div id="cesiumContainer"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<script type="module">
|
|||
|
|
|
|||
|
|
import viewUtil from "./js/utils/viewUtil.js";
|
|||
|
|
import * as xiXianApi from "./js/api/xixian.js";
|
|||
|
|
import DynamicRange from "./js/utils/DynamicRange.js";
|
|||
|
|
|
|||
|
|
Cesium.Ion.defaultAccessToken =
|
|||
|
|
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
|
|||
|
|
|
|||
|
|
new Vue({
|
|||
|
|
el: "#app",
|
|||
|
|
data: {
|
|||
|
|
|
|||
|
|
},
|
|||
|
|
methods:{
|
|||
|
|
initViewer(){
|
|||
|
|
var viewer = new Cesium.Viewer("cesiumContainer", {
|
|||
|
|
geocoder: false, //位置查找
|
|||
|
|
homeButton: false, //视图返回初始位置
|
|||
|
|
sceneModePicker: true, //视角选择器
|
|||
|
|
// baseLayerPicker:false,//底图选择器
|
|||
|
|
navigationHelpButton: false, //导航帮助按钮
|
|||
|
|
animation: false, //动画控制器
|
|||
|
|
// creditContainer:"credit",//版权显示
|
|||
|
|
timeline: false, //时间线
|
|||
|
|
fullscreenButton: false, //全屏控件
|
|||
|
|
vrButton: false,
|
|||
|
|
infoBox:false,
|
|||
|
|
selectionIndicator:false,
|
|||
|
|
// requestRenderMode: true,
|
|||
|
|
// terrainProvider: Cesium.createWorldTerrain({
|
|||
|
|
// requestVertexNormal: true, //添加地形光照
|
|||
|
|
// requestWaterMask: true, //添加水面波浪效果
|
|||
|
|
// }),
|
|||
|
|
skyBx:false,//去除天空盒 Front Back Right Left Up Down
|
|||
|
|
orderIndependentTranslucency: false,//orderIndependentTranslucency需要设置为true,才能去掉地球表面的大气效果的黑圈问题
|
|||
|
|
contextOptions: {
|
|||
|
|
webgl: {
|
|||
|
|
alpha: true,
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
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);
|
|||
|
|
var ulp = new Cesium.UrlTemplateImageryProvider({
|
|||
|
|
// url : "GlobalTMS/satellite/{z}/{x}/{y}.jpg",
|
|||
|
|
url:"http://localhost:8078/tilesz/{z}/{x}/{y}.png",
|
|||
|
|
// url:"http://localhost:8078/newdata/xixian/arcgis_tiles/{z}/{x}/{y}.png",
|
|||
|
|
fileExtension : "png",
|
|||
|
|
rectangle:Cesium.Rectangle.fromDegrees(114.569511, 32.135612, 115.129434, 32.659965)//108.3624696908001539,29.0326242875031930 : 116.1299634847461846,33.2775419731286846
|
|||
|
|
})
|
|||
|
|
var gaode = imageryLayers.addImageryProvider(ulp);
|
|||
|
|
|
|||
|
|
// 隐藏大气
|
|||
|
|
viewer.scene.skyAtmosphere.show=false;
|
|||
|
|
// 允许相机可以进入地下
|
|||
|
|
viewer.scene.screenSpaceCameraController.enableCollisionDetection = true; //true 禁止 false 允许
|
|||
|
|
//用于夸大地形的标量。默认为1.0(不夸张)。值2.0将地形缩放 2 倍。的值0.0使地形完全平坦。请注意,地形夸大不会修改任何其他图元,因为它们是相对于椭圆体定位的。
|
|||
|
|
viewer.scene.globe.terrainExaggeration=4;
|
|||
|
|
//夸大地形的高度。默认为0.0(相对于椭球表面缩放)。高于此高度的地形将向上缩放,低于此高度的地形将向下缩放。请注意,地形夸大不会修改任何其他图元,因为它们是相对于椭圆体定位的。如果Globe#terrainExaggeration是1.0这个值将没有效果。
|
|||
|
|
viewer.scene.globe.terrainExaggerationRelativeHeight=1.0;
|
|||
|
|
|
|||
|
|
// 开启地形检测后,会计算其他地理要素和地形之间的遮挡关系。未开启时,将会出现场景变化时,地物位置显示不正确。
|
|||
|
|
viewer.scene.globe.depthTestAgainstTerrain = true;
|
|||
|
|
// viewer.scene.globe.fillHighlightColor = Cesium.Color.fromBytes(255, 255, 0).withAlpha(0.7)
|
|||
|
|
// Cesium.Color.TRANSPARENT
|
|||
|
|
|
|||
|
|
// 设置椭球透明
|
|||
|
|
viewer.scene.globe.showGroundAtmosphere = false;
|
|||
|
|
viewer.scene.globe.baseColor = Cesium.Color.TRANSPARENT; //Cesium.Color.fromCssColorString("#032b4c"); // 设置没有瓦片时,椭球的颜色
|
|||
|
|
viewer.scene.globe.translucency.enabled = true;
|
|||
|
|
viewer.scene.globe.undergroundColor = undefined;//Cesium.Color.WHILE;
|
|||
|
|
|
|||
|
|
viewer.scene.skyBox.show = false //关闭天空盒,否则会显示天空颜色
|
|||
|
|
viewer.scene.backgroundColor = new Cesium.Color(0.0, 0.0, 0.0, 0.0);//其他颜色会影响最终效果
|
|||
|
|
|
|||
|
|
// 限制相机高度
|
|||
|
|
viewer.scene.screenSpaceCameraController.maximumZoomDistance =200000;
|
|||
|
|
viewer.scene.screenSpaceCameraController.minimumZoomDistance = 10;
|
|||
|
|
|
|||
|
|
//抗锯齿
|
|||
|
|
viewer.scene.fxaa = true;
|
|||
|
|
viewer.scene.postProcessStages.fxaa.enabled = true;
|
|||
|
|
//清除月亮太阳
|
|||
|
|
viewer.scene.moon.show = false
|
|||
|
|
viewer.scene.sun.show = false
|
|||
|
|
|
|||
|
|
viewer.camera.setView({
|
|||
|
|
destination: new Cesium.Cartesian3(
|
|||
|
|
-2310077.324570175, 4994509.116378295, 3387357.260308099
|
|||
|
|
),
|
|||
|
|
orientation: {
|
|||
|
|
heading: 0.030200504415429208,
|
|||
|
|
pitch: -0.9328766727816555,
|
|||
|
|
roll: 0.00001552501464363587,
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
viewer.scene.globe.depthTestAgainstTerrain = true;
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 创建自定义数据源
|
|||
|
|
this.wallDataSource = new Cesium.CustomDataSource("walldata");
|
|||
|
|
viewer.dataSources.add(this.wallDataSource);
|
|||
|
|
|
|||
|
|
// 创建primitive集合,存储水系图元对象
|
|||
|
|
this.riverPrimitives = viewer.scene.primitives.add(
|
|||
|
|
new Cesium.PrimitiveCollection()
|
|||
|
|
);
|
|||
|
|
// 创建primitive集合,存储水系图元对象
|
|||
|
|
this.tdlyPrimitives = viewer.scene.primitives.add(
|
|||
|
|
new Cesium.PrimitiveCollection()
|
|||
|
|
);
|
|||
|
|
// 创建土地利用的自定义数据源
|
|||
|
|
this.tdlyDataSource = new Cesium.CustomDataSource("tdlydata");
|
|||
|
|
viewer.dataSources.add(this.tdlyDataSource);
|
|||
|
|
|
|||
|
|
this.viewer = viewer;
|
|||
|
|
this.drawShp();
|
|||
|
|
this.initEvent();
|
|||
|
|
},
|
|||
|
|
async drawShp(){
|
|||
|
|
// 添加底座
|
|||
|
|
const data = await xiXianApi.getXiXian();
|
|||
|
|
data.features.forEach(feature=>{
|
|||
|
|
viewUtil.addWallByFeature(this.wallDataSource,feature,"#5884dd",-2000,"0")
|
|||
|
|
})
|
|||
|
|
// 添加动态路网
|
|||
|
|
const wayData = await xiXianApi.getOsmWay();
|
|||
|
|
wayData.features.forEach(feature=>{
|
|||
|
|
if(feature.geometry.type == "MultiLineString"){
|
|||
|
|
let coords = feature.geometry.coordinates[0];
|
|||
|
|
this.addDynamicLine(coords);
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 添加动态水面
|
|||
|
|
const riverData = await xiXianApi.getRiver();
|
|||
|
|
riverData.features.forEach(feature=>{
|
|||
|
|
viewUtil.addWaterFeature(this.riverPrimitives,feature);
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
this.addTdlyPolygon();
|
|||
|
|
},
|
|||
|
|
async addTdlyPolygon(){
|
|||
|
|
const result = await fetch('http://127.0.0.1:8088/geoserver/allRegion/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=allRegion:wlccyd&maxFeatures=9999&outputFormat=application/json&srsname=EPSG:4326').then(res=>res.json());
|
|||
|
|
result.features.forEach(feature=>{
|
|||
|
|
viewUtil.addPolygonPrimitiveByFeature(this.tdlyPrimitives,feature,'#ff0000')
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
addDynamicLine(coords){
|
|||
|
|
const {viewer,wallDataSource} = this;
|
|||
|
|
const glowingLine = viewer.entities.add({
|
|||
|
|
name: "Glowing blue line on the surface",
|
|||
|
|
polyline: {
|
|||
|
|
positions: Cesium.Cartesian3.fromDegreesArray(coords.flat(2)),
|
|||
|
|
width: 1,
|
|||
|
|
// material: new Cesium.PolylineGlowMaterialProperty({
|
|||
|
|
// glowPower: 0.2,
|
|||
|
|
// taperPower: 0.5,
|
|||
|
|
// color: Cesium.Color.CORNFLOWERBLUE,
|
|||
|
|
// }),
|
|||
|
|
material: new PolylineTrailMaterial({
|
|||
|
|
color: Cesium.Color.YELLOW,
|
|||
|
|
duration:5000
|
|||
|
|
}),
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
initEvent(){
|
|||
|
|
const {viewer,wallDataSource} = this;
|
|||
|
|
// 监听地图缩放控制实体的显示,另一种方案是使用 DistanceDisplayCondition 参数配置
|
|||
|
|
viewer.scene.camera.moveEnd.addEventListener(()=>{
|
|||
|
|
//获取当前相机高度
|
|||
|
|
let height = Math.ceil(viewer.camera.positionCartographic.height);
|
|||
|
|
// console.log('height:' + height);
|
|||
|
|
// 获取相机位置的大小
|
|||
|
|
// var currentMagnitude = viewer.camera.getMagnitude();
|
|||
|
|
// console.log('currentMagnitude:' + currentMagnitude);
|
|||
|
|
|
|||
|
|
if(height>30000){
|
|||
|
|
wallDataSource.show = true;
|
|||
|
|
}else{
|
|||
|
|
wallDataSource.show = false;
|
|||
|
|
}
|
|||
|
|
// this.popup&&console.log(this.popup.level)
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
mounted(){
|
|||
|
|
this.initViewer();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//拦截清除
|
|||
|
|
// const dummySend = XMLHttpRequest.prototype.send;
|
|||
|
|
// XMLHttpRequest.prototype.send = function () {
|
|||
|
|
// const _onreadystatechange = this.onreadystatechange;
|
|||
|
|
|
|||
|
|
// this.onreadystatechange = function () {
|
|||
|
|
// if (this.readyState === 4) {
|
|||
|
|
// if (this.status === 200 || this.status === 1223) {
|
|||
|
|
// // as response is read-only and configurable, make it writable
|
|||
|
|
// // Object.defineProperty(this, 'response', {writable: true});
|
|||
|
|
// // this.response = modifyResponse(this.response);
|
|||
|
|
// }else{
|
|||
|
|
// // 错误处理
|
|||
|
|
// // console.log("出错了 ", this.statusText);
|
|||
|
|
// console.clear();
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// if (_onreadystatechange) {
|
|||
|
|
// _onreadystatechange.apply(this, arguments);
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// // this.onerror= function(e) {
|
|||
|
|
// // // console.clear();
|
|||
|
|
// // };
|
|||
|
|
// dummySend.apply(this, arguments);
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
|
|||
|
|
</script>
|
|||
|
|
</body>
|
|||
|
|
</html>
|