174 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
		
		
			
		
	
	
			174 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
| 
								 | 
							
								<!DOCTYPE html>
							 | 
						||
| 
								 | 
							
								<html lang="en">
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								<head>
							 | 
						||
| 
								 | 
							
								  <meta charset="utf-8">
							 | 
						||
| 
								 | 
							
								  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
							 | 
						||
| 
								 | 
							
								  <meta name="viewport"
							 | 
						||
| 
								 | 
							
								    content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
							 | 
						||
| 
								 | 
							
								  <title>填挖方分析</title>
							 | 
						||
| 
								 | 
							
								  <script src="https://cesiumjs.org/releases/1.57/Build/Cesium/Cesium.js"></script>
							 | 
						||
| 
								 | 
							
								  <link href="https://cesiumjs.org/releases/1.57/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
							 | 
						||
| 
								 | 
							
								  <style>
							 | 
						||
| 
								 | 
							
								    html,
							 | 
						||
| 
								 | 
							
								    body,
							 | 
						||
| 
								 | 
							
								    #cesiumContainer {
							 | 
						||
| 
								 | 
							
								      width: 100%;
							 | 
						||
| 
								 | 
							
								      height: 100%;
							 | 
						||
| 
								 | 
							
								      margin: 0;
							 | 
						||
| 
								 | 
							
								      padding: 0;
							 | 
						||
| 
								 | 
							
								      overflow: hidden;
							 | 
						||
| 
								 | 
							
								      background-color: #000000;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  </style>
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								</head>
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								<body>
							 | 
						||
| 
								 | 
							
								  <div id="cesiumContainer">
							 | 
						||
| 
								 | 
							
								  </div>
							 | 
						||
| 
								 | 
							
								  <script>
							 | 
						||
| 
								 | 
							
								    Cesium.Ion.defaultAccessToken = 'your access token';
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    var terrainProvider = Cesium.createWorldTerrain({
							 | 
						||
| 
								 | 
							
								      requestWaterMask: true,
							 | 
						||
| 
								 | 
							
								      requestVertexNormals: true
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    var viewer = new Cesium.Viewer('cesiumContainer', {
							 | 
						||
| 
								 | 
							
								      imageryProvider: new Cesium.UrlTemplateImageryProvider({
							 | 
						||
| 
								 | 
							
								        url: 'http://www.google.cn/maps/vt?lyrs=s@716&x={x}&y={y}&z={z}'
							 | 
						||
| 
								 | 
							
								      }),
							 | 
						||
| 
								 | 
							
								      terrainProvider: terrainProvider
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    viewer.scene.globe.depthTestAgainstTerrain = true;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    var excavateHeight = 2300; // 开挖高度
							 | 
						||
| 
								 | 
							
								    var buryHeight = 6000; // 填埋高度
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    var scope = [
							 | 
						||
| 
								 | 
							
								      Cesium.Cartesian3.fromDegrees(99, 29),
							 | 
						||
| 
								 | 
							
								      Cesium.Cartesian3.fromDegrees(100, 29),
							 | 
						||
| 
								 | 
							
								      Cesium.Cartesian3.fromDegrees(100, 30),
							 | 
						||
| 
								 | 
							
								      Cesium.Cartesian3.fromDegrees(99, 30)
							 | 
						||
| 
								 | 
							
								    ];
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    // 显示施工区域
							 | 
						||
| 
								 | 
							
								    var entity = viewer.entities.add({
							 | 
						||
| 
								 | 
							
								      polygon: {
							 | 
						||
| 
								 | 
							
								        hierarchy: scope,
							 | 
						||
| 
								 | 
							
								        height: buryHeight,
							 | 
						||
| 
								 | 
							
								        extrudedHeight: excavateHeight,
							 | 
						||
| 
								 | 
							
								        material: Cesium.Color.RED.withAlpha(0.5),
							 | 
						||
| 
								 | 
							
								        outline: true,
							 | 
						||
| 
								 | 
							
								        closeTop: false
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    viewer.trackedEntity = entity;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    function calc() {
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								      //===============================计算 开挖/填埋 的 开挖量/填方量 的 核心思想就是 剖分 微积分==========================//
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								      // 设置剖分最小单元 0.01°
							 | 
						||
| 
								 | 
							
								      var subdivisionCell = 0.01;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								      // 所有的剖分矩形
							 | 
						||
| 
								 | 
							
								      var subRectangles = [];
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								      for (var i = 99; i <= 100; i = i + subdivisionCell) {
							 | 
						||
| 
								 | 
							
								        for (var j = 29; j <= 30; j = j + subdivisionCell) {
							 | 
						||
| 
								 | 
							
								          var subRectangle = new Cesium.Rectangle(
							 | 
						||
| 
								 | 
							
								            Cesium.Math.toRadians(i),
							 | 
						||
| 
								 | 
							
								            Cesium.Math.toRadians(j),
							 | 
						||
| 
								 | 
							
								            Cesium.Math.toRadians(i + subdivisionCell),
							 | 
						||
| 
								 | 
							
								            Cesium.Math.toRadians(j + subdivisionCell)
							 | 
						||
| 
								 | 
							
								          );
							 | 
						||
| 
								 | 
							
								          subRectangles.push(subRectangle);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								          // 可视化部分
							 | 
						||
| 
								 | 
							
								          // viewer.entities.add({
							 | 
						||
| 
								 | 
							
								          //   rectangle: {
							 | 
						||
| 
								 | 
							
								          //     coordinates: subRectangle,
							 | 
						||
| 
								 | 
							
								          //     material: Cesium.Color.fromRandom().withAlpha(0.5),
							 | 
						||
| 
								 | 
							
								          //     height: 6000,
							 | 
						||
| 
								 | 
							
								          //     extrudedHeight: 2300,
							 | 
						||
| 
								 | 
							
								          //   }
							 | 
						||
| 
								 | 
							
								          // });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								      // 计算每个矩形的中心点作为这个矩形的代表
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								      var subRectanglesCenterPoints = [];
							 | 
						||
| 
								 | 
							
								      subRectangles.forEach(subRectangle => {
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        var centerPoint = Cesium.Cartographic.fromRadians((subRectangle.west + subRectangle.east) / 2, (subRectangle
							 | 
						||
| 
								 | 
							
								          .north +
							 | 
						||
| 
								 | 
							
								          subRectangle.south) / 2);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        subRectanglesCenterPoints.push(centerPoint);
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // 可视化部分
							 | 
						||
| 
								 | 
							
								        // var position = centerPoint.clone();
							 | 
						||
| 
								 | 
							
								        // position.height = buryHeight;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // var position1 = centerPoint.clone();
							 | 
						||
| 
								 | 
							
								        // position1.height = excavateHeight;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // viewer.entities.add({
							 | 
						||
| 
								 | 
							
								        //   polyline: {
							 | 
						||
| 
								 | 
							
								        //     positions: [Cesium.Cartographic.toCartesian(position), Cesium.Cartographic.toCartesian(position1)],
							 | 
						||
| 
								 | 
							
								        //     material: Cesium.Color.fromRandom().withAlpha(0.5),
							 | 
						||
| 
								 | 
							
								        //     width: 5
							 | 
						||
| 
								 | 
							
								        //   }
							 | 
						||
| 
								 | 
							
								        // });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								      // 计算每个中心点到达地表的高度
							 | 
						||
| 
								 | 
							
								      // var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, subRectanglesCenterPoints);
							 | 
						||
| 
								 | 
							
								      var promise = Cesium.sampleTerrain(terrainProvider, 7, subRectanglesCenterPoints);
							 | 
						||
| 
								 | 
							
								      Cesium.when(promise, function (updatedPositions) {
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // 所有高度
							 | 
						||
| 
								 | 
							
								        var heights = [];
							 | 
						||
| 
								 | 
							
								        updatedPositions.forEach(point => {
							 | 
						||
| 
								 | 
							
								          heights.push(point.height);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // 开始计算土方
							 | 
						||
| 
								 | 
							
								        var excavateVolumes = 0; // 挖方
							 | 
						||
| 
								 | 
							
								        var buryVolumes = 0; // 填埋
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        // 1.计算每个矩形的长、宽
							 | 
						||
| 
								 | 
							
								        for (var i = 0; i < subRectangles.length; i++) {
							 | 
						||
| 
								 | 
							
								          var subRectangle = subRectangles[i];
							 | 
						||
| 
								 | 
							
								          var leftBottom = Cesium.Cartesian3.fromRadians(subRectangle.west, subRectangle.south);
							 | 
						||
| 
								 | 
							
								          var leftTop = Cesium.Cartesian3.fromRadians(subRectangle.west, subRectangle.north);
							 | 
						||
| 
								 | 
							
								          var rightBottom = Cesium.Cartesian3.fromRadians(subRectangle.east, subRectangle.south);
							 | 
						||
| 
								 | 
							
								          var height = Cesium.Cartesian3.distance(leftBottom, leftTop); // 宽
							 | 
						||
| 
								 | 
							
								          var width = Cesium.Cartesian3.distance(leftBottom, rightBottom); // 长
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								          // 挖方
							 | 
						||
| 
								 | 
							
								          if (heights[i] > excavateHeight) { // 如果地形高度大于开挖高度才需要开挖
							 | 
						||
| 
								 | 
							
								            var excavateVolume = width * height * (heights[i] - excavateHeight);
							 | 
						||
| 
								 | 
							
								            excavateVolumes += excavateVolume;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								          // 填埋
							 | 
						||
| 
								 | 
							
								          if (heights[i] < buryHeight) { // 如果地形高度小于填埋高度才需要填埋
							 | 
						||
| 
								 | 
							
								            var buryVolume = width * height * (buryHeight - heights[i]);
							 | 
						||
| 
								 | 
							
								            buryVolumes += buryVolume;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								        console.log("挖方:" + excavateVolumes + "立方米(m³)");
							 | 
						||
| 
								 | 
							
								        console.log("填埋:" + buryVolumes + "立方米(m³)");
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  </script>
							 | 
						||
| 
								 | 
							
								</body>
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								</html>
							 |