function delete_3dTileTerrain(depth) { if(depth) { ws3d.viewer.map.terrain.samplingLevelMax = 13; let cellSize = 10; let angle = Main_angle; if(depth < 0) { // 성토일경우 각도는 음수로 변경 angle = angle * -1; } var jijuk_Json = JSON.parse(jijuk_coordinates); for(let idx = 0; idx < jijuk_Json.length; idx++) { var _Polygons = jijuk_Json[idx]; for(let ipoy = 0; ipoy < _Polygons.length; ipoy++) { var _coordinates = _Polygons[ipoy]; const ar = new Array(); for(let i = 0; i < _coordinates.length; i++) { const pointCoordinate = _coordinates[i]; const ogcPoint = new ws3d.common.OgcPoint(pointCoordinate[0],pointCoordinate[1],10); ar.push(ogcPoint); } const Polygon = new ws3d.common.OgcPolygon(new ws3d.common.OgcLinearRing(ar)); drawFailureEnvelopeByEawkRest(cellSize, depth, angle, Polygon); } } } } function drawFailureEnvelopeByEawkRest(cellSize, depth, angle, polygon){ if(depth) { if (polygon) { if(_isCounterClockWisePolygon(polygon)){ polygon = _getReversedPolygon2(polygon); } failureEnvelope.material = "../image/underground.jpg"; failureEnvelope._targetAngle = angle * Math.PI / 180; // 경사각 적용 (디그리->라디안) failureEnvelope._targetAngleTangent = Math.tan(failureEnvelope._targetAngle); // 파괴포락선 생성후 콜백으로 토공량 계산 시작 failureEnvelope.drawEnvelopeFrom2DPolygon(polygon, depth, function() { // 1. 선택한 굴착지점 점고법 계산 (경사면을 고려하지 않은 토공량) var _points = polygon.getExteriorRing().positionArray; // 굴착 영역(폴리곤) 버텍스 추출 (x,y) var polygonPointsArray = []; for(var i = 0; i < _points.length; i = i+=3) { var point = []; point.push(_points[i]); point.push(_points[i+1]); polygonPointsArray.push(point); } var diggGridData = createGrid(polygonPointsArray, cellSize); // 굴착 영역 그리드 데이터 생성 // 그리드의 고도값 샘플링 Promise.resolve( ws3d.viewer.map.terrain.sampleTerrainByPointArray( diggGridData.pointGridCoordinates_ogcPoint ) ).then(function (terrainSamplePositions) { // 점고법 계산 수행 (경사면을 고려하지 않은 토공량) var diggTerrainVolume = calTerrainVolume(diggGridData, terrainSamplePositions, depth, cellSize, null); // 2. 굴착된 지형의 고도값을 샘플링하여 경사면에 대한 토공량을 계산 var _slopePolygonPoints = failureEnvelope._polygonTopObject.srcGeometry.getExteriorRing().positionArray; // 경사를 포함한 굴착 영역(폴리곤) 버텍스 추출 (x,y) var slopePolygonPointsArray = []; for(var i = 0; i < _slopePolygonPoints.length; i = i+=3) { var point = []; point.push(_slopePolygonPoints[i]); point.push(_slopePolygonPoints[i+1]); slopePolygonPointsArray.push(point); } var slopeGridData = createGrid(slopePolygonPointsArray, cellSize); // 굴착 영역 그리드 데이터 생성 var cartesians = []; // 경사 굴착 표면 그리드 경위도 좌표를 Cartesian으로 변경 for (var i = 0; i < slopeGridData.terrainSamplePositions.length; i++) { var position_cartesian = ws3d.common.Cartesian3.fromRadians(slopeGridData.terrainSamplePositions[i].longitude, slopeGridData.terrainSamplePositions[i].latitude); cartesians.push(position_cartesian); } // 상단 표면 절개 (굴착된 지형에 고도값 샘플링을 위해) clippingPolygon(failureEnvelope._polygonTopObject.srcGeometry); }); }); } } } // 폴리곤으로 표면 절개 function clippingPolygon(polygonGeometry) { if(!_isCounterClockWisePolygon(polygonGeometry)){ polygonGeometry = _getReversedPolygon2(polygonGeometry); } const points = []; // Cartesian3 Array const positionArray = polygonGeometry.getExteriorRing().positionArray; // Cartesian 좌표로 변환 for(let i = 0; i < positionArray.length; i=i+3) { points.push( ws3d.common.Cartesian3.fromDegrees(positionArray[i], positionArray[i+1], positionArray[i+2]) ) } if(points[0].x === points[points.length-1].x && points[0].y === points[points.length-1].y) { points.pop(); // 닫힌 폴리곤 x } const pointsLength = points.length; const clippingPlanes = []; for (let i = 0; i < pointsLength; ++i) { const nextIndex = (i + 1) % pointsLength; if(points[i].x === points[nextIndex].x && points[i].y === points[nextIndex].y) { continue; } let midpoint = ws3d.common.Cartesian3.add( points[i], points[nextIndex], new ws3d.common.Cartesian3() ); midpoint = ws3d.common.Cartesian3.multiplyByScalar( midpoint, 0.5, midpoint ); const up = ws3d.common.Cartesian3.normalize( midpoint, new ws3d.common.Cartesian3() ); let right = ws3d.common.Cartesian3.subtract( points[nextIndex], midpoint, new ws3d.common.Cartesian3() ); right = ws3d.common.Cartesian3.normalize(right, right); let normal = ws3d.common.Cartesian3.cross( right, up, new ws3d.common.Cartesian3() ); normal = ws3d.common.Cartesian3.normalize(normal, normal); const originCenteredPlane = new ws3d.common.Plane(normal, 0.0); const distance = ws3d.common.Plane.getPointDistance( originCenteredPlane, midpoint ); clippingPlanes.push(new ws3d.common.ClippingPlane(normal, distance)); } if(ws3d.viewer.scene.globe.clippingPlanes != undefined) { //ws3d.viewer.scene.globe.clippingPlanes.removeAll(); // 기존 지면 절개 초기화 for(let i = 0; i < clippingPlanes.length; i++) { ws3d.viewer.scene.globe.clippingPlanes.add(clippingPlanes[i]); } ws3d.viewer.scene.globe.clippingPlanes.enabled = true; }else{ ws3d.viewer.scene.globe.clippingPlanes = new ws3d.common.ClippingPlaneCollection({ planes: clippingPlanes, edgeWidth: 1.0, edgeColor: ws3d.common.Color.WHITE, enabled: true, }); } ws3d.viewer.scene.globe.backFaceCulling = true; ws3d.viewer.scene.globe.showSkirts = true; ws3d.viewer.scene.render(); } |